본문 바로가기
Machine Learning

Feature scaling 과 머신러닝 학습

by devson 2024. 4. 26.

머신러닝 모델을 학습시키기 전 feature engineering 과정 중에 feature scaling을 하기도 한다.

feature scale이 학습에 있어서 영향을 주기 때문인데,

이번 포스팅에서는 feature scaling과 머신러닝 학습의 상관 관계에 대해 알아보도록 하겠다.

 

Standardization과 Normalization

먼저 feature scaling에 대표적인 방법인 standardization과 normalization에 대해 짚고 넘어가보자.

 

Standardization (표준화)

(표준화를 대체로 Z-score로 설명하기 때문에, 여기서도 Z-score를 기준으로 설명하겠다)

표준화는 데이터가 표준정규분포의 속성(평균($\mu$)이 0이고 표준편차($\sigma$)가 1)을 갖도록 조정하는 데이터 전처리 방법이다.

$$ z = \frac{x - \mu}{\sigma} $$

 

표준화를 통해 데이터가 변환되면서 데이터의 스케일도 변하는데, 서로 다른 스케일을 가졌던 데이터들도 표준화를 거치면 대체로 비슷한 크기(-3 ~ 3)의 데이터로 변환된다.

 

(Linear regression과 같은, 참고) 데이터의 정규분포를 가정하는 모델의 경우 표준화를 통해 데이터 전처리를 수행한다.

정규분포를 따르는 데이터는 표준화를 해주는 것이 좋다.

 

Normalization (정규화)

(정규화를 대체로 Min-max로 설명하기, 여기서도 때문에 Min-max를 기준으로 설명하겠다)

정규화는 피쳐의 스케일을 0과 1사이로 조정하는 데이터 전처리 방법이다.

 

$$ x_{normalized} = \frac{x - x_{min}}{x_{max} - x_{min}} $$

 

최대/최소값을 사용하기 때문에 이상치가 있는 경우에는 취약하다.

 

 

기본적으로 표준화와 정규화는 데이터 자체의 분포 양상은 변화시키지 않는다.

결국 둘 다 data scaling + shifting 이기 때문이다.

출처: https://www.youtube.com/watch?v=sxEqtjLC0aM
출처: https://www.youtube.com/watch?v=sxEqtjLC0aM

 

아래 데이터의 정규화, 표준화에 따른 분표 변화를 나타낸 것인데, scale은 변화가 있지만 분포 양상은 변하지 않는 것을 확인할 수 있다.

정규화, 표준화에 따른 데이터 분포 변화

더보기
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

np.random.seed(42)
data = np.random.exponential(scale=5, size=1000)
normalized_data = (data - data.min()) / (data.max() - data.min()) # min-max
standardized_data = (data - data.mean()) / data.std() # z-score

plt.figure(figsize=(15, 5))
grid = GridSpec(nrows=1, ncols=3)

# plot raw data
ax_0 = plt.subplot(grid[0])
ax_0.hist(data, bins=50, edgecolor='black')
ax_0.set_title("Raw data")
ax_0.set_xlabel("Value")
ax_0.set_ylabel("Data frequency")

# plot normalized data
ax_1 = plt.subplot(grid[1])
ax_1.hist(normalized_data, bins=50, edgecolor='black')
ax_1.set_title("Nomalized data (Min-Max)")
ax_1.set_xlabel("Value")
ax_1.set_ylabel("Data frequency")

# plot standardized data
ax_2 = plt.subplot(grid[2])
ax_2.hist(standardized_data, bins=50, edgecolor='black')
ax_2.set_title("Standardized data (Z-Score)")
ax_2.set_xlabel("Value")
ax_2.set_ylabel("Data frequency")

 

Feature scaling과 머신러닝 학습

머신러닝 모델의 알고리즘에 따라 feature scaling이 학습에 영향을 줄 수 있다.

 

Gradient Descent based Algorithms

표준화와 정규화를 통해 스케일이 다른 각 피쳐의 데이터 스케일을 맞춰줄 수 있다.

각 피쳐의 스케일을 맞추는 것은 경사하강법을 통한 학습에 있어서 경사의 수렴(convergence)을 더 빠르게 해준다.

 

 

피쳐 $x_{1}, x_{2}$에 대해 $\hat y = w_{1} x_{1} + w_{2} x_{2}$ 이라는 선형 회귀에 대한 선형 식이 있을 때,

$x_{1}$의 값이 매우 크고 $x_{2}$의 값이 작다면, $\hat y$는 상대적으로 $w_{2}$이 비해 $w_{1}$의 변화에 민감할 것이다.

( $\frac{\partial \hat y}{\partial w_{1}} = x_{1}$이고 이 값이 매우 크다고 하였으니)

 

$\hat y$이 $w_{1}$ 변화에 민감하기 때문에, Loss 역시 $\hat y$로 인해 $w_{1}$ 변화에 민감할 것이다.

즉, $\frac{\partial Loss}{\partial w_{1}}$ 값 역시 클 것이다.

 

그리고 경사하강법을 통해 $w_{1}$에 대해 파라미터를 업데이트 하는 수식은 아래와 같은데,

$$w_{1} \leftarrow w_{1} - \alpha \frac{\partial Loss}{\partial w_{1}}$$

$\frac{\partial Loss}{\partial w_{1}}$의 값이 크기 때문에 $w_{1}$이 업데이트 되는 정도가 클 것이다.

 

이렇듯 피쳐의 스케일이 다른 피쳐에 비해 상대적으로 큰 경우, Loss에 영향을 크게 주는 weight(스케일이 큰 피쳐의 weight)의 업데이트도 커지게 된다.

아래 그림의 왼쪽을 보면 Loss가 $w_1$에 대해서는 급격하게 변하는 그래프를 확인할 수 있고,

학습 시 $w_1$에 대해서는 수렴하는 지점 기준으로 학습이 지그재그를 그리며 비효율적으로 이뤄지고 있다.

 

feature scaling을 통해 피쳐 간의 스케일을 맞춰주면 오른쪽과 같이 안정적으로 학습이 이뤄지는 것을 볼 수 있다.

 

 

Distance based Algorithms

KNN이나 K-Means 클러스터링과 같은 데이터 간의 거리를 기반으로 동작하는 알고리즘의 경우 피쳐의 스케일에 영향을 받는다.

왜냐면 피쳐의 스케일이 크면 거리도 멀어질 수 있어 편향된 결과를 미칠 수 있다.

 

예를 들면 아래와 같은 부동산 데이터가 있다고 했을 때,

- 집 크기: $2500m^2$, $4000m^2$

- 방의 수: 3, 5

'집 크기'의 차이는 '1,500' 이지만 '방의 수'의 차이는 '2'이기 때문에, 데이터의 거리를 구할 때 '집 크기'에 편향을 보일 수 있다.

 

각 피쳐의 스케일이 다를 때, 직접적인 대소관계가 없다면 feature scaling을 적용하는 것이 좋다. 

 


 

참고

- https://towardsdatascience.com/an-introduction-to-gradient-descent-c9cca5739307

- https://heeya-stupidbutstudying.tistory.com/entry/%ED%86%B5%EA%B3%84-%EC%A0%95%EA%B7%9C%ED%99%94%EC%99%80-%ED%91%9C%EC%A4%80%ED%99%94

- https://dacon.io/en/forum/406086

'Machine Learning' 카테고리의 다른 글

L1, L2 Regularization  (0) 2024.05.07
Gradient Descent  (0) 2024.03.03
Gradient Vector  (0) 2024.02.19

댓글