카테고리 없음

[0927] Regularized Linear Models – Ridge, Lasso

띄듸니 2021. 10. 6. 10:51

왜 사용하나요? 

-> 과저ㅏㄱ합 막기 위해 불필요한 가중치 사용을 줄여주기 위해

종류 

-> Lasso(L1), Ridge(L2), Elastic Net(L1 + L2)

gradient descent 조절할때 alpha값을 통해 보폭을 조절하게 됨!!! (하강할 때 얼마의 크기로 작아질건지!)

alpha 

w 실제값과 예측값과의 차이 잔차락고 봐도 되는데 산식이 다름

Lasso  : w를 구할 때 맨하튼 거리로 계산

alpha * |w| : 가중치에 절댓값을 씌우는 것으로 영향력 없는 변수를 제거하기 위함이다. 그래서 변수가 제거되기도 한다

-  불필요한 회귀 계수를 급격하게 감소시켜 0으로 만들어 제거해 적절한 피처만 회귀에 포함시키는 피처 선택의 특성을 가지고 있다.

# lasso에 사용될 alpha 파라미터의 값들을 정의
lasso_alphas = [0.07, 0.1, 0.5, 1, 3]

# alphas list 값을 iteration하면서 alpha에 따른 평균 rmse 구함.
for alpha in lasso_alphas :
    lasso = Lasso(alpha = alpha)
    
    #cross_val_score를 이용하여 5 fold의 평균 RMSE 계산
    neg_mse_scores = cross_val_score(lasso, X_data, y_target, scoring="neg_mean_squared_error", cv = 5)
    avg_rmse = np.mean(np.sqrt(-1 * neg_mse_scores))
    print('alpha {0} 일 때 5 folds 의 평균 RMSE : {1:.3f} '.format(alpha,avg_rmse))

-> 쓸모있는 피쳐도 제거해버릴 수도 있기 때문에 애초에 alphas값을 작게 줌

얘는 진짜 급격하게 작아짐 (제거되는 애도 있음)

 

Ridge : w를 구할 때 직선(유클리드) 거리로 계산

alpha * (w)^2 :  가중치를 제곱함 : 회귀계수의 크기를 줄이는 방법으로 변수 자체를 없애지는 못한다.

alpha값이 클수록 회귀계수가 작아지지만 절대 0이 되지는 않음!!!

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

# alphas list 값을 iteration하면서 alpha에 따른 평균 rmse 구함.
for alpha in alphas :
    ridge = Ridge(alpha = alpha)
    
    #cross_val_score를 이용하여 5 fold의 평균 RMSE 계산
    neg_mse_scores = cross_val_score(ridge, X_data, y_target, scoring="neg_mean_squared_error", cv = 5)
    avg_rmse = np.mean(np.sqrt(-1 * neg_mse_scores))
    print('alpha {0} 일 때 5 folds 의 평균 RMSE : {1:.3f} '.format(alpha,avg_rmse))

회귀계수(막대 길이)가 점점 작아지는 걸 볼 수 있음

 

Elastic net (엘라스틱넷 회귀)

L1 규제와 L2 규제를 결합한 회귀 (잘 안씀)

from sklearn.linear_model import ElasticNet
from sklearn.model_selection import cross_val_score

elastic = ElasticNet(alpha = 100, l1_ratio = 0.7)
neg_mse_scores = cross_val_score(elastic, 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(' 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_rmse))

l1_ratio로 l1 비율?을 구함