사이킷런에서 데이터 전처리하기 - 피처 스케일링

2 minute read

서로 다른 변수의 값 범위를 일정 수준으로 맞추는 작업을 피처 스케일링(Feature Scaling)이라고 하며, 피처 스케일링에는 표준화정규화가 있다.

1. 표준화 (Standardization)

데이터의 피처 각각이 평균이 0, 분산이 1인 가우시안 정규분포를 가진 값으로 변환하는 작업을 표준화라고 한다. 기계학습 시에 SVM, 선형 회귀, 로지스틱 회귀는 가우시안 분포를 가정하고 구현되었으므로 전처리 단계에서 표준화를 해주는 것이 성능 향상에 도움이 된다.

원래 값에서 피처의 평균을 뺀 값을 피처의 표준편차로 나눠서 표준화한다. 수식으로 나타내면 다음과 같다.

image

사이킷런의 StandardScaler를 사용해 표준화를 진행해보자. 데이터 인코딩에서와 마찬가지로 피처 스케일링에서도 fit()transform()을 사용한다.

fit_transform()으로 fit()과 transform()을 한 번에 적용할 수도 있다.

데이터는 붓꽃 데이터 세트를 사용했다.

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
import pandas as pd

iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)

# 표준화
scaler = StandardScaler() 
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature 들의 평균 값')
print(iris_df_scaled.mean())
print('\nfeature 들의 분산 값')
print(iris_df_scaled.var())
feature 들의 평균 값
sepal length (cm)   -1.690315e-15
sepal width (cm)    -1.842970e-15
petal length (cm)   -1.698641e-15
petal width (cm)    -1.409243e-15
dtype: float64

feature 들의 분산 값
sepal length (cm)    1.006711
sepal width (cm)     1.006711
petal length (cm)    1.006711
petal width (cm)     1.006711
dtype: float64

평균은 0, 분산은 1에 매우 가깝게 맞춰진 것을 확인할 수 있다.

2. 정규화 (Normalization)

서로 다른 피처의 크기를 통일하기 위해 크기를 0 ~ 1의 똑같은 단위로 변환해주는 것을 정규화라고 한다. 원래 값에서 피처의 최솟값을 뺀 값을 피처의 최댓값과 최솟값의 차이로 나누어 정규화할 수 있다. 수식으로 나타내면 다음과 같다.

image

사이킷런에서 제공하는 MinMaxScaler는 음수 값이 없으면 0 ~ 1의 값으로, 음수 값이 있으면 -1 ~ 1의 값으로 변환해준다. 데이터가 가우시안 분포를 가진 경우 위와 같이 표준화를 수행하면 되지만, 아닐 경우 MinMaxScaler를 사용해볼 수 있다.

from sklearn.preprocessing import MinMaxScaler

# 정규화
scaler = MinMaxScaler() 
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature들의 최소 값')
print(iris_df_scaled.min())
print('\nfeature들의 최대 값')
print(iris_df_scaled.max())
feature들의 최소 
sepal length (cm)    0.0
sepal width (cm)     0.0
petal length (cm)    0.0
petal width (cm)     0.0
dtype: float64

feature들의 최대 
sepal length (cm)    1.0
sepal width (cm)     1.0
petal length (cm)    1.0
petal width (cm)     1.0
dtype: float64

+ 주의사항

피처 스케일링 수행 시에 주의할 점은 학습 데이터와 테스트 데이터에 각각 fit()을 적용하면 안되고, 테스트 데이터에서는 학습 데이터 세트로 fit()을 수행한 결과를 이용해 transform()을 해야 한다는 것이다. 만약 테스트 데이터에 새로 fit()을 하게 되면 학습 데이터와 테스트 데이터의 스케일링 기준 정보가 달라지는 문제를 발생시킨다.

따라서, fit_transform()은 자동으로 fit() 과정을 포함시키게 되므로 테스트 데이터에 사용하면 안된다.

가장 좋은 방법은 학습용 데이터와 테스트용 데이터를 분리하기 전에 피처 스케일링을 적용하는 것일 것이다.

Leave a comment