머신러닝 모델을 훈련시키기 전에 데이터를 전처리해야한다.

 

데이터 전처리는 아래와 같은 과정으로 이루어지며, 이미 잘 만들어진 라이브러리들이 많아 그것을 이용하면 된다.

 

출처 - 머신러닝의 모든 것 (유데미)

위 데이터를 머신러닝 훈련에 적합하게 데이터 전처리 하는 법을 알아보자.

 

<목차>

1. 라이브러리 임포트

2. 데이터세트 임포트

3. 누락된 데이터 처리

4. 범주형 데이터 인코딩

   4-1. 독립 변수 인코딩 

   4-2. 종속 변수 인코딩

5. 데이터세트를 훈련세트와 테스트세트로 분할

6. 특징 스케일링

 

데이터 전처리

   i.  라이브러리 임포트 

  데이터 전처리를 위한 라이브러리는 numpy, matplotlib, pandas 가 있다.

import numpy as np
import matplotlib as mlt
import pandas as pd

 뒤의 as~ 부분의 예로 numpy 를 np라는 별명으로 사용할 것이라는 뜻이다.

 

 

   ii.  데이터셋 불러오기

  판다스에 데이터셋을 불러올 수 있는 메소드가 있다. 이를 이용하여 데이터셋을 불러올 수 있다.

dataset = pd.read_csv('Data.csv')
x = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

 x 는 특징행렬로 마지막의 예측열을 제외한 모든 데이터값을 가진다.

 y 는 종속변수 벡터인데 우리가 할 예측결과를 저장하는 변수이다.

 x 와 y 두개의 Entity를 선언하는 이유는 모델들을 만들 때 사용하는 클래스들이 데이터 세트 전체를 원하지 않고, 두 개의

  분리된 Entitiy를 원하기 때문이다.

 

 

 iii. 누락된 데이터 처리하기

 누락된 데이터는 모델을 훈련시킬 때, 오류가 생길 수 있으므로 반드시 처리해야한다.

처리하는 방법으로는 누락된 데이터 집합의 평균또는 중간값을 구해 누락된 데이터를 처리해주면 된다.

어떠한 경우에는 그냥 누락된 데이터를 무시해버린다. 

누락된 데이터를 처리할 때 사이킷런이라는 과학 라이브러리를 사용할 것이다.

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values = np.nan, starategy = 'mean')
imputer.fit(x[:, 1:3])
x[:, 1:3] = imputer.transform(x[:,1:3])

line 1 : 사이킷런의 impute 모듈에 접근해, SimpleImputer라는 클래스를 임포트한다.

line 2 : SimpleImputer의 인스턴스 imputer를 생성하고, 누락된 값에 대해 평균을 적용하는 객체를 생성한다.

line 3 : SimpleImputer 클래스의 fit 메소드가 객체 imputer와 특징행렬(x)를 연결해준다.

            fit 함수가 결측치를 보고 평균값을 계산한다.

line 4 : transform 메소드는 누락된 값을 해당 열의 평균값으로 대체해준다.

 

 

 iv. 범주형 데이터를 인코딩하기

  해당 열의 데이터 값이 France, Germany, Spain 과 같이 범주형 데이터라면 이 데이터를 숫자로 바꿔야한다.

 만일, 프랑스 독일 스페인을 각각 0,1,2로 바꿔버리면 머신러닝 모델이 숫자 사이의 관계가 있다고 여기기때문에

 one-hot 인코딩 방식을 이용해야한다.

 독일 (1 0 0), 스페인 (0 1 0) 프랑스 (0 0 1)로 이진 벡터화해서 인코딩하면 세 개의 열이 새로 생성되는 의미이고, 숫자의     순서도 사라진다. 만일 우리가 가진 데이터가 독립 변수에도 범주형 데이터가 존재하고, 예측해야하는 종속 변수도 범주형 데이터가 존재한다면 독립 변수 인코딩 후에 종속 변수 인코딩을 한다.

 

  

 iv-1. 독립 변수를 인코딩하기

from sklearn.compose import ColumTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumTransformer(transformers= [('encoder', OneHotEncoder(), ['열'])], remainder='passthrough')
x = np.array(ct.fit_transform(x))

line 1 : 사이킷런의 compose 모듈에 접근해, ColumTransformer라는 클래스를 임포트한다.

line 2 : 사이컷런의 preprocessing 모듈에 접근해, OneHotEncoder라는 클래스를 임포트한다.

line 3 : ColumTransformer는 두 개의 인자를 요구하는데, (변환하고싶은열, 유지하고싶은열) 의 형식이다.

line4 :  np.array 형식으로 반환 받을 것이고, 객체 ct(인코딩)와 특징행렬(독립변수) x를 연결한다.

 

 

iv-2. 종속 변수를 인코딩하기

 이 데이터셋의 종속 변수는 물건을 사는가(Yes), 물건을 사지 않는가(No)의 범주형 데이터이고, Yes/No는 하나뿐인 싱글 벡터 이다.

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)

line1 : 사이킷런의 preprocessing 모듈에 접근해, OneHotEncoder라는 클래스를 임포트한다.

line2 : Yes/No는 하나뿐인 싱글 벡터이다. 어떤 것을 인코딩해야하는지 명확하므로 괄호를 비워도 된다. Yes =>1, No =>0

line3 : 종속 변수 벡터라서 np.array 형식이 필요없다.

 

 

-------- 이 과정까지하면 학습에 필요한 데이터 자료의 형태는 준비한 것이다.--------

 

 

v. 데이터셋을 훈련 세트와 테스트 세트로 나누기

 훈련 세트에 특징 행렬과 종속 변수 벡터 한 쌍, 테스트 세트에 똑같은 한 쌍을 만들 것이다.

분할 크기의 권장 값은 훈련 세트 80% 관측값, 테스트 세트 20% 관측값이다.

훈련 세트로는 머신 러닝 모델을 훈련시킨다.  ==>  훈련된 머신 러닝 모델을 A라고 하면

잘 훈련된 A에 테스트 세트의 특징 행렬 데이터를 넣었을 때, 나오는 결과를 B라고 하면

우리는 B와 실제 데이터인 테스트 세트의 종속 변수 벡터와의 비교를 통해 정확도를 비교하게 된다.

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 1)

line1 : 사이킷런의 model_selection 모듈에 접근해, train_test_split 이라는 함수를 임포트한다.

line2 : train_test_split 함수는 4개의 인자를 요구한다. 2개는 데이터 세트 전체를 요구하지 않고 특징 행렬 x와 종속 변수 벡터 y를 요구한다. 인자 4개로는 (특징행렬, 종속변수벡터, 분할크기, 무작위 요소) 이다.

 

 

vi. 특징을 스케일링하기

 일부 기계 모델에서 일부 특성이 다른 특성에 의해 지배되어 기계 모델에 인식되지 않은 상황을 방지하기 위해 모든 특성을 동일한 크기로 조정해주는 도구이다.

표준화 방식으로 스케일링 하면 모든 데이터 값이 원래 값에 기반하여 -3 ~ 3 의 값으로 변경된다.

정규화 방식으로 스케일링 하면 모든 데이터 값이 원래 값에 기반하여 0 ~ 1 의 값으로 변경된다.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
x_train['범위'] = sc.fit_transform(x_train['범위'])
x_test['범위'] = sc.fit_transform(x_test['범위'])

line1 : 사이킷런의 preprocessing 모듈에 접근해, StandardScaler라는 클래스를 임포트한다.

line2 : StandardScaler의 인스턴스 sc를 생성

line3 : fit은 각 평균과 표준편차를 구하는 것이고, transform은 이 공식을 적용해서 표준화나 정규화를 하는 것이다.

 

i ~ vi 과정을 마치면 우리는 머신러닝 훈련을 위한 준비는 모두 마친것이다.

 

***

Q. 데이터셋을 훈련 세트와 테스트 세트로 나누고, 특징을 추출해야하는가? 아니면 그 반대인가?

 

A. 데이터셋을 두 세트로 나누고, 특징을 추출해야한다.

    훈련이 끝날 때까지 가져오면 안되는 테스트 정보가 유출되는 것을 막기 위해서이다.

 

 

데이터를 전처리를 할 때 변함없이 진행되는 부분이 있다.

i. 라이브러리 임포트

ii. 데이터셋 불러오기 + 특징 행렬과 종속 변수 벡터 만들기

iii. 훈련 세트와 테스트 세트를 만드는 것

위 3 과정은 이미 템플릿이 있을 정도로 변함없이 자주 사용하는 부분이다. 이미 있는 것을 사용하면 빠르고 쉽게 데이터 전처리가 가능하다.