LoginSignup
60
69

More than 5 years have passed since last update.

正則化項(LASSO)を理解する

Last updated at Posted at 2017-10-13

LASSOについて

はじめに、線形回帰モデルの予測値$\hat {y}$を

\hat {y} = Xa

*$X:$ 観測データの集合行列 (詳細は前回記事参照) $a:$パラメータ
 
で表した場合、観測値と予測値の二乗誤差関数$R(a)$は下記式で定義される。

R(a)=||y-Xa||^2

正則化の概要については前回記事で記載した。
$R(a)$に$L_1$正則化項を加えて

R(a)=||y-Xa||^2+\lambda||a||\;\;\;\;(||a||=\sum _{ i=1 }^{ d }{ a_i } )

とすることを$L_1$正則化と言う。

次元圧縮について

LASSOはleast absolute shrinkage and selection operator の略であり、shrinkageが意味する通り、次元圧縮(変数$a$のうちできるだけ少ない変数を使って$y$を予測)が$L_1$正則化の目的である。
$L_1$正則化がない場合、$a$の算出は下記の最小化問題と等価。

\min _{ a }{\;\parallel y-Xa\parallel^2  }

ここに、$L_1$正則項を加えることは、下記の制約条件を加えたことになる。

||a||\le  r 

$d=2$ の場合、$a_1+a_2\le r$なので、$a_1,a_2$の取り得る値は四角の範囲内に制限される。
L1.png
最小二乗解が赤線で求められる場合、$a_2=0$となり、次元が一つ減ることになる。
L1.png

*$L_2$正則化の場合、制約条件は $||a||^2\le r $ なので、取り得る値は円形の範囲に制限される。

*L2正則化とは違い、L1正則化では|w|がw=0で微分できない。
 L2正則化のように簡単に計算できず、数値的に求める必要がある。

1.求めてみる

ここでは、数学的な証明は割愛し、L1正則化の効果の確認に焦点を当てる。
なんで、可能な限りscikit-learnのライブラリを使用した。
データセットは、diabetes(糖尿病患者の検査数値と 1 年後の疾患進行状況)を使用。

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn import linear_model

diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)

alpha = [10, 1, 0, 0.1]

for a in alpha:
    clf = linear_model.Lasso(alpha=a)
    clf.fit(X_train, y_train)
    y_true, y_pred = y_test, clf.predict(X_test)

    print 'alpha=%.1f' % a, clf.coef_
    print 'mse=(alpha%.1f):' % a, mean_squared_error(y_true, y_pred)

2.結果の確認

正則化パラメータは、[10, 1, 0, 0.1]で検証。(0 は正則化なし)

alpha=10.0 [ 0.  0.  0.  0.  0.  0. -0.  0.  0.  0.]
mse(alpha=10.0): 5101.49352133

alpha=1.0 [   0.            0.          407.69646929    0.            0.            0.
   -0.            0.          371.10978846    0.        ]
mse(alpha=1.0): 3541.56574584

alpha=0.0 [ -52.46990773 -193.51064549  579.48277627  272.46404224 -504.7240054
  241.68441227  -69.73619165   86.62018318  721.95579923   26.77887028]
mse(alpha=0.0): 3097.146139

alpha=0.1 [  -0.         -119.31680615  571.71193009  213.44348648  -15.6273867
  -64.57692007 -241.80314296    0.          526.21404185    0.        ]
mse(alpha=0.1): 3124.40845263

正則化パラメータ10の場合、全ての値が0になっている。
また、誤差値も大きい。(正則化が厳しすぎる。)

一方、0.1の場合、3変数が0になっているのが分かる。
また、誤差の値も正則化なしと比べても大きく変化はない。

3.適切なパラメータの決定

LassoCVがクロスバリデーションによって最適な正則化項を見つけてくれる。

clf = linear_model.LassoCV(n_alphas=20)
clf.fit(X_train, y_train)
y_true, y_pred = y_test, clf.predict(X_test)

print 'alpha', clf.alpha_
print 'coef:', clf.coef_
print 'mse:', mean_squared_error(y_true, y_pred)

>> alpha 0.030105986244
>> coef: [ -31.61627977 -168.7080637   579.42526996  250.86866705 -152.36439422
   -0.         -230.85041776    0.          598.27973612   15.81230894]
>> mse: 3120.72065558

適切なモデルの選択は、AIC(モデル選択基準値)等を基準として判断すべき。
AICについても、どっかで実装しながら理解を深めたい。。

60
69
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
69