ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [머신러닝] Feature Scaling 피쳐 스케일링. 언제 어떤 Scaler를 써야할까? (Min-Max, 표준화, Robust Scaling)
    머신러닝 배우기 2023. 12. 11. 21:43

    ▶︎ 피쳐스케일링이 무엇인가요?

    여러 연속형 피쳐들의 값의 범위들을 일치시키거나 조절하는 것

     

    ▶︎ 피쳐 스케일링을 왜 해야 하나요?

    피쳐들 간에 범위 차이가 클 경우, 일부 알고리즘은 큰 값을 갖는 특성에 민감하게 반응할 수 있습니다. 그래서 모든 특성들에 대해 비슷한 수치 구간 내로 이동시키는 작업을 진행합니다.

    특히 경사하강법을 사용하여 해를 구하는 모델에서는 정규화를 해야합니다. 그 이유를 범위 차이가 큰 두 피쳐의 목적함수에 대한 등치선도를 2차원으로 생각해봅시다. 한쪽으로 긴 타원 형태가 될 것입니다. 두 피쳐의 경사하강의 속도가 다르기 때문에 최적해를 찾기 위해 여러 작업을 거쳐야 합니다. 하지만 정규화하여 원의 형태가 되었다면 두 피쳐에 대한 갱신 속도가 같아지면서 경사하강법을 통해 좀 더 빠르게 최적해를 찾을 수 있습니다.

     

    ▶︎ 모든 모델에서 해야하나요?

     아닙니다. 모든 모델에서 Feature Scaling은 반드시 필요한 것은 아닙니다. 예를 들어, 의사결정 트리나 랜덤 포레스트 같은 트리 기반 알고리즘들은 피쳐 범위에 영향을 받지 않아서 스케일링을 할 필요가 없습니다. 하지만, 대부분의 선형 모델이나 거리 기반의 알고리즘(서포트 벡터 머신(SVM),  K-최근접 이웃)은 값의 범위와 가중치에 따라 민감하기 때문에 Feature Scaling이 필요합니다.

     

    ▶︎ Min-Max normalization

     데이터의 값을 [0, 1] 범위로 변환하는 스케일링. 

    outlier 값에 민감하다. 따라서 이상치가 있으면 이 방법을 쓰는 것은 적절하지 않습니다.

    데이터의 분포가 특정범위로 정해져있고 (예를 들어 성적은 0~100으로 정해져있음)

     원본 데이터들 사이의 간격/관계/거리를 보존하고 싶을 때,

     사용하는 알고리즘이 거리 기반일 때 적절합니다.

    Min-Max normalization

     

     

    ▶︎ Standardization (표준화)

     데이터의 평균을 0으로, 표준편차를 1로 만드는 스케일링 방법. 따라서 정규분포를 따르지 않는 분포에 적용하면 정규분포로 바뀌어서 좋습니다.

     outlier 값에 덜 민감하다. 따라서 데이터에 outlier가 있을 경우 사용하기 좋습니다.

    Standardization

     

     

    ▶︎ Robust Scaling 로버스트 스케일링

     이상치의 영향을 최소화하기 위해, 데이터의 중앙화와 척도화를 수행하는 스케일링 기법

     이상치가 있는 데이터셋에서 사용. 데이터의 중심과 분포를 조절

     데이터의 중심을 나타내는 중간값(median)과 데이터의 분포를 나타내는 IQR(Interquartile Range)를 사용하여 스케일링을 한다.

     계산 순서

    1. 중간값 기준으로 중앙화 : 각 특성에서 median을 빼서, 데이터의 median을 0으로 이동시킨다. 

    Xcentered=Xmedian(X)

    2. IQR로 척도화 : 각 특성을 해당 특성의 IQR로 나눠줍니다. ( IQR = 제 1사분위수(Q1, 25th percentile)와 제 3사분위수(Q3, 75th percentile) 사이의 범위)

    Xscaled=Xcentered / IQR(X)

    from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
    
    # 예제는 표준화 사용. 
    sc = StandardScaler()
    # X_train 의 평균과 표준편차를 구함, 학습은 꼭꼭 train 데이터로만 해야함!!!
    sc.fit(X_train) 
    
    # transform 은 train, test 데이터 둘다 적용하여 변환함
    X_train_scaled = sc.transform(X_train)
    X_test_scaled = sc.transform(X_test)
    
    # train 데이터는 fit과 transform을 한 번에 하기도 함. 절대 test 데이터는 안됨!!
    # X_train_scaled = scaler.fit_transform(X_train)
Designed by Tistory.