티스토리 뷰
피처 스케일링은 서로 다른 피처 값의 범위(최대값 - 최솟값) 이 일치하도록 조정하는 작업
값의 범위가 데이터마다 다르면 모델 훈련이 제대로 안될 수도 있다.
단, 트리 기반 모델(랜덤 포레스트, XGBoost, LightGBM 등)은 피처 스케일링이 필요 없다.
트리 기반모델은 대소 관계에 영향을 받기 때문.
예시 : 3개의 키와 몸무게, 옷 사이즈가 있을 때, 마지막 사람은 어떤 옷의 사이즈가 더 알맞는가? S vs L
직관적으로 키와 몸무게가 가까운 지표가 당연히도 똑같은 옷 사이즈를 가질 확률이 높다.
그런데 키는 m단위고, 몸무게는 kg 단위기 때문에, 단순 더하게 되면 오차가 난다.
그래서 오류를 개선하려면 키와 몸무게 값의 범위를 같은 수준으로 맞추는 데 이 때 필요한 게 피처 스케일링.
min-max 정규화
피처 값의 범위를 0~1로 조정하는 기법
피처 x에서 최솟값을 뺀 뒤, 그 값을 최댓값과 최솟값의 차이로 나눈다.
X_S = (X-Xmin) / (Xmax - Xmin)
1.7 - 1.5(키의 최솟값) / (1.8-1.5) = 0.67
(1.5-1.5) / (1.8-1.5) =0
(1.8-1.5) / (1.8-1.5) = 1
따라서 세번 째 경우가 첫번쨰 경우와 가깝다.
min-max 정규화는 sklearn의 MinMaxScaler로 구현
https://www.kaggle.com/werooring/ch5-feature-scaling
import pandas as pd
height_weight_dict = {'키': [1.7, 1.5, 1.8], '몸무게': [75, 55, 60]}
df = pd.DataFrame(height_weight_dict, index=['광일', '혜성', '덕수'])
print(df)
키 몸무게
광일 1.7 75
혜성 1.5 55
덕수 1.8 60
from sklearn.preprocessing import MinMaxScaler #fit()과 transform() 함수 호출로 피처 스케일링 적용
# min-max 정규화 객체 생성
scaler = MinMaxScaler()
# min-max 정규화 적용 ①
scaler.fit(df)
df_scaled = scaler.transform(df)
print(df_scaled)
[[0.66666667 1. ]
[0. 0. ]
[1. 0.25 ]]
fit과 transform은 fit_transform()으로 한 번에 실행 가능
# min-max 정규화 객체 생성
scaler = MinMaxScaler()
# min-max 정규화 적용
df_scaled = scaler.fit_transform(df)
print(df_scaled)
[[0.66666667 1. ]
[0. 0. ]
[1. 0.25 ]]
fit과 transform 두 함수를 나눠놓은 이유?
scaler = MinMaxScaler()
scaler.fit(df)
df_scaled = scaler.transform(df)
df_scaled2 = scaler.transform(df2)
df_scaled3 = scaler.transform(df3)
데이터 하나 말고 한 데이터에 맞춰 놓은 스케일링 범위를 다른 데이터에도 적용하고 싶을 때 사용.
표준화
평균이 0, 분산이 1이 되도록 피처 값을 조정.
min-max 정규화와 다르게 상한, 하한이 없다.
X_sc = (X-Xavg) / (표준편차)
from sklearn.preprocessing import StandardScaler
# StandardScaler 객체 생성
scaler = StandardScaler()
# 표준화 적용
df_scaled = scaler.fit_transform(df)
print(df_scaled)
[[ 0.26726124 1.37281295]
[-1.33630621 -0.98058068]
[ 1.06904497 -0.39223227]]
출처 : 머신러닝 딥러닝 문제해결 전략