라쏘 회귀 : Lasso Model
W의 절댓값에 페널티를 부여하는 L1규제를 선형 회귀에 적용한 것이 라쏘(Lasso)회귀입니다. 즉 L1규제는 alpha*||W||를 의미합니다. Lasso 또한 비용 함수를 최소화하는 W를 찾는 것을 의미합니다. L2규제가 회귀 계수의 크기를 감소시키는 데 반해, L1규제는 불필요한 회귀 계수를 급격하게 감소시켜 0으로 만들고 제거합니다.
이러한 의미에서 L1규제는 적절한 Feature만 회귀에 포함시키는 Feature선택의 특성을 가지고 있습니다.
코드의 get_linear_reg_eval함수는 회귀값을 쉽게 구하기 위한 공통 함수이며 GitHub에서 찾을 수 있습니다.
Lasso클래스의 주요 생성 파라미터는 alpha이며, 이는 라쏘 회귀의 alpha L1규제 계수에 해당합니다.
def get_linear_reg_eval(model_name, params=None, X_data_n=None, y_target_n=None, verbose=True):
coeff_df = pd.DataFrame()
if verbose:
print('####### ', model_name , '#######')
for param in params:
if model_name =='Ridge':
model = Ridge(alpha=param)
elif model_name =='Lasso':
model = Lasso(alpha=param)
elif model_name =='ElasticNet':
model = ElasticNet(alpha=param, l1_ratio=0.7)
neg_mse_scores = cross_val_score(model, X_data_n, y_target_n, scoring="neg_mean_squared_error", cv=5)
avg_rmse = np.mean(np.sqrt(-1 * neg_mse_scores))
print('alpha {0}일 때 5 폴드 세트의 평균 RMSE: {1:.3f} '.format(param, avg_rmse))
model.fit(X_data_n, y_target_n)
coeff = pd.Series(data=model.coef_ , index=X_data_n.columns )
colname='alpha:'+str(param)
coeff_df[colname] = coeff
return coeff_df
import Common_Module.Common_Module as CM
from sklearn.datasets import load_boston
import pandas as pd
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)
lasso_alphas = [0.07,0.1,0.5,1,3]
coeff_lasso_df = CM.get_linear_reg_eval('Lasso', params=lasso_alphas, X_data_n=x_data, y_target_n=y_target)
print(coeff_lasso_df)
결과를 보면0.07일 때 가장 좋은 평균 RMSE를 보여줍니다. alpha의 크기가 증가함에 따라 일부 피처의 회귀 계수는 아예 0으로 바뀌고 있습니다. NOX속성은 alpha가 0.07일 때부터 회귀 계수가 0이며, alpha를 증가시키면서 INDUS, CHAS와 같은 속성의 회귀 계수가 0으로 바뀌게 됩니다. 회귀 계수가 0인 Feature는 회귀 식에서 제외되면서 피처 선택의 효과를 얻을 수 있습니다.
####### Lasso #######
alpha 0.07일 때 5 폴드 세트의 평균 RMSE: 5.612
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 5.615
alpha 0.5일 때 5 폴드 세트의 평균 RMSE: 5.669
alpha 1일 때 5 폴드 세트의 평균 RMSE: 5.776
alpha 3일 때 5 폴드 세트의 평균 RMSE: 6.189
alpha:0.07 alpha:0.1 alpha:0.5 alpha:1 alpha:3
CRIM -0.098193 -0.097894 -0.083289 -0.063437 -0.000000
ZN 0.049059 0.049211 0.049544 0.049165 0.037231
INDUS -0.042120 -0.036619 -0.005253 -0.000000 -0.000000
CHAS 1.434343 0.955190 0.000000 0.000000 0.000000
NOX -0.000000 -0.000000 -0.000000 -0.000000 0.000000
RM 3.789725 3.703202 2.498212 0.949811 0.000000
AGE -0.011706 -0.010037 0.003604 0.020910 0.042495
DIS -1.176583 -1.160538 -0.936605 -0.668790 -0.000000
RAD 0.270936 0.274707 0.277451 0.264206 0.061864
TAX -0.014290 -0.014570 -0.015442 -0.015212 -0.008602
PTRATIO -0.765107 -0.770654 -0.758752 -0.722966 -0.265072
B 0.010248 0.010249 0.009469 0.008247 0.006510
LSTAT -0.560431 -0.568769 -0.656290 -0.761115 -0.807679
엘라스틱넷 회귀 : ElasticNet Model
엘라스틱넷(Elastic Net)회귀는 L2규제와 L1규제를 결합한 회귀입니다. 따라서 엘라스틱넷 회귀 비용 함수의 목표는 RSS(W)+alpha2*||W||+alpha1*||W||식을 최소화하는 W를 찾는 것입니다.
엘라스틱넷은 Lasso 회귀가 서로 상관관계가 높은 피처들의 경우에 이들 중에서 중요 피처만을 선택하고 다른 피처들은 모두 회귀 계수를 0으로 만드는 성향이 강합니다. 이런 성향으로 인해 alpha값에 따라 회귀 계수의 값이 급격히 변동할 수도 있는데, 엘라스틱넷 회귀는 이를 완화하기 위해 L2규제를 Lasso 회귀에 추가한 것입니다. 엘라스틱넷 회귀의 단점은 L1와 L2규제가 결합된 규제로 인해 수행 시간이 상대적으로 오래 걸린다는 것입니다.
Scikit Learn의 ElasticNet 클래스의 주요 생성 파라미터는 alpha와 11_ratio입니다. 엘라스틱넷의 규제는 a*L1 + b*L2로 정의될 수 있으며, 이 때 a는 L1규제의 alpha값, b는 L2규제의 alpha값입니다. 따라서 ElasticNet클래스의 alpha파라미터 값은 a+b입니다. ElasticNet클래스의 l1_ratio파라미터 값은 a/(a+b)입니다. l1_ratio가 0이면 a가 0이므로 L2규제와 동일합니다. l1_ratio가 1이면 b가 0이므로 L1규제와 동일합니다.
elastic_alphas = [0.07, 0.1, 0.5, 1, 3]
coeff_elastic_df = CM.get_linear_reg_eval('ElasticNet', params=elastic_alphas, X_data_n=x_data, y_target_n=y_target)
print(coeff_elastic_df)
0.5일때 가장 RMSE가 가장 좋습니다. alpha값에 따른 피처들의 회귀 계수드 값이 라쏘보다는 상대적으로 0이 되는 값이 적음을 알 수 있습니다.
####### ElasticNet #######
alpha 0.07일 때 5 폴드 세트의 평균 RMSE: 5.542
alpha 0.1일 때 5 폴드 세트의 평균 RMSE: 5.526
alpha 0.5일 때 5 폴드 세트의 평균 RMSE: 5.467
alpha 1일 때 5 폴드 세트의 평균 RMSE: 5.597
alpha 3일 때 5 폴드 세트의 평균 RMSE: 6.068
alpha:0.07 alpha:0.1 alpha:0.5 alpha:1 alpha:3
CRIM -0.099468 -0.099213 -0.089070 -0.073577 -0.019058
ZN 0.050107 0.050617 0.052878 0.052136 0.038268
INDUS -0.044855 -0.042719 -0.023252 -0.000000 -0.000000
CHAS 1.330724 0.979706 0.000000 0.000000 0.000000
NOX -0.175072 -0.000000 -0.000000 -0.000000 -0.000000
RM 3.574162 3.414154 1.918419 0.938789 0.000000
AGE -0.010116 -0.008276 0.007760 0.020348 0.043446
DIS -1.189438 -1.173647 -0.975902 -0.725174 -0.031208
RAD 0.278880 0.283443 0.300761 0.289299 0.146846
TAX -0.014522 -0.014814 -0.016046 -0.016218 -0.011417
PTRATIO -0.779498 -0.784725 -0.790969 -0.738672 -0.423065
B 0.010122 0.010067 0.009114 0.008320 0.007020
LSTAT -0.574822 -0.587702 -0.693861 -0.760457 -0.800368
Process finished with exit code 0
'ML with SckitLearn' 카테고리의 다른 글
머신러닝, 클러스터 가우시안 가상데이터 생성하는 make_blobs를 이용한 K-means 실습 (Elbow Method 사용) (0) | 2020.12.03 |
---|---|
Light GBM(LGBM)의 개요와 파라미터 정의에 대해 (0) | 2020.11.19 |
Faiss를 이용한 K-means구현 [사이킷런에 비해 8X 빠르고, 27X 적은 에러 구현] (0) | 2020.11.14 |
로지스틱 회귀 : Logistic Regression, 시그모이드(sigmoid)를 이용한 분류 회귀 (0) | 2020.10.25 |
릿지 회귀 : Ridge 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 |