본문 바로가기

ML with SckitLearn

라쏘 / 엘라스틱넷 회귀 : Lasso / ElasticNet Model 이란? Scikit Learn에서의 실습

반응형

라쏘 회귀 : 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

 

반응형