ラッソ回帰(Lasso Regression)
Overview
ラッソ回帰は、リッジ回帰に代わる線形回帰手法です。リッジ回帰では、正則化にL1正則化を用います。これにより、いくつかの係数が完全にゼロになります。これは、モデルにおいていくつかの特徴量が完全に無視されるということになります。いくつかの係数がゼロになると、モデルを解釈しやすくなり、どの特徴量が重要なのかが明らかになります。
Theory
正則化項を追加した目的関数
$ J(\theta) = \frac{1}{2m}(\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda\sum_{j=1}^{n}|\theta_j|)
このように、ラッソ回帰では、正則化項にL1ノルムを用います。L1ノルムとは、ベクトル成分の絶対値の和(マンハッタン距離)を取って計算されるものです。
マンハッタン距離の数式
$ d = |(b_1 - a_1)| + |(b_2 - a_2)|
Coding(Regression)
extended bostonデータセットでモデルを構築・学習・評価する
code: Python
import mglearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
lasso = Lasso().fit(X_train, y_train)
print('Training set score: {:.2f}'.format(lasso.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(lasso.score(X_test, y_test)))
print('Number of features used: {}'.format(np.sum(lasso.coef_ != 0)))
--------------------------------------------------------------------------
Training set score: 0.29
Test set score: 0.21
Number of features used: 4
--------------------------------------------------------------------------
この通り、訓練セットに対しても、テストセットに対しても、非常に悪いスコアになっています。つまり適合不足しています。さらに、104の特徴量のうち4つしか使っていないことも分かります。これはデフォルトでパラメータalphaが1.0となっているためです。適合不足の度合いを減らすには、alphaを減らします。
extended bostonデータセットでパラメータalphaを調整してモデルを構築・学習・評価・可視化して比較する
code: Python
import mglearn
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
# max_iterの値を増やしている
# こうしておかないとモデルが、max_iterを増やすように警告を発する
lasso001 = Lasso(alpha=0.01, max_iter=100000).fit(X_train, y_train)
print('Training set score: {:.2f}'.format(lasso001.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(lasso001.score(X_test, y_test)))
print('Number of features used: {}'.format(np.sum(lasso001.coef_ != 0)))
lasso00001 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)
print('Training set score: {:.2f}'.format(lasso00001.score(X_train, y_train)))
print('Test set score: {:.2f}'.format(lasso00001.score(X_test, y_test)))
print('Number of features used: {}'.format(np.sum(lasso00001.coef_ != 0)))
# alphaパラメータのモデルへの影響を可視化
plt.plot(lasso.coef_, 's', label='Lasso alpha=1.0')
plt.plot(lasso001.coef_, '^', label='Lasso alpha=0.01')
plt.plot(lasso00001.coef_, 'v', label='Lasso alpha=0.0001')
plt.plot(ridge01.coef_, 'o', label='Ridge alpha=0.1')
plt.xlabel('Coefficient index')
plt.ylabel('Coefficient magnitude')
plt.ylim(-25, 25)
plt.legend(ncol=2, loc=(0, 1.05))
plt.show()
--------------------------------------------------------------------------
Training set score: 0.90
Test set score: 0.77
Number of features used: 33
Training set score: 0.95
Test set score: 0.64
Number of features used: 94
--------------------------------------------------------------------------
https://gyazo.com/382ab48875995d0557f0a91bafe92cbf
このように、alphaが1.0の場合には、ほとんどの係数がゼロになっています。
Summary
一部の特徴量だけが重要な場合や、モデルのどの特徴量が重要なのかを説明しやすくしたい場合ならば、ラッソ回帰を使うべきですが、そうでないならばリッジ回帰を使うのが無難です。
Merit
モデルを解釈しやすくなる
Demerit
いくつかの特徴量の情報が完全に失われる
Parameters
alpha
デフォルトは1.0
大きくすると正則化が強くなる