실무에서 다양한 피처를 만들면서 긴 시간동안 고생을 해봤고, 잘 들어 맞는 피처를 만들어야 한다는 학습 결과가 있었다. 그렇기에 우리가 해결하고자 하는 과제에 적합한 모델에 잘 맞는 피처를 만들어야겠다는 생각이 들었고,
피처 엔지니어링 대로 시작하기 (O’REILLY)
책을 구매하게 되었다.
이 책에 있는 내용 중 머리 속에 남기고 싶은, 그리고 앞으로 실무에 적용시켜야 될 부분들을 적어 학습을 효율적으로 진행할 예정이다.
글을 작성하기전 피처 스케일링을 진행할 때 로그화를 먼저해야하는지, 정규화를 먼저해야 하는지에 대해 막연한 궁금증이 있었는데, 나와 비슷한 고민을 먼저 해주신 외국분이 계셔서 링크를 아카이빙 한다.
https://www.researchgate.net/post/log_transformation_and_standardization_which_should_come_first
결론
로그화를 먼저하고 정규화를 진행하는 것이 좋다.
왜냐하면 로그화는 skewed되어 있는 데이터의 왜곡을 줄이기 위한 작업이기에 선행되어야 하고, 이 선행 작업이 끝난 뒤에 데이터 정규화를 진행하는 것이 좋다고 한다.
피처 스케일링
선형 회귀나 로지스틱 회귀 등은 스케일의 영향을 받는다. 이와 같이 특정 모델이 피처의 스케일에 민감하다면 피처 스케일링이 도움이 될 것이다.
이를 피처 스케일링 혹은 정규화(normalization)이라고 부른다.
1. min-max 스케일링
모든 피처의 값을 [0,1] 범위의 값으로 압축시키거나 확장시키는 방법이다.
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
my_dict = {"height": ['175', '183','192','154','168'], "weight": ['73', '81','90','43','50']}
new_data = pd.DataFrame(my_dict)scaler = MinMaxScaler(feature_range=(0,1))
new_data = scaler.fit_transform(new_data)
print(new_data)
2. 표준화 (분산 스케일링) — StandardScaler
평균이 0이고 분산이 1이 되도록 스케일링 하는 방법
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
new_data = scaler.fit_transform(new_data)
print(new_data)
보통은 머신러닝을 진행할 때 StandardScaler와 MinMax 방법을 주로 사용하므로 이 두 개를 잘 이해하고 있으면 좋을 것 같다.
모델에 돌리기 전 feature들 마다 스케일이 상이한 경우 두 개중 알맞은 방법을 선택하여 진행하면 좋을 것 같다.
(e.g, column1은 km단위로 1~10까지 있는데, column2는 cm단위로 100~10000까지 있다면 가중치가 달라지기 때문에 표준화를 진행해야함)
각 피처마다 서로 다른 단위에 있을 때 머신러닝을 돌릴 때 특정값에 가중치가 부여되어 Bias가 생길 수 있기 때문이다.
그리고 대부분의 스케일링 기법에서 outlier는 변환 효과를 저해하는 요소이다. 왜냐하면 평균과 분산은 이상치와 특이값에 굉장히 민감하기 때문이다.
그렇기에 “이상치를 제거 하려는 노력"이 꼭 필요하다!
(IQR tukey나 outlier detection 알고리즘을 통해 먼저 선행되어야함)