[BasicML] 데이터 스케일링 정규화와 표준화
피처 스케일링 - 정규화와 표준화
머신러닝 알고리즘은 숫자에 영향을 많이 받는다. 특히 K-means와 같은 평균을 기반으로 하는 모델일수록 스케일이 다르면 잘 작동하지 않는다. 따라서 범위를 같도록 만들어주는 것이 정규화와 표준화가 자주 사용되는데, 표준화는 데이터의 피처 각각이 평균이 0이고 분산이 1인 가우시안 정규 분포를 가진 값으로 변환하는 것을 의미하며 정규화는 서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념이다.
이러한 표준화와 정규화를 위해 사이킷런는 Feature scaling API를 지원하며 대표적인 것이 바로 StandardScaler와 MinMaxScaler가 있다. StandardScaler는 평균이 0이고, 분산이 1인 정규 분포 형태로 변환하는 표준화 스케일러이며, MinMaxScaler는 데이터값을 0과 1사이의 범위 값으로 변환하는 정규화 스케일러로 만약에 데이터셋에 음수가 있으면 -1에서 1값으로 변환한다.
왼쪽 그림 Min-MaxScaler, 오른쪽 그림 StandardScaler
붓꽃 데이터를 가지고 스케일링을 실행하고 평균의 분포와 분산의 분포를 확인해보자.
예제
**사이킷런에서 제공하는 StandardScalers와 MinMaxscaler는 fit()과 transform()을 이용하여 표준화와 정규화 작업을 진행함
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
iris = load_iris()
iris_data = iris.data
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
plt.plot(iris_df.mean(),label='mean')
plt.plot(iris_df.var(),label ='var')
plt.legend()
plt.show()
from sklearn.preprocessing import StandardScaler
# StandardScaler객체 생성
scaler = StandardScaler()
# StandardScaler 로 데이터 셋 변환. fit( ) 과 transform( ) 호출.
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
#transform( )시 scale 변환된 데이터 셋이 numpy ndarry로 반환되어 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
plt.plot(iris_df_scaled.mean(),label='mean')
plt.plot(iris_df_scaled.var(),label ='var')
plt.legend()
plt.show()
from sklearn.preprocessing import MinMaxScaler
# MinMaxScaler객체 생성
scaler = MinMaxScaler()
# MinMaxScaler 로 데이터 셋 변환. fit() 과 transform() 호출.
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
# transform()시 scale 변환된 데이터 셋이 numpy ndarry로 반환되어 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
plt.plot(iris_df_scaled.max(),label='max')
plt.plot(iris_df_scaled.min(),label ='min')
plt.legend()
plt.show()