다중공선성과 정규화: 언제, 왜, 어떻게 해결할까?
잡학다식의 지식공방

빅데이터 관련 자료

다중공선성과 정규화: 언제, 왜, 어떻게 해결할까?

carpe08 2025. 4. 5. 12:13
320x100

머신러닝이나 통계 모델링을 할 때, 다중공선성(Multicollinearity) 문제를 자주 마주하게 됩니다. 특히 회귀 분석에서 다중공선성이 발생하면 모델이 불안정해지고 해석이 어려워질 수 있습니다. 많은 사람들이 이를 해결하기 위해 정규화(Normalization) 를 시도하지만, 과연 정규화가 다중공선성을 해결할 수 있을까요? 이번 글에서는 다중공선성과 정규화의 관계를 살펴보고, 더 효과적인 해결 방법을 알아보겠습니다.


1. 다중공선성이란?

다중공선성이란 독립 변수들 간의 강한 상관관계가 존재하는 현상을 의미합니다. 쉽게 말해, 서로 유사한 정보를 가진 변수들이 많아질 경우, 회귀 모델이 이를 제대로 구분하지 못하고 계수(β)가 불안정해지는 문제가 발생합니다.

🔍 다중공선성이 문제를 일으키는 이유

  • 회귀 계수(β)의 불안정성 증가: 작은 데이터 변화에도 계수가 급격히 변함
  • 해석 어려움: 특정 변수의 효과를 명확하게 분리할 수 없음
  • 예측 성능 저하: 과적합(Overfitting) 가능성이 높아짐

✅ 다중공선성 확인 방법: VIF(Variance Inflation Factor)

VIF는 다중공선성을 측정하는 지표로, 일반적으로 VIF 값이 10 이상이면 다중공선성이 높다고 판단합니다.

from statsmodels.stats.outliers_influence import variance_inflation_factor
import pandas as pd

# 예제 데이터 로드
X = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [2, 4, 6, 8, 10],
    'C': [5, 3, 2, 8, 7]
})

# VIF 계산
vif_data = pd.DataFrame()
vif_data['Feature'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)

위 코드에서 VIF 값이 높게 나온다면, 다중공선성을 해결할 필요가 있습니다.


2. 정규화가 다중공선성을 해결할 수 있을까?

정규화(Normalization 또는 Standardization)는 데이터의 스케일을 조정하는 기법입니다. 하지만 중요한 점은 정규화가 다중공선성을 직접적으로 해결하지는 않는다는 것입니다.

❌ 왜 정규화만으로 해결되지 않을까?

정규화는 개별 변수의 크기를 조정하는 작업일 뿐, 변수들 간의 강한 상관관계를 제거하지 않기 때문입니다. 즉, 다중공선성이 있는 데이터를 정규화한다고 해서 변수 간의 강한 연관성이 사라지는 것은 아닙니다.

✅ 하지만 Lasso/Ridge 회귀를 적용하면 다중공선성 완화 가능!

  • Ridge 회귀 (L2 정규화): 계수를 작게 만들어 다중공선성의 영향을 줄임
  • Lasso 회귀 (L1 정규화): 중요하지 않은 변수를 완전히 제거하여 다중공선성을 해결할 수도 있음
from sklearn.linear_model import Ridge, Lasso

ridge = Ridge(alpha=1.0)
ridge.fit(X, y)  # X: 독립변수, y: 종속변수

위와 같이 Ridge 회귀를 사용하면 다중공선성으로 인해 모델이 불안정해지는 문제를 완화할 수 있습니다.


3. 다중공선성을 해결하는 더 효과적인 방법

정규화 이전에 다중공선성을 직접 해결할 수 있는 방법을 고려하는 것이 더 효과적입니다.

🔹 1) VIF를 활용한 변수 제거

VIF 값이 높은 변수를 제거하면 다중공선성을 줄일 수 있습니다.

X = X.drop(columns=['B'])  # VIF 값이 높은 변수 제거

🔹 2) 상관행렬 분석을 통한 변수 선택

피어슨 상관계수를 확인하여 강한 상관관계를 보이는 변수를 제거할 수도 있습니다.

import seaborn as sns
import matplotlib.pyplot as plt

sns.heatmap(X.corr(), annot=True, cmap='coolwarm')
plt.show()

🔹 3) PCA(주성분 분석) 활용

PCA를 사용하면 변수들을 새로운 축으로 변환하여 다중공선성을 낮출 수 있습니다.

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

🔹 4) 도메인 지식을 활용한 변수 선택

비슷한 의미를 가진 변수들이 많다면, 도메인 지식을 활용하여 중요한 변수만 선택하는 것도 좋은 방법입니다.


4. 결론: 다중공선성 해결을 위한 최적의 접근법

방법 효과 활용 사례

정규화(Normalization) 직접적인 해결책이 아님 단순 스케일 조정
Lasso/Ridge 회귀 다중공선성 완화 가능 회귀 모델 적용 시 유용
VIF 기반 변수 제거 가장 직접적인 해결 방법 다중공선성 문제 제거
상관행렬 분석 변수 간 상관관계 파악 유사한 변수 중 하나만 선택
PCA(주성분 분석) 차원 축소로 다중공선성 해결 고차원 데이터 분석

즉, 정규화는 다중공선성 해결에 직접적인 도움이 되지 않으며, 해결 방법으로는 Lasso/Ridge 회귀, 변수 선택, PCA 등이 더 적절합니다. 🚀


따라서,,,

1. 정규화는 다중공선성을 해결하지 못함

2. 다중공선성을 해결하려면 VIF 분석, 변수 제거, PCA, Ridge/Lasso 회귀 등을 고려해야 함

3. 정규화는 모델의 성능 향상을 위한 보조적인 역할일 뿐, 다중공선성 자체를 해결하지는 않음

앞으로 회귀 모델을 적용할 때, 다중공선성 문제를 피하기 위해 위의 방법들을 활용해 보세요!

320x100
320x100