정규화
머신 러닝 모델을 구축할 때, 피처 정규화는 굉장히 중요한 역할을 합니다. R & Python에 작성된 라이브러리는 보통 피처를 자동으로 정규화하는 부분이 구현되어있어 종종 우리는 그 중요성을 잊고는 합니다. 그렇다면 어떤 효과와 어떤 이유로 중요한지 알아보겠습니다.
변환
우선 피쳐의 정규화는 데이터셋의 각 피처의 제 각각인 범위를 일정한 범위 내로 맞추어주는 일종의 변환 작업입니다. 크게 표준화와 정규화, 두가지 방법이 있습니다. 이러한 두 방법은 혼용되기도 하지만, 정확히는 다음과 같은 정의를 갖습니다.
- 표준화: 데이터의 평균을 0, 표준편차를 1로 변환 (eg. z-score standardization)
- 정규화: 데이터 값을 0과 1 사이의 범위로 스케일링 (eg. min-max scaling)
사용할 모델이 정규분포를 가정하면 표준화 그렇지 않으면 정규화를 사용하면 됩니다. 그리고 먼저 한쪽으로 쏠려있는 데이터인 경우와 그러한 데이터를 정규분포의 모양으로 만든 뒤 사용해야하는 경우라면, log 변환이나 루트 변환, 심하면 역수변환으로 데이터의 쏠림 현상을 방지할 수 있습니다. 이러한 변환 이 필요하다면, 이 변환 처리 이후에 정규화를 진행하면 됩니다.
그렇다면, 이러한 변환은 알고리즘의 학습과 성능에 어떠한 영향을 미칠까요?
효과
경사하강법
먼저 경사하강법에 있어, 정규화 되지 않은 피쳐는 알고리즘의 수렴 속도를 느리게 합니다. 피쳐 값들의 범위가 크게 달라버리면, 최적화 과정에서 cost function의 형태가 왜곡되어 학습이 느려질 수 있습니다. 예를들어, 피쳐 A의 범위가 0~1이고, B의 범위가 0~1000이라면, 수식상 갱신 속도가 A보다 B가 더 빠르게 진행되어 보다 더 많은 업데이트를 필요로 하게 됩니다. 경사하강법에서 정규화는 이러한 피쳐간의 갱신속도를 맞추어주는 역할을 하게됩니다.
거리기반 기법
특히 더 직접적으로 영향을 받는 알고리즘은 바로 거리기반의 방법론입니다. 단순히 피쳐 A와 B 사이의 거리를 구할 때, 피쳐 정규화 이전과 이후의 차이는 당연히도 매우 클 것입니다.
이러한 방법들을 사용하는 선형회귀, 로지스틱 회귀, SVM, Nerual Nets ...은 피쳐 정규화가 필수적으로 선행되어야 합니다. 그렇다면, 피쳐 정규화가 필요없는 방법도 있을까요? 아마 쉽게 예상 가능할 것 입니다.
트리기반 기법
바로 트리기반의 방법으로, 이 방법은 피처 정규화에 영향을 받지 않습니다. 의사결정 나무에서 노드의 분깃점 마다 기준이 되는 것은 각 피처에 대한 특정 값이며, 이는 변수의 상대적인 크기에 전혀 민감하지 않기 때문입니다.
출처
Book, "The Quest for Machine Learning"
why we have problem with gradients when feature values are of different range?
A blog below mentioned. " Because different features do not have similar ranges of values, gradients may take a long time, oscillate back and forth, and take a long time before they can finall...
datascience.stackexchange.com
[BASIC, TIP] 피처 스케일링이란? 정규화 vs 표준화?
dacon.io