Categorical을 핸들링하는 방법에 대해 알아보겠습니다.
첫번째는 binning입니다. 이는 numerical variables를 범위에 따라 쪼갬으로써 categorical처럼 조작할 수 있게 하는 기법입니다. 통상 categorical을 numerical로 변환하기 때문에 잘 사용되지는 않습니다.
쪼개진 하나의 구간을 우리는 bin 혹은 bucket이라 부릅니다.
pd.cut
으로 손쉽게 구현 가능 합니다.
다음 샘플을 보시면 numerical value인 Salary 피처를 binning하고 있는 것을 볼 수 있습니다. bins 리스트 변수는 bins 범위를 담고 있습니다.
import pandas as pd
data = {
'Name': ['John', 'Mary', 'Steve', 'Jane', 'Mike', 'Sarah'],
'Salary': [35000, 45000, 55000, 65000, 75000, 85000]
}
df = pd.DataFrame(data)
bins = [30000, 50000, 70000, 90000]
df['Salary Range'] = pd.cut(df['Salary'], bins)
# print
Name Salary Salary Range
0 John 35000 (30000, 50000]
1 Mary 45000 (30000, 50000]
2 Steve 55000 (50000, 70000]
3 Jane 65000 (50000, 70000]
4 Mike 75000 (70000, 90000]
5 Sarah 85000 (70000, 90000]
Normalization과 후술할 Standardization은 합쳐서 Scaling이라 부릅니다. 데이터 간의 범위를 일정 범위 및 통계량 내로 조정하는 역할을 하기 때문입니다.
Tree-based model은 scale의 영향을 받지 않습니다.
하지만 Linear model같은 경우 scaling을 통해 optimizing 속도 향상을 기대할 수 있고, outlier가 제거된다면 일정 부분 성능 향상도 볼 수 있습니다.
Distance-based model의 경우 데이터 간의 범위를 직접적으로 조정하는 scale의 영향을 크게 받습니다.
정규화(Normalization) 피처간 수의 범위 scale을 일정한 범위 엔에 들어오도록 조정하는 것입니다. 통상 이나 의 범위를 기준으로 변환됩니다.
로 변환시키는 minmax scaler를 기준으로 예를 들어봅시다.
피처 에 대해 적용하면 다음과 같은 수식에 따라 변환됩니다.
sklearn이 minmaxscaler를 통해 다음과 같이 구현할 수 있습니다.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(df)
df_scaled = scaler.transform(df)
다시 오리지널 데이터로 변환하려면 다음과 같이 구현합니다.
df_original = scaler.inverse_transform(df_scaled)
표준화(Standardization)은 정규화와 비슷하게 데이터를 scaling시키지만 특정 범위로 제한시키지 않고 평균()을 0, 표준편차()를 1에 일치시킵니다. 스코어를 구하는 공식과 같습니다.
Linear model이며 수가 너무 큰 경우에는 표준화를 진행하는 것이 성능향상에 도움이 될 수 있습니다.
그렇다면 언제 정규화를 사용하고 언제 표준화를 사용하는 것이 좋을까요?
정해진 답은 없고 시간이 충분하다면 둘다 적용하면 됩니다.
굳이 하나만 적용해야 한다면 다음과 같은 기준을 참고해봅시다.
1. Unsupervised Learning에는 표준화를 적용하는 것이 좋습니다.
2. 피처가 정규분포에 가까울수록 표준화를 적용하는 것이 좋습니다.
3. 아웃라이어가 존재하는 경우 표준화를 적용하는 것이 좋습니다.
4. 그 외에는 정규화가 더 좋습니다.
[1] Burkov, The hundred page machine learning