데이터 전처리
데이터 전처리 (Preprocessing data)
모델에 데이터를 넣기 전에, 피처들을 일정한 스케일로 맞추는 작업이 성능에 큰 영향을 줘요. 선형 모델 같은 많은 학습 알고리즘은 표준화(standardization) 가 된 데이터에서 잘 동작해요. sklearn.preprocessing 패키지는 원본 피처 벡터를 하류 estimator에 더 적합한 표현으로 바꿔 주는 여러 유틸리티 함수와 변환기 클래스를 제공해요.
표준화: 평균 제거와 분산 스케일링
표준화 는 scikit-learn에 구현된 많은 estimator의 공통 요구사항이에요. 개별 피처가 대략적으로 평균 0, 단위 분산의 가우시안 분포 를 따르지 않으면 estimator가 제대로 동작하지 않을 수 있어요. 실제로는 분포 모양을 무시하고, 각 피처의 평균을 빼서 중심을 0으로 맞춘 뒤 표준편차로 나눠 스케일을 조정해요.
한 피처의 분산이 다른 피처보다 훨씬 크면 목적 함수를 지배해서, estimator가 다른 피처로부터 제대로 학습하지 못할 수 있어요. StandardScaler 는 이런 연산을 쉽게 수행해 줘요.
>>> from sklearn import preprocessing
>>> import numpy as np
>>> X_train = np.array([[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]])
>>> scaler = preprocessing.StandardScaler().fit(X_train)
>>> scaler.mean_
array([1., 0., 0.33])
>>> X_scaled = scaler.transform(X_train)
>>> X_scaled
array([[ 0. , -1.22, 1.33 ],
[ 1.22, 0. , -0.267],
[-1.22, 1.22, -1.06 ]])
>>> X_scaled.mean(axis=0)
array([0., 0., 0.])
>>> X_scaled.std(axis=0)
array([1., 1., 1.])
StandardScaler 는 Transformer API로 훈련 세트에서 평균·표준편차를 계산해 두고, 나중에 같은 변환을 테스트 세트에도 재적용할 수 있어요. 그래서 Pipeline 의 앞 단계에 쓰기 적합해요. 중심화나 스케일링을 끄고 싶으면 각각 with_mean=False 나 with_std=False 를 생성자에 넘기면 돼요.
범위로 스케일링하기
피처를 주어진 최소·최대 값 사이로 맞추는 대안도 있어요. MinMaxScaler 는 보통 0과 1 사이로, MaxAbsScaler 는 각 피처의 최댓값 절댓값으로 나눠 [-1,1] 범위로 맞춰요. 피처의 표준편차가 아주 작을 때 견고하고, 희소 데이터의 0을 보존하는 데 유용해요.
>>> min_max_scaler = preprocessing.MinMaxScaler()
>>> X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[0.5 , 0. , 1. ],
[1. , 0.5 , 0.33333333],
[0. , 1. , 0. ]])
MinMaxScaler 에 feature_range=(min,max) 를 명시하면 전체 공식은 다음과 같아요.
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
다항(polynomial) 피처 생성
모델에 비선형성을 더하려면 입력 데이터의 비선형 피처를 고려하는 게 유용할 때가 있어요. PolynomialFeatures 로 피처의 고차항과 상호작용항을 만들 수 있어요. interaction_only=True 로 설정하면 피처 사이의 상호작용항만 만들 수도 있어요.
>>> import numpy as np
>>> from sklearn.preprocessing import PolynomialFeatures
>>> X = np.arange(6).reshape(3, 2)
>>> poly = PolynomialFeatures(2)
>>> poly.fit_transform(X)
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
위 예시에서 피처는 (X1, X2) 에서 (1, X1, X2, X1^2, X1X2, X2^2) 로 변환됐어요.