본문 바로가기

Python/Sklearn for ML

3 - About Ridge Regression(리지 회귀분석에 대하여) & Optimizing the Parameter(계수 최적화) with Python

저번 포스팅(2 - 선형회귀 분석의 단점과 보완방법)에서는 단순 다중 회귀분석 보다는 Ridge Regression을 사용하는 것이 데이터 분석에 있어 효과적이 라는것에 대하여 언급을 했다(이유: 계수의 표준편차)

 

이번 포스팅에서는 Ridge Regression에 대해서 살펴보고, Ridge Regression에 대해서 살펴보고, Ridge Regression에 필요한 계수들의 최적화 방법의 대해서도 살펴보겠다

 

우선 단순 선형회귀분석에서 계수를 최적화하는 방법은 잔차의 제곱식을 가장 작에 만들어 주는 계수를 선택하는 방법이고, 식으로는

 

선형 회귀분석의 RSS

다음과 같다. 즉 RSS를 최소화 시켜주는 계수를 선택하는것이 선형회귀 분석의 계수 선택방법이었다. 하지만 이런식으로 로 독립변수의 계수를 선택하게 되면, 데이터의 샘플 수(기간)이나 혹은 독립변수의 갯수의 따라 계수 값들이 다양해 지기 때문에 종속변수를 설명하는데 있어 독립변수의 일관적인 영향력을 설명할 수 없게 될 수 있다.

 

따라서 이러한 방법을 보완하는 방법으로는 Shrinkage Methods(추정된 계수들의 변동(variange)를 대폭 줄이는 방법) 중 Ridge Regression이 있다

 

Ridge Regression은 선형회귀 분석과 비슷한 방식이지만 RSS의 식에 하나의 조건을 붙여준다. 바로 

 

Ridge Regression의 최소화 조건 식

계수의 제곱의 합에 람다라는 변수를 곱한 Term(항)을 추가해 주는 것이다. 즉, 말로 풀어보면 모든 계수의 제곡합에 람다라는 변수를 곱해 최소화 해주는 것인데, 이러한 텀이 추가됨에 따라 단순 RSS뿐만 아니라 계수의 크기 마저 고려함으로써 계수를 선택하게 되는 것이다. 

 

만약 여기서 람다가 0이라면 Ridge Regression의 계수는 선형회귀 분석의 계수와 같을 것이며, 람다의 크기가 클수록 RSS 보다는 계수의 크기에 초점을 맞추어 계수를 선택하게 된 것이다.

 

어쨌거나 저 식을 최소화하는 계수를 선택하는 것이기 때문에 람다가 크다면 계수의 크기를 줄여야 해당 식의 최소화를 구할 수 있을 것이다.

 

Ridge Regression과 선형회귀분석으로 구한 계수의 차이 및 결과의 대해서는 지난번 포스팅(2 - 선형회귀 분석의 단점과 보완방법)에 언급했다.

 

이제부터 Python Code를 이용해서 Ridge Regression의 람다를 선택하는 방법을 알아보자.

(참고로 코드에서 CV = Cross Validation 방법이 나오는데, 해당 방법의 대해서는 다음번 포스팅에서 언급하도록 하고, 이번 포스팅에서는 파이썬을 이용해 람다를 어떻게 찾는지에 대해서만 살펴보도록 하겠다)

 

import numpy as np
from sklearn.datasets import make_regression

# Creation Regression Data Set
reg_data, reg_target = make_regression(n_samples=100, n_features=2, effective_rank=1, noise=10)

from sklearn.linear_model import RidgeCV

#rcv = Ridge-Cross-Validation
#This performs a cross-validation similar to leave one out-cross-validation
rcv = RidgeCV(alphas = np.array([.1, .2, .3, .4]))
rcv.fit(reg_data, reg_target)

#%%

rcv.alpha_ # 에러가 가장 작은 alpha를 출력

alphas_to_test = np.linspace(0.01, 2)
rcv3 = RidgeCV(alphas=alphas_to_test, store_cv_values=True)
rcv3.fit(reg_data, reg_target)

rcv3.cv_values_.shape #Test 50 different alpha values, 각각의 alpha의 따른 Error들

smallest_idx = rcv3.cv_values_.mean(axis=0).argmin() #Error의 평균중에서 가장 작은 값을 나타내는 alpha를 선택
alphas_to_test[smallest_idx]
rcv3.alpha_
#%%
import matplotlib.pyplot as plt
plt.plot(alphas_to_test, rcv3.cv_values_.mean(axis=0))

Alpha값의 따른 Error의 평균