[Machine Learning] 데이터 전처리

·

3 min read

개요

효과적인 머신 러닝은 우수한 예측 분석 결과로 이어지며, 이는 잘 정돈된 데이터로부터 출발한다. 정교한 예측 분석 모델을 얻기 위해서는 수집된 데이터에 누락된 부분이나, 오차를 파악하고, 데이터를 가공하여, 잘못된 데이터 분석이 일어나지 않도록 '전처리' 과정이 필요하다.

이 과정은 몇 가지로 나뉜다.

  1. Data cleaning

    • missing feature, 즉 누락된 데이터가 있을 때, 제대로 역할을 할 수 있도록 데이터를 맞춰 주고, 불 필요한 데이터를 제거해야 한다.
  2. Handling Text and Categorical Attributes

    • 대부분의 ML 알고리즘은 숫자 데이터로 학습하는 것을 선호한다. 기존 데이터 셋에 텍스트가 있는 경우 이 것을 숫자형 데이터로 인코딩 해주어야 한다.
  3. Custom Transformers

    • 전처리를 적용한 데이터를 기존의 데이터 셋에 적용한다.
  4. Feature Scaling

    • 숫자형 데이터로 바꾼 데이터들이더라도 각 column마다의 데이터의 범위가 너무 다양하다면, 편향된 분석이 나올 수도 있다. 이를 막기 위해 Min-Max Scaling(normalization), Standardization등의 방식으로 숫자 데이터를 변경한다.

Data 전처리 과정

Importing the libraries

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

pandas: 데이터 조작, 분석, 시각화 등을 위한 표 데이터를 다룬다.

numpy: 수치해석, 통계 관련 수학 과학 연산에 쓰인다.

Importing the dataset

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

pandas의 read_csv로 데이터가 들어가있는 csv 파일을 읽어 table화 한다.

iloc메소드는 행렬의 column, row 인덱스를 설정하여 설정된 값들만 뽑아온다. 해당 코드는 마지막 열은 독립 변수들(x)에 의해 결과로 나온 종속 변수(y)이며, 이를 제외한 열은 독립 변수(x)이다.

Taking care of missing data(Data cleaning)

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

SimpleImputer 메소드를 이용해 np.nan(nan 값)의 값이 들어가 있는 data들은 모두 'mean' 즉, 평균 값으로 대체하도록 하여 누락 데이터를 채운다.

fit, transform은 해당 데이터 변형을 기존의 데이터 셋에 적용한다.

Encoding categorical data

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')
X = np.array(ct.fit_transform(X))

categorical data는 나이, 길이와 같이 연속적인 값을 가지는 numerical data과 다르게 이산적인 값, 즉 몇 개의 카테고리로 분류되는 값을 가지는 데이터이다. 예를 들면, 성별 등이 있으며, 우리는 이런 categorical data를 효율적으로 인식할 수 있도록, 남자를 0, 여자를 1로 변경하는 등 숫자 데이터로 바꾸는 과정이 필요하다.

sklearn(사이킷런)은 파이썬에서 머신러닝 분석을 할 때, 유용하게 사용할 수 있는 모듈이다.

OneHotEncoder는 나라 이름과 같이 고유하지만, 글로 된 데이터를 바이너리 데이터로 바꾸는 인코딩 방식이다.

ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')

위의 코드는 0번 째, column(이름 데이터)에 OneHotEncoder를 적용하고 나머지에는 적용하지 않는 passthrough를 적용한다.

[[1.0 0.0 0.0 44.0 72000.0] [0.0 0.0 1.0 27.0 48000.0] [0.0 1.0 0.0 30.0 54000.0] [0.0 0.0 1.0 38.0 61000.0] [0.0 1.0 0.0 40.0 63777.77777777778] [1.0 0.0 0.0 35.0 58000.0] [0.0 0.0 1.0 38.77777777777778 52000.0] [1.0 0.0 0.0 48.0 79000.0] [0.0 1.0 0.0 50.0 83000.0] [1.0 0.0 0.0 37.0 67000.0]]

이는 onehotencoder를 적용한 데이터셋이다.

Encoding the Dependent Variable

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

LabelEncoder는 yes no와 같이 0과 1로 할당할 수 있는 데이터를 수치화 하는 인코더 이다. 이를 이용해 종속 변수인 yes or no를 0과1로 변경한다.

Splitting the dataset, train set, test set

입력 데이터가 있을 때, 일부 데이터는 머신 러닝에 직접 입력하는 데이터셋이며, 나머지 일부 데이터는 예측 결과와 비슷한지 비교하는 테스트 데이터셋이 된다. feature scaling을 하기 전에, train set과 test set을 나눠야 정확한 입력 데이터의 feature scaling이 가능하다.

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)

train_test_split은 전체 데이터의 20%를 테스트 사이즈로 설정하여 20%를 테스트셋으로 분리한다.

Feature Scaling

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train[:, 3:] = sc.fit_transform(X_train[:, 3:])
X_test[:, 3:] = sc.transform(X_test[:, 3:])

StandardScaler는 데이터에서 특정 column의 데이터들이 너무 변화 폭이 큰 경우, 예를 들어,

[[1.0 0.0 0.0 44.0 72000.0] [0.0 0.0 1.0 27.0 48000.0] [0.0 1.0 0.0 30.0 54000.0] [0.0 0.0 1.0 38.0 61000.0] [0.0 1.0 0.0 40.0 63777.77777777778] [1.0 0.0 0.0 35.0 58000.0] [0.0 0.0 1.0 38.77777777777778 52000.0] [1.0 0.0 0.0 48.0 79000.0] [0.0 1.0 0.0 50.0 83000.0] [1.0 0.0 0.0 37.0 67000.0]]

에서 2,3번째 column의 데이터는 변화 폭이 +-10 정도이지만, 4번째 데이터는 변화 폭은 최소 1000이다. 이런 격차는 편향된 분석을 내놓을 수 있기 때문에 StandardScaler를 통해 표준화를 하여, 데이터의 scale을 줄인다.

edited by 박태곤