正則化項（LASSO）を理解する

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

```math
\hat {y} = Xa
```
＊$X:$ 観測データの集合行列 （詳細は[前回記事](https://qiita.com/kento1109/items/3bfa934fbdfcef8ef186)参照） $a:$パラメータ
　
で表した場合、観測値と予測値の二乗誤差関数$R(a)$は下記式で定義される。

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

正則化の概要については[前回記事](https://qiita.com/kento1109/items/815bdd3f1549d86611d4)で記載した。
$R(a)$に$L_1$正則化項を加えて

```math
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$の算出は下記の最小化問題と等価。

```math
\min _{ a }{\;\parallel y-Xa\parallel^2  }
```
ここに、$L_1$正則項を加えることは、下記の制約条件を加えたことになる。

```math
||a||\le  r 
```
$d=2$ の場合、$a_1+a_2\le r$なので、$a_1,a_2$の取り得る値は四角の範囲内に制限される。
<img width="188" alt="L1.png" src="https://qiita-image-store.s3.amazonaws.com/0/204732/d24ec4d6-f8fe-60be-43cd-f40195ad59bd.png">
最小二乗解が赤線で求められる場合、$a_2=0$となり、次元が一つ減ることになる。
<img width="188" alt="L1.png" src="https://qiita-image-store.s3.amazonaws.com/0/204732/8eb6feb9-cc19-04f7-2d6b-483747cf860e.png">

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

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

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


```py
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)

```

#### ２．結果の確認

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

```py
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になっているのが分かる。
また、誤差の値も正則化なしと比べても大きく変化はない。

#### ３．適切なパラメータの決定

[LassoCV](http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LassoCV.html#sklearn.linear_model.LassoCV)がクロスバリデーションによって最適な正則化項を見つけてくれる。

```py
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についても、どっかで実装しながら理解を深めたい。。