머신러닝(6) 데이터 전처리 종합
지난 시간에 이어서 데이터로 머신러닝을 만들어 보자
머신러닝도 지난시간에 언급했듯 여러가지 방법이 존재하는데 이번 시간엔 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)
이제 데이터 전처리 작업은 끝났고 바로 다음에 데이터를 인공지능을 돌린다.