인공지능/머신러닝
회귀분석-릿지 회귀(Ridge Regression)
2^7
2024. 10. 30. 21:00
릿지 회귀(Ridge Regression)
선형 회귀의 한 형태로, 정규화(Regularization) 기법을 통해 모델의 과적합(Overfitting)을 방지하는 데 사용함, 릿지 회귀는 회귀 계수의 크기를 제한하여, 복잡한 모델이 되는 것을 막고 모델의 일반화 성능을 높임
1. 릿지 회귀 기본 개념
- L2 정규화를 사용하는 회귀 모델로, 회귀 계수의 크기를 제곱해 패널티를 부과함
- 이를 통해 계수가 지나치게 커지는 것을 막아 과적합을 방지
- 릿지 회귀의 손실함수는 일반적인 선형 회귀에서 사용하는 평균 제곱 오차(Mean Squared Error, MSE) 손실 함수에 규제 항을 추가함
- 값이 클수록 계수에 더 큰 패널티를 부과하여 모델의 복잡성을 낮추고, 작을수록 패널티가 줄어들어 일반 선형 회귀와 비슷해짐
![]() |
2. 릿지 회귀 장점
1) 과적합 방지
- 릿지 회귀는 높은 차원의 데이터셋에서 다중공선성(multicollinearity)이 존재할 때 유용
- 다중공선성은 독립 변수들 간의 상관관계가 높은 경우를 말하며, 이런 경우 선형 회귀 모델의 계수가 불안정해질 수 있음
- 릿지 회귀는 과적합을 방지하여 데이터에 대한 예측 성능을 향상시킴
2) 정규화 강도 조절
- 값에 따라 패널티 정도를 조절할 수 있으며, 최적의 λ를 찾기 위해 교차 검증(Cross-Validation)을 사용할 수 있음
- λ가 너무 크면 모델이 과소적합(underfitting)될 수 있으므로 적절한 값으로 조정하는 것이 중요함
3. 릿지 회귀 학습 방법
릿지 회귀의 목적은 위 손실 함수를 최소화하는 회귀 계수 벡터 β를 찾는 것으로 주요 학습 방법에는 정규 방정식과 경사 하강법이 있음
1) 정규 방정식
- 폐쇄형 솔루션을 사용해 릿지 회귀의 최적 해를 구하는 방법
- 이 방법은 데이터의 차원이 적고 계산이 가능한 경우 유리함
- 정규 방정식을 사용하면 행렬 계산을 통해 최적의 β를 직접 계산할 수 있지만, 데이터가 매우 큰 경우 역행렬 계산이 비효율적이어서 경사 하강법이 더 적합할 수 있음
![]() |
2) 경사 하강법
- 경사 하강법은 반복적으로 손실 함수를 미분한 기울기를 사용해 계수를 업데이트하는 방법
- 데이터가 매우 큰 경우 또는 차원이 높은 경우, 경사 하강법이 효율적
- 경사 하강법에서는 아래식을 반복하여 손실 함수가 최소화될 때까지 업데이트
- 확률적 경사 하강법(Stochastic Gradient Descent, SGD)을 사용하여 데이터 샘플 하나씩 학습할 수도 있음
![]() |
4. 릿지 회귀 특징
- 과적합을 방지하여 모델의 일반화 성능을 높임
- 다중공선성 문제를 완화하여 회귀 계수를 안정화
- 계수의 크기를 제어할 뿐이므로, 실제로 계수가 0이 되지 않아 일부 변수를 완전히 제외하고 모델을 단순화하기 어려운 점이 있음
- 모든 독립 변수를 포함하여 예측 모델을 학습하기 때문에 해석이 어려울 수 있음
5. 릿지 회귀와 라쏘 회귀의 비교
릿지 회귀와 비슷한 정규화 방법으로 라쏘 회귀(Lasso Regression)가 있으며 라쏘 회귀는 L1 정규화를 사용하여, 일부 회귀 계수를 0으로 만들어 변수 선택이 가능하게 함
- 릿지 회귀
- L2 정규화 사용. 회귀 계수를 0에 가깝게 만들지만 완전히 0이 되지는 않음.
- 주로 모델의 복잡도를 줄이기 위해 사용됩니다.
- 라쏘 회귀
- L1 정규화 사용. 일부 회귀 계수를 완전히 0으로 만들어 변수 선택이 가능하여 특성 선택이 필요할 때 유용
Python의 Scikit-learn 라이브러리를 사용하여 간단하게 릿지 회귀 모델을 구현하는 방법
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
# 예제 데이터 생성
X = np.random.rand(100, 1) * 10 # 0~10 사이의 값을 가진 데이터
y = 3 + 2 * X + np.random.randn(100, 1) * 2 # 실제 데이터(잡음 포함)
# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 릿지 회귀 모델 생성 및 학습 (λ=1)
ridge_model = Ridge(alpha=1.0) # alpha가 λ에 해당
ridge_model.fit(X_train, y_train)
# 예측
y_pred = ridge_model.predict(X_test)
# 평가
mse = mean_squared_error(y_test, y_pred)
print("Mean Squared Error:", mse)
728x90