라쏘(Lasso) 모델
- L1 규제를 활용한 선형 회귀 모델이다
- $Error=MSE+\alpha |w|$
Steps
학습
from sklearn.linear_model import Lasso
# 알파값이 커질 수록 큰 규제
alphas = [100, 10, 1, 0.1, 0.01, 0.001, 0.0001]
# 알파별로 학습시키기
for alpha in alphas:
lasso = Lasso(alpha=alpha)
lasso.fit(x_train, y_train)
pred = lasso.predict(x_test)
# mse_eval 함수는 자체적으로 만듦
mse_eval('Lasso(alpha={})'.format(alpha), pred, y_test)
- 라쏘에서는 규제를 거의 안줄 때가 가장 좋고(0.001), 릿지에서는 0.1정도가 좋았다
coefficients 시각화
def plot_coef(columns, coef):
coef_df = pd.DataFrame(list(zip(columns, coef)))
coef_df.columns=['feature', 'coef']
coef_df = coef_df.sort_values('coef', ascending=False).reset_index(drop=True)
fig, ax = plt.subplots(figsize=(9, 7))
ax.barh(np.arange(len(coef_df)), coef_df['coef'])
idx = np.arange(len(coef_df))
ax.set_yticks(idx)
ax.set_yticklabels(coef_df['feature'])
fig.tight_layout()
plt.show()
- alpha가 100일 때
lasso_100 = Lasso(alpha=100)
lasso_100.fit(x_train, y_train)
lasso_pred_100 = lasso_100.predict(x_test)
plot_coef(x_train.columns, lasso_100.coef_)
lasso_100.coef_
$\quad\rightarrow$ 거의 모든 피처가 모델 학습에 영향을 끼치지 않음. 따라서 퍼포먼스가 떨어지는 것
- alpha가 0.001일 때
lasso_001 = Lasso(alpha=0.001)
lasso_001.fit(x_train, y_train)
lasso_pred_001 = lasso_001.predict(x_test)
plot_coef(x_train.columns, lasso_001.coef_)
lasso_001.coef_
$\quad\rightarrow$ 알파값 100 보다 훨씬 좋아졌다
- 학습 데이터셋이 적을수록, 한계가 많을수록 강한 규제를 주는게 좋다. 가지고 있는 데이터셋에 과하게 적합할수록 예측력이 떨어지는 위험이 더 크기 때문이다