正則化された線形回帰モデル

# はじめに
正則化された線形回帰モデルについて、[Python機械学習プログラミング 達人データサイエンティストによる理論と実践[第3版]](https://www.amazon.co.jp/%E7%AC%AC3%E7%89%88-Python%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%81%94%E4%BA%BA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-impress-gear/dp/4295010073/ref=sr_1_1_sspa?crid=13Q3FVVMDGDV0&keywords=python+%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92&qid=1645664053&s=books&sprefix=python%2Cstripbooks%2C229&sr=1-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExSkw3S1U2SDhKUlQ2JmVuY3J5cHRlZElkPUExMDIyMTQ0M0VWSDlGTkdVOERZUCZlbmNyeXB0ZWRBZElkPUEzQVdCWUY5Q0xCUVpBJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==) の勉強会にて学んだことをまとめてみました。私と同じように、機械学習を学び始めたばかりという方の参考になれば幸いです。

# 線形回帰モデルにおける正則化の目的
**過学習を防ぐこと**
一言で表すとこのように言えますが、もう少し噛み砕いて説明します。
線形回帰モデルには、多重共線性（ある列が他の列によっておよそ1次式で表現できるような場合）によって、入力をサンプリングし直すごとに学習結果（パラメータの推定）が不安定になるという性質があります。そこで、学習結果として得られるパラメータの数値の大きさを制限して、学習結果を安定させようとする考え方があり、これを**正則化**といいます。学習結果として得られるパラメータの数値の大きさを制限することが、**過学習を防ぐ**ということにもつながります。

# 正則化された線形回帰モデルの考え方
まず、一般的な線形回帰モデルの学習原理について説明します。あるデータ $\\{(x_1, y_1), (x_2, y_2), … , (x_n, y_n)\\}$ が与えられたとすると、一般的には、線形回帰モデルの仮説は以下のように表せます。
$$\hat{y} = w_0 + w_1 x_1 + … + w_p x_p$$
学習時には、各データ点に対して二乗損失を計算し、その平均値（平均二乗損失）
$$J(w) = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2$$
が最小化するようなパラメータ$w$を計算し、仮説$\hat{y}$を予測器として求めます。$J(w)$は目的関数と呼ばれます。

ここで、一般的な線形回帰モデルに正則化を加えるとすると、目的関数は以下のようになります。
$$J(w) = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2 + 正則化項$$
このように、正則化項を加えることで、パラメータの数値の大きさを制限することができます。正則化項は種類によって違うので、次節で詳しく説明します。

# 正則化された線形回帰モデルの種類
Python機械学習プログラミング 達人データサイエンティストによる理論と実践[第3版] では、正則化された線形回帰モデルの種類は3種類紹介されています。

- Ridge回帰
- Lasso回帰
- Elastic Net

一つずつ見ていきます。

## Ridge回帰
Ridge回帰は、L2ノルム（ユークリッド距離）の2乗を正則化項に使っています。
$$J(w) = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2 + \lambda \sum_{j=1}^{m} w_j^2$$
$\lambda$はハイパーパラメータで、正則化をどれだけ重要視するかを決めることができます。$\lambda$の値を増やすと、正則化の強さを引き上げ、パラメータ$w$の範囲をさらに狭めることができます。ここで、L2ノルムの2乗は以下のように表します。
$$||w||\_2^2 = \sum_{j=1}^{m} w_j^2$$
#### 特徴
〇パラメータの範囲を制限しているため、過学習を防ぐ
×特徴量が非常に多い時にはモデルの解釈が複雑

## Lasso回帰
Lasso回帰は、L1ノルム（マンハッタン距離）を正則化項に使っています。
$$J(w) = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2 + \lambda \sum_{j=1}^{m} |w_j|$$
$\lambda$の値によっては特定の変数のパラメータ$w$を0にすることができます。
ここで、L1ノルムは以下のように表します。
$$||w||\_1 = \sum_{j=1}^{m} |w_j|$$
#### 特徴
〇いくつかの回帰係数が０になるので、特徴量選択を自動的に行う
×サンプルサイズn以上の特徴量を選択できない

## Elastic Net
Elastic Netは、Ridge回帰とLasso回帰の折衷案で、L1正則化項とL2正則化項を使います。
$$J(w) = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2 + \lambda_1 \sum_{j=1}^{m} w_j^2 + \lambda_2 \sum_{j=1}^{m} |w_j|$$
#### 特徴
ハイパーパラメータ$\lambda_1, \lambda_2$の調整によるが、それぞれの正則化項による特徴が合わさるイメージ。

L1正則化項：いくつかの回帰係数を0にする
L2正則化項：Lasso回帰の取り込める特徴量の数に制限があるという問題点をカバーできる

# 正則化された線形回帰モデルの実装
ここでは、それぞれのモデルの初期化コードのみ紹介します。
### Ridge回帰
```python:Ridge
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=1.0)
```
引数のalphaはハイパーパラメータ$\lambda$のことで、この$\lambda$によって正則化の強さが制御されます。

### Lasso回帰
```python:Lasso
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=1.0)
```
こちらの引数alphaもRidge回帰同様、正則化の強さを制御することができます。

### Elastic Net
```python:Elastic Net
from sklearn.linear_model import ElasticNet
EN = ElasticNet(alpha=1.0, l1_ratio=0.5)
```
ここで、scikit.learnでは、次のように目的関数を式変形して$\lambda_1, \lambda_2$を決めています。
```math
\begin{align}
J(w) &= \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2 + \lambda_1 \sum_{j=1}^{m} w_j^2 + \lambda_2 \sum_{j=1}^{m} |w_j|\\
&= \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y_i})^2 + \frac{\lambda(1-l_1)}{2}\sum_{j=1}^{m} w_j^2 + \lambda l_1 \sum_{j=1}^{m} |w_j|
\end{align}
```
よって、引数alphaはRidge回帰とLasso回帰と同様、正則化の強さを決めるハイパーパラメータ$\lambda$で、l1_ratioはL1正則化項とL2正則化項のどちらの比率を強めるかを決めるハイパーパラメータです。

# まとめ
今回は、Python機械学習プログラミング 達人データサイエンティストによる理論と実践[第3版]の正則化された線形回帰モデルの内容を少し噛み砕いてまとめてみました。Kaggleのボストンの住宅価格予想のデータセットを使って実装してみると理解が深まると思います。

# 参考
https://www.amazon.co.jp/%E7%AC%AC3%E7%89%88-Python%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%81%94%E4%BA%BA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-impress-gear/dp/4295010073/ref=sr_1_1_sspa?crid=K23RDT2UV8FT&keywords=python+%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92&qid=1645686996&s=books&sprefix=p%2Cstripbooks%2C228&sr=1-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzQjUyVUdQVjMyNkYzJmVuY3J5cHRlZElkPUEwNzczNzg1MkZIRUZNRUkyUlhRVSZlbmNyeXB0ZWRBZElkPUEzQVdCWUY5Q0xCUVpBJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==

https://aizine.ai/ridge-lasso-elasticnet/

https://cochineal19.hatenablog.com/entry/2021/05/16/133121