특성 스케일링 방법

박동현·6일 전
2

머신러닝에서 대개의 알고리즘들은 입력된 숫자 특성들의 스케일이 다르면 제대로 작동하지 않습니다.

이를 위해 특성 스케일링을 거쳐줘야 합니다.

특성 스케일링을 거치면 경사하강법에서 Local Minima에 빠질 위험을 줄이고, 스케일이 큰 특성의 영향력이 커지는 것을 방지할 수 있습니다.

특성 스케일링에는 다음과 같은 방법들이 있습니다.

정규화 ( Normlization )

표준화 ( Standardization )

하나씩 알아볼까요?

정규화

  • 일반적으로 0 ~ 1의 범위를 가집니다.
  • 사이킷런의 MinMaxScaler 추정기를 통해 쉽게 구현할 수 있습니다. feature_range 매개변수를 통해 0 ~ 1이 아닌 범위에 들도록 값을 조정할 수 있습니다.
  • 정규화는 데이터 - 최소값 / 최대값 - 최소값 를 통해 스케일을 조정합니다.

from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler(feature_range=(-1, 1)) # -1 ~ 1로 값의 범위를 조정했습니다.
scaled_data = min_max_scaler.fit_transform(data)

표준화

  • 항상 평균이 0 입니다.
  • 사이킷런의 StandardScaler 추정기를 통해 쉽게 구현할 수 있습니다.
  • 표준화는 데이터 - 평균 / 표쥰편차를 통해 스케일을 조정합니다.

표준화 수식

from sklearn.preprocessing import StandardScaler
standard_scaler = StandardScaler()
data_std_scaled = standard_scaler.fit_transform(data)

변환

특성 분포의 꼬리가 두꺼울 때 (평균에서 멀리 떨어진 값이 지수적으로 줄어들지 않는 경우) 스케일링과 표준화는 대부분의 값을 작은 범위로 압축합니다. 하지만 일반적으로 머신러닝 모델에게 그다지 효과적이지 않습니다. 따라서 특성을 스케일링 하기 전에 두꺼운 꼬리를 줄이도록 변환하고 분포가 대략적으로 대칭이 되도록 만들어야 합니다.

오른쪽 꼬리가 두꺼운 양수 특성인 경우에는 일반적으로 특성을 제곱근을 취해 변환할 수 있습니다. (0 ~ 1 사이의 값에서는 특성을 거듭제곱하여 변환할 수 있습니다.)

만약 멱법칙 분포처럼 특성 분포의 꼬리가 아주 길고, 두껍다면 특성을 로그 값으로 바꾸는 것이 도움이 될 수 있습니다. 로그값을 취하고나면 가우스 분포(정규 분포)에 가까워집니다.

멱법칙 분포
멱법칙 분포
가우스 분포(정규분포)

꼬리가 두꺼운 특성을 처리하는 또 다른 방법은 특성을 구간화(Buketizing 또는 Binning)하는 것입니다. 분포를 거의 동일한 크기의 버킷으로 나눠 범주화하는 것입니다. 거의 동일한 크기의 버킷을 사용하면 균등 분포인 특성을 만듭니다. 따라서 추가적으로 스케일링을 할 필요도 없어집니다. 또는 버킷 개수로 나누어 0 ~ 1 사이의 범위로 만들 수 있습니다.

특성이 멀티모달 분포(다붕 분포, 정점이 2개이상 나타나는 분포)일때 구간화를 사용하면 도움이 될 수 있습니다.

다만, 범주형 데이터이니 수치형 데이터로 한번 더 변환시켜서 사용해야합니다. 범주형 데이터를 수치형 데이터로 변환시키는 과정은 다음에 설명하겠습니다.

이런 방법을 사용하면 회귀 모델이 특성값의 여러 범주에 대해서 다양한 규칙을 쉽게 학습할 수 있습니다.

멀티모달 분포를 변환하는 또 다른 방법은 특성간의 유사도를 나타내는 특성을 추가하는 것입니다. 유사도 측정은 일반적으로 입력값과 중심점 사이의 거리에만 의존하는 방사 기저 함수를(RBF) 사용합니다.

방사 기저 함수에 대해서는 아직 제대로 이해가 되지 않아 참고 자료를 올려둡니다. https://m.blog.naver.com/sw4r/221497261535

가장 널리 사용되는 RBF는 가우스 RBF입니다. 사이킷런의 rbf_kernel() 함수를 사용하면 유사도를 재는 새로운 가우스 RBF 특성을 손쉽게 만들 수 있습니다.

profile
"벽은 없다" - 샘 알트만

0개의 댓글