모델의 성능을 높이기 위해
스케일링을 진행한다.
알고리즘 중 거리를 계산하는 알고리즘은
거리가 클수록
영향을 많이 받는다.
그러나 거리가 크다는 것(범위가 크다는 것)이
꼭 중요한 변수를 의미하지는 않는다.
따라서 스케일링을 통해 범위를 일치시켜준다.
스케일링 작업을 진행하면 모든 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 등 거리를 이용한 알고리즘