반응형
릿지 회귀 : 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
반응형
'ML with SckitLearn' 카테고리의 다른 글
Light GBM(LGBM)의 개요와 파라미터 정의에 대해 (0) | 2020.11.19 |
---|---|
Faiss를 이용한 K-means구현 [사이킷런에 비해 8X 빠르고, 27X 적은 에러 구현] (0) | 2020.11.14 |
로지스틱 회귀 : Logistic Regression, 시그모이드(sigmoid)를 이용한 분류 회귀 (0) | 2020.10.25 |
라쏘 / 엘라스틱넷 회귀 : Lasso / ElasticNet Model 이란? Scikit Learn에서의 실습 (0) | 2020.10.24 |
Regulation(규제) 선형 모델에 대한 개요 - 릿지(Ridge), 라쏘(Lasso), 엘라스틱(Elastic Net) (0) | 2020.10.20 |
train_test_split()의 사용과 교차 검증 cross_val_score 이용하기 (0) | 2020.10.18 |
선형 회귀 분석 - LinearRegression 및 보스턴 주택 가격 회귀 구현 (0) | 2020.10.18 |
머신러닝에서의 회귀 분석 : 소개, 단순선형회귀, 경사 하강법 (0) | 2020.10.17 |