카테고리 없음
[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 비율?을 구함