모델의 성능을 높이기 위해 스케일링을 진행한다.
알고리즘 중 거리를 계산하는 알고리즘은 거리가 클수록 영향을 많이 받는다.
그러나 거리가 크다는 것(범위가 크다는 것)이 꼭 중요한 변수를 의미하지는 않는다.
따라서 스케일링을 통해 범위를 일치시켜준다.
스케일링 작업을 진행하면 모든 feature에 대해서 featrue 각각을 기준으로 스케일링이 진행된다.
만약 특정 변수에 대해서만 진행하고 싶다면, 해당 변수만 따로 스케일링을 진행하고 다른 변수들과 데이터프레임으로 합치는 작업을 진행해줘야한다.
스케일링 종류에는 표준화와 정규화가 있다.
스케일링 작업은 둘 중 하나만 수행한다.
cf) ★가변수화가 선행되어야한다.
표준화는 분포의 범위가 다양할 때, 분포를 비교하기 위한(특히 정규분포) 방법이다.
표준화를 거치면 z-score가 된다.
모든 분포가 평균은 0, 표준편차는 1이 되므로 분포에 대한 비교가 가능해진다.
cf) : 뮤라고 읽으며, 제로평균을 의미한다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() # 스케일러 호출
x_train_s = scaler.fit_transform(x_train) # 학습 후 적용
x_val_s = scaler.transform(x_val) # 적용
# 다른 방법
scaler.fit(X_train)
x_train_s = scaler.transform(X_train)
x_val_s = scaler.transform(x_val)
# 결과 확인을 위한 df 작업
df_s = pd.DataFrame(x_train_s, columns=x_train.columns)
df_s
sklearn 라이브러리가 아닌 scipy클래스의 stats함수를 import한다!
from scipy import stats
x_train_zs = stats.zscore(x_train)
x_val_zs = stats.zscore(x_val)
df_zs = pd.DataFrame(x_train_zs, columns=x_train.columns)
df_zs
결과를 보면 다른 스케일링 작업과 다르게 NaN이 있는 변수에 대해서는 z-score를 구할 수 없음을 알 수 있다.
모든 feature(변수)를 [0,1] 사이 값으로 변환하는 방식이다.
이상치 제거가 선행되어야한다.
이상치가 존재할 경우, 성능이 저하된다.
cf) 정규화를 보통 0 ~ 1로 하는 것이 일반적이나 -1 ~ 1로도 할 수 있다.
그러나 모델링 전처리 시에는 0 ~ 1로만 고려하면 된다.
x_s = (x_train - x_train.min()) / (x_train.max() - x_train.min())
x_s
sklearn에서 제공하는 MinMaxScaler를 통한 정규화
cf) https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() # 스케일러 호출
x_train_s = scaler.fit_transform(x_train) # 학습 후 적용
x_val_s = scaler.transform(x_val) # 적용
# 결과 확인을 위한 df 작업
df_s = pd.DataFrame(x_train_s, columns=x_train.columns)
df_s
수식을 이용했을 때랑 결과가 같음을 확인할 수 있다.
표준화는 이상치와 상관없이 분포를 그대로 유지해준다.
반면에 정규화는 값의 범위를 0~1로 맞춰야하기 때문에 이상치에 따라서 분포가 좀 더 압축된다.
따라서 이상치가 큰 경우 표준화가 적절하다.
반대의 경우, 대체로 정규화를 사용한다.
어떤 방법을 사용하여 스케일링 했냐에 따라 x축 범위가 달라짐을 확인할 수 있다.
사용된 데이터 출처: https://www.kaggle.com/c/titanic
KNN, SVM 등 거리를 이용한 알고리즘