AI/Machine Learning

선형회귀 Regularization(Lasso, Ridge 등) 수행 시 연속형 변수의 표준화가 수렴속도에 미치는 영향

Linuxias 2024. 6. 28. 19:27
반응형

선형 회귀에서 회귀계수에 대해 Regularization(정규화)을 할 때, 연속형 변수에 대한 표준화 또는 정규화가 매우 중요합니다. 그 이유는 다음과 같습니다.

  1. 회귀계수의 크기:
    • 정규화 기법들(L1 정규화(Lasso)나 L2 정규화(Ridge))은 회귀계수의 크기를 제어하는 데 사용됩니다. 만약 독립 변수들의 스케일이 다르면, 스케일이 큰 변수는 더 큰 회귀계수를 가지게 되어 정규화의 효과가 비대칭적으로 적용될 수 있습니다.
  2. 정규화 페널티의 일관성:
    • L1 및 L2 정규화는 페널티 항을 추가하여 회귀계수를 줄이는 방식입니다. 이 때, 변수들의 스케일이 동일하지 않으면 페널티가 각 변수에 공평하게 적용되지 않아 모델이 왜곡될 수 있습니다.
  3. 수렴 속도:
    • 표준화된 데이터는 경사 하강법과 같은 최적화 알고리즘의 수렴 속도를 빠르게 합니다. 이는 학습 시간을 줄이고, 더 나은 해를 찾는 데 도움이 됩니다.

따라서, 연속형 변수에 대해 표준화(Standardization) 또는 정규화(Normalization)를 수행하는 것이 권장됩니다. 표준화는 각 변수의 평균을 0, 표준편차를 1로 변환하는 것이며, 정규화는 값을 특정 범위로 스케일링하는 것입니다. 표준화가 일반적으로 더 자주 사용되며, 특히 정규화 기술을 사용하는 경우에는 필수적이라고 할 수 있습니다.

실제 사용 예:

from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge

# 예제 데이터
X = [[1, 2], [2, 3], [4, 5], [6, 8], [10, 12]]
y = [1, 2, 3, 4, 5]

# 표준화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 정규화 회귀 모델
model = Ridge(alpha=1.0)
model.fit(X_scaled, y)

print("회귀계수:", model.coef_)

위 예제에서는 StandardScaler를 사용하여 데이터를 표준화한 후, Ridge 회귀 모델을 학습시켰습니다. 이렇게 하면 정규화의 효과가 변수들에 공평하게 적용되어 보다 안정적이고 해석 가능한 모델을 얻을 수 있습니다.

표준화된 데이터가 경사 하강법의 수렴 속도를 빠르게 하는 이유는 주로 조건수(Condition Number)와 관련이 있습니다. 조건수가 낮으면 경사 하강법이 더 빠르게 수렴할 수 있습니다. 자세히 설명하자면:

  1. 조건수(Condition Number):
    • 조건수는 행렬이 얼마나 잘 조절되는지, 즉 얼마나 민감하게 반응하는지를 나타내는 지표입니다. 회귀 문제에서 조건수는 설계 행렬(X)의 스케일링과 관련이 있습니다. 표준화되지 않은 데이터는 서로 다른 스케일을 가지기 때문에 설계 행렬의 조건수가 높아질 수 있습니다. 이는 경사 하강법이 최적의 값에 도달하는 데 더 많은 시간이 걸리게 만듭니다.
    • 반면, 데이터를 표준화하면 각 변수의 스케일이 비슷해지면서 설계 행렬의 조건수가 낮아져 경사 하강법의 수렴 속도가 빨라집니다.
  2. 경사 하강법의 방향과 크기:
    • 경사 하강법은 손실 함수의 기울기를 따라 이동하면서 최적점을 찾습니다. 표준화되지 않은 데이터의 경우, 변수의 스케일 차이로 인해 각 변수의 기울기 크기도 크게 달라집니다. 이렇게 되면 학습률을 적절히 설정하기 어렵고, 어느 한 방향으로는 너무 크게 이동하거나 너무 작게 이동하게 됩니다.
    • 데이터를 표준화하면 모든 변수의 스케일이 유사해져서 기울기 계산이 더 균형 있게 이루어지며, 학습률을 적절하게 설정하여 최적화 과정을 더 효율적으로 진행할 수 있습니다.
  3. 등고선의 모양:
    • 손실 함수의 등고선이 축 방향으로 찌그러져 있는 경우, 표준화되지 않은 데이터에서는 최적점에 도달하기 위해 지그재그 경로를 따라가는 경향이 있습니다. 이는 수렴 속도를 늦춥니다.
    • 표준화된 데이터는 등고선이 더 원형에 가까워지도록 만들어 최적화 경로를 더 직선에 가깝게 하여 수렴 속도를 높입니다.

아래는 표준화된 데이터와 표준화되지 않은 데이터에 대한 경사 하강법의 수렴 속도를 비교하는 예제입니다:

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt

# 데이터 생성
X, y = make_regression(n_samples=1000, n_features=2, noise=0.1, random_state=42)

# 표준화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 경사 하강법 모델
model_unscaled = SGDRegressor(max_iter=1, tol=None, learning_rate='constant', eta0=0.01, random_state=42)
model_scaled = SGDRegressor(max_iter=1, tol=None, learning_rate='constant', eta0=0.01, random_state=42)

# 손실 값을 저장할 리스트
loss_unscaled = []
loss_scaled = []

# 에폭 수
epochs = 100

# 학습 및 손실 값 기록
for epoch in range(epochs):
    model_unscaled.partial_fit(X, y)
    model_scaled.partial_fit(X_scaled, y)

    # 예측값 계산
    y_pred_unscaled = model_unscaled.predict(X)
    y_pred_scaled = model_scaled.predict(X_scaled)

    # MSE 계산
    mse_unscaled = np.mean((y - y_pred_unscaled) ** 2)
    mse_scaled = np.mean((y - y_pred_scaled) ** 2)

    loss_unscaled.append(mse_unscaled)
    loss_scaled.append(mse_scaled)

# 손실 값 그래프
plt.plot(loss_unscaled, label='Unscaled Data')
plt.plot(loss_scaled, label='Scaled Data')
plt.xlabel('Epochs')
plt.ylabel('Mean Squared Error')
plt.legend()
plt.title('Comparison of Convergence Speed')
plt.show()

이 예제에서 SGDRegressor를 사용하여 표준화된 데이터와 표준화되지 않은 데이터에 대해 경사 하강법을 적용하고 손실 함수 값을 비교합니다. 표준화된 데이터는 더 빠르게 최적의 손실 값에 도달하는 것을 확인할 수 있습니다.

따라서 표준화된 데이터는 조건수를 낮추고, 기울기 계산의 균형을 맞추며, 손실 함수의 등고선을 원형에 가깝게 만들어 경사 하강법의 수렴 속도를 크게 향상시킵니다.

반응형