2. 분류Classification > 2-4. 전처리
전처리
sklearn.preprocessing
데이터 전처리 모듈데이터 사이언스, AI, Machine Learning 프로젝트의 80%는 데이터 전처리에 있다고 해도 과장이 아닙니다. 일단 적합한 데이터여야 분석이 가능하고, 잘 전처리 될 수록 분석 결과가 좋습니다.
DataFrame에서 피처를 옮기거나 삭제하는 작업은 Pandas로 할 수 있습니다. 하지만 어떤 피처의 대부분 값이 10~90 사이인데 갑자기 200짜리, -100짜리 이상치가 있는 데이터 전처리를 Pandas로 하려면 어떻게 해야할까요? 지금 떠오르기로는 범위를 나누고, 조건문을 걸어서 삭제해야할 것 같네요. 그런데 피처가 100개라고 생각해 보세요! 모든 피처 하나씩 전처리를 할 수는 없겠죠?
물론 log 변환이 더 좋은 전처리가 될 때도 있습니다. EDA를 통해 데이터를 잘 확인하고 적용해보세요.
sklearn에서는 preprocessing 모듈을 제공합니다. 여기서 우리는 Scaling을 위해 표준화Standardization 또는 정규화Normalization을 사용할 수 있습니다.
StandardScaler
\begin{equation} x_i^{'} = \frac{x_i-mean(x)}{stdev(x)} \end{equation}
# sklearn.preprocessing.StandardScaler(*, copy=True, with_mean=True, with_std=True)
from sklearn.preprocessing import StandardScaler
data = [[0, 0], [0, 0], [1, 1], [1, 1]]
## 스케일러 인스턴스화
scaler = StandardScaler()
## 데이터에 스케일러 적용
print(scaler.fit(data))
>>> StandardScaler()
# 스케일링 된 데이터의 평균
StandardScaler()
print(scaler.mean_)
>>> [0.5 0.5]
# StandardScaler로 스케일링 된 데이터
print(scaler.transform(data))
>>> [[-1. -1.]
[-1. -1.]
[ 1. 1.]
[ 1. 1.]]
## 1x2행렬 스케일링 한 결과 반환
print(scaler.transform([[2, 2]]))
>>> [[3. 3.]]
MinMaxScaler
\begin{equation} x_i^{'} = \frac{x_i-min(x)}{max(x)-min(x)} \end{equation}
# sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1), *, copy=True)
from sklearn.preprocessing import MinMaxScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler()
print(scaler.fit(data))
>>> MinMaxScaler()
# 최대값
MinMaxScaler()
print(scaler.data_max_)
>>> [ 1. 18.]
# MinMax Scaler로 Scaling된 데이터
print(scaler.transform(data))
>>> [[0. 0. ]
[0.25 0.25]
[0.5 0.5 ]
[1. 1. ]]
print(scaler.transform([[2, 2]]))
>>> [[1.5 0. ]]
RobustScaler
\begin{equation} x_i^{'} = \frac{x_i-Q_2}{Q_3-Q_1} \end{equation}
from sklearn.preprocessing import RobustScaler
X = [[ 1., -2., 2.],
[ -2., 1., 3.],
[ 4., 1., -2.]]
scaler = RobustScaler().fit(X)
scaler
>>> RobustScaler()
RobustScaler()
print(scaler.transform(X))
>>> [[ 0. -2. 0. ]
[-1. 0. 0.4]
[ 1. 0. -1.6]]
MaxAbsScaler
\begin{equation} x_i^{'} = 2\big(\frac{x_i-x_{min}}{x_{max}-x_{min}}\big) \end{equation}
from sklearn.preprocessing import MaxAbsScaler
X = [[ 1., -2., 1.],
[ 0., 1., 2.],
[ 1., -1., 0.]]
transformer = MaxAbsScaler().fit(X)
transformer
>>> MaxAbsScaler()
MaxAbsScaler()
scaler.transform(X)
## MinMax Scaler처럼 최대 최소 값 변환
>>> [[ 1. , -1. , 0.5],
[ 0. , 0.5, 1. ],
[ 1. , -0.5, 0. ]]
Normalizer
from sklearn.preprocessing import Normalizer
X = [[ 1., -2., 1.],
[ 0., 1., 2.],
[ 1., -1., 0.]]
transformer = Normalizer().fit(X)
transformer
Normalizer()
transformer.transform(X)
>>>
array([[ 0.40824829, -0.81649658, 0.40824829],
[ 0. , 0.4472136 , 0.89442719],
[ 0.70710678, -0.70710678, 0. ]])
스케일러의 특징을 잘 모른다면 데이터 추출, 모델 선택, 하이퍼 파라미터 조정 등의 과정을 되짚어 가면서 최적의 모델을 찾기 위한 긴 여정을 떠나야 할지도 모릅니다. 그 전에 데이터에 맞는 전처리를 적용하시길 바랍니다.