머신러닝

머신러닝(6) 데이터 전처리 종합

개발연습자1 2022. 12. 1. 13:08

지난 시간에 이어서 데이터로 머신러닝을 만들어 보자 

 

머신러닝도 지난시간에 언급했듯 여러가지 방법이 존재하는데 이번 시간엔 LinearRegression을 모델을 세워 예측해보겠다.

 

조금 수학적인 얘기로 LinearRegression 모델은 직선방정식으로 결과값을 예측하는 방법으로  

 

y=ax+b

 

위에 식에서 a는 기울기 또는 계수 b는 y절편이 되는데 이 두개의 값으로 그래프에 선을 그릴수 있으며 그래프 상에 점으로 나타나는 분포와 거의 일치 할때까지 컴퓨터가 a,b값을 찾는것이 이 LinearRegression이라고 한다.

 

이제 한번 절차대로 해보자

 

우선 데이터를 불러오자

#데이터를 폴더에서 불러온다.

df=pd.read_csv('../data/Data.csv')
df

 

 

머신러닝에 쓸 함수들을 호출 해주자

# Data Preprocessing Template

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

 

 

nan값을 확인하고 있으면 그 행을 제거해준다.

df.isna()
df=df.dropna()

 

 

 

 

지도 학습을 하기 위해선 데이터를 입력 값 X와 결과 값 y로 분리해야 한다.

 

입력값은 입력할값을 결과는 결과를 도출할 데이터로 선정한다.

 

따라서 X는 Country,Age,Salary 컬럼의 데이터만 y는 Purchased 컬럼만 쓴다.

X = df.loc[ : , 'Country':'Salary' ]

y = df['Purchased']

X
y

 

 

 

분리된 데이터에서 카테고리컬 데이터를 확인한다.

# 컨트리 컬럼은, 3개의 문자열로 되어있는 카테고리컬 데이터이다.
# 따라서, 어떤 데이터로 되어있는지 확인하되,
# 정렬해서 확인한다.

sorted(X['Country'].unique())

>>> ['France', 'Germany', 'Spain']

 

y는 카테고리컬 데이터지만 결과 데이터이기 때문에 확인하지 않는다. (3개 이상일경우는 확인필수)

 

 

카테고리컬 데이터가 3개이상이고 문자열일땐 One-Hot Encoding 으로 숫자로 바꿔 준다.

# 원핫 인코딩으로 바꾸고 싶은 컬럼의 인덱스를 써준다.
#[0]이라고 써준다. 
#만약에 원핫인코딩으로 바꾸고 싶은 컬럼이 여러개이면,
#리스트안에 인덱스만 써주면 된다. 예) [1,4,5]

#컬럼 인코딩 함수를 호출
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
from sklearn.compose import ColumnTransformer

#함수 이름 변경 저장
ct=ColumnTransformer([('encoder',OneHotEncoder(),[2])],remainder = 'passthrough')

#X데이터를 숫자 변환하고 저장
X = ct.fit_transform(X)

#remainder passthrough 원핫인코딩이 아닌 컬럼들은 냅둬라!
#원핫인코딩 한 컬럼은 맨앞으로 빠진다.

X
>>> array([[1.0e+00, 0.0e+00, 0.0e+00, 4.4e+01, 7.2e+04],
           [0.0e+00, 0.0e+00, 1.0e+00, 2.7e+01, 4.8e+04],
           [0.0e+00, 1.0e+00, 0.0e+00, 3.0e+01, 5.4e+04],
           [0.0e+00, 0.0e+00, 1.0e+00, 3.8e+01, 6.1e+04],
           [1.0e+00, 0.0e+00, 0.0e+00, 3.5e+01, 5.8e+04],
           [1.0e+00, 0.0e+00, 0.0e+00, 4.8e+01, 7.9e+04],
           [0.0e+00, 1.0e+00, 0.0e+00, 5.0e+01, 8.3e+04],
           [1.0e+00, 0.0e+00, 0.0e+00, 3.7e+01, 6.7e+04]])

 

y데이터는 카테고리컬 데이터가 2개이므로 레이블 인코딩으로 변환한다.

#일단 알파벳(글자)순서로 정렬
sorted(y.unique())
>>> ['No', 'Yes']

#레이블 인코딩 함수를 encoder_y로 저장
encoder_y = LabelEncoder()

#인코딩 후 y데이터로 저장
y=encoder_y.fit_transform(y)
y
>>>> array([0, 1, 0, 0, 1, 1, 0, 1])

 

 

 

이제 피처 스케일링을 진행해야 한다. X데이터가 모두 같은 범위에 수치가 아니기 때문이다.

#피처 스케일 함수 호출
from sklearn.preprocessing import MinMaxScaler

Normalizing (정규화)
#X 용 피쳐 스케일링

#m_scaler로 저장
m_scaler_x =MinMaxScaler()

#정규화하고 다시 X데이터에 저장
X = m_scaler_x.fit_transform(X)
X

>>> array([[1.        , 0.        , 0.        , 0.73913043, 0.68571429],
           [0.        , 0.        , 1.        , 0.        , 0.        ],
           [0.        , 1.        , 0.        , 0.13043478, 0.17142857],
           [0.        , 0.        , 1.        , 0.47826087, 0.37142857],
           [1.        , 0.        , 0.        , 0.34782609, 0.28571429],
           [1.        , 0.        , 0.        , 0.91304348, 0.88571429],
           [0.        , 1.        , 0.        , 1.        , 1.        ],
           [1.        , 0.        , 0.        , 0.43478261, 0.54285714]])

 

y데이터는 0과 1사이이기 때문에 인코딩은 따로 안해줘도 된다.(0,1이 아닐경우는 표준화나 정규화 해준다)

 

 

마지막으로 각각의 데이터를 train용과 test용으로 각각을 다시 나눈다.

 

# 나누기용 함수 호출
from sklearn.model_selection import train_test_split

#나눠서 4개의 데이터에 각각 저장(순서 매우 중요) 
X_train, X_test, y_train, y_test=train_test_split(X,y,test_size=0.2,random_state= 3)

 

이제 데이터 전처리 작업은 끝났고 바로 다음에 데이터를 인공지능을 돌린다.

반응형