본문 바로가기

ML with SckitLearn

릿지 회귀 : Ridge Model 이란? Scikit Learn에서의 실습

반응형

릿지 회귀 : Ridge Model

 

사이킷런에서의 Ridge 클래스의 주요 생성 파라미터는 alpha이며, 릿지 회귀의 alpha L2규제 계수에 해당합니다. 

 

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_boston
from sklearn.linear_model import Ridge
import matplotlib.pyplot as plt
import seaborn as sns

import pandas as pd
import numpy as np

boston = load_boston()
bostonDF = pd.DataFrame(boston.data, columns=boston.feature_names)
bostonDF['PRICE'] = boston.target
y_target = bostonDF['PRICE']
x_data = bostonDF.drop(['PRICE'], axis=1, inplace=False)
X_train, X_test, y_train, y_test = train_test_split(x_data, y_target, test_size=0.3, random_state=156)

print(bostonDF)
print(y_target)
print(x_data)

#alpha=10으로 설정해 릿지 회귀 수행
ridge = Ridge(alpha=10)
neg_mse_scores = cross_val_score(ridge, x_data, y_target, scoring='neg_mean_squared_error', cv=5)
rmse_scores = np.sqrt(-1*neg_mse_scores)
avg_mse = np.mean(rmse_scores)

print('5 folds의 개별 Negative MSE scores: ', np.round(neg_mse_scores, 3))
print('5 folds의 개별 RMSE scores: ', np.round(rmse_scores, 3))
print('5 folds의 평균 RMSE: {0:.3f}'.format(avg_mse))

 

하기 결과를 보면 선형 회귀와 다른 결과를 보여줌을 나타냈니다. 

5 folds의 개별 Negative MSE scores:  [-11.422 -24.294 -28.144 -74.599 -28.517]
5 folds의 개별 RMSE scores:  [3.38  4.929 5.305 8.637 5.34 ]
5 folds의 평균 RMSE: 5.518

 

이번에는 Ridge의 alpha값을 변화시키면서 RMSE와 회귀 계수 값의 변화를 살펴보겠습니다. 

#Ridge에 사용될 alpha 파라미터의 값을 정의
alphas = [0, 0.1, 1, 10, 100]

#alphas list값을 반복하면서 alpha에 따른 평균 rmse를 구함
for alpha in alphas:
    ridge = Ridge(alpha=alpha)

    #cross_val_score를 이용해 5folds의 평균 RMSE계산
    neg_mse_scores = cross_val_score(ridge, x_data, y_target, scoring='neg_mean_squared_error', cv=5)
    rmse_scores = np.sqrt(-1 * neg_mse_scores)
    avg_rmse = np.mean(rmse_scores)
    print('alpha {0}일 때 5folds의 평균 RMSE: {1:.3f} '.format(alpha, avg_rmse))

 

alpha가 100일 때 평균 RMSE가 5.330로 가장 좋습니다.

alpha 0일 때 5folds의 평균 RMSE: 5.829 
alpha 0.1일 때 5folds의 평균 RMSE: 5.788 
alpha 1일 때 5folds의 평균 RMSE: 5.653 
alpha 10일 때 5folds의 평균 RMSE: 5.518 
alpha 100일 때 5folds의 평균 RMSE: 5.330 

 

alpha값에 대한 변화를 시각적으로 나타내보겠습니다.

#각 alpha에 따른 회귀 계수 값을 시각화하기 위한 준비
fig, axs = plt.subplots(figsize=(18,6), nrows=1, ncols=5)

#각 alpha에 따른 회귀 계수 값을 데이터로 저장하기 위한 DataFrame생성
coeff_df = pd.DataFrame()

#alphas 리스트 갑슬 차례로 입력해 회귀 계수 값 시각화 및 데이터 저장. pos는 axis의 위치 지정
for pos, alpha in enumerate(alphas):
    ridge = Ridge(alpha=alpha)
    ridge.fit(x_data, y_target)

    #alpha에 따른 피처별로 회귀 계수를 Series로 변환하고 이를 DataFrame의 컬럼으로 추가.
    coeff = pd.Series(data=ridge.coef_, index=x_data.columns)
    colname='alpha:'+str(alpha)
    coeff_df[colname] = coeff

    #막대 그래프로 각 alpha값에서의 회귀 계수를 시각화, 회귀 계수값이 높은 순으로 표현
    coeff = coeff.sort_values(ascending=False)
    axs[pos].set_title(colname)
    axs[pos].set_xlim(-3,6)
    sns.barplot(x=coeff.values, y=coeff.index, ax=axs[pos])

plt.show()
print(coeff_df)

 

alpha값을 계속 증가시킬수록 회귀 계수 값은 지속적으로 작아짐을 알 수 있습니다. 특히 NOX Feature의 경우 alpha값을 계속 증가시킴에 따라 회귀 계수가 크게 작아지고 있습니다.

 

값이 증가하면서 회귀 계수가 지속적으로 작아지고 있음을 알 수 있습니다. 하지만 Ridge 회귀의 경우 회귀 계수를 0으로 만들지는 않습니다.

           alpha:0  alpha:0.1    alpha:1  alpha:10  alpha:100
CRIM     -0.108011  -0.107474  -0.104595 -0.101435  -0.102202
ZN        0.046420   0.046572   0.047443  0.049579   0.054496
INDUS     0.020559   0.015999  -0.008805 -0.042962  -0.052826
CHAS      2.686734   2.670019   2.552393  1.952021   0.638335
NOX     -17.766611 -16.684645 -10.777015 -2.371619  -0.262847
RM        3.809865   3.818233   3.854000  3.702272   2.334536
AGE       0.000692  -0.000269  -0.005415 -0.010707   0.001212
DIS      -1.475567  -1.459626  -1.372654 -1.248808  -1.153390
RAD       0.306049   0.303515   0.290142  0.279596   0.315358
TAX      -0.012335  -0.012421  -0.012912 -0.013993  -0.015856
PTRATIO  -0.952747  -0.940759  -0.876074 -0.797945  -0.829218
B         0.009312   0.009368   0.009673  0.010037   0.009393
LSTAT    -0.524758  -0.525966  -0.533343 -0.559366  -0.660764

 

반응형