「Pythonではじめる機械学習」を読んで（１）

## 読んだ本

以下の本を読んだ。読みながら気になった理論について調べつつ記載をしていく。

「Pythonではじめる機械学習」
![picture_large978-4-87311-798-0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472670/8dbc0e11-8004-a428-01e0-33ae57e63f53.jpeg)


## 1章 はじめに

機械学習を活用できる分野、Pythonの基礎、機械学習の基礎。
基本的な内容のため割愛。

## 2章 教師あり学習
### クラス分類と回帰
　2クラス分類と多クラス分類。
　回帰の場合は連続値の予測

　**連続性があるかどうかで判断。**
　
### 汎化、過学習(overfitting)、適合不足(underfitting)
　**データ量が多く、バリエーションに富んでいれば、より複雑なモデルを利用できる**

### k-最近傍法(k-NN法)
　判定対象のk個の近傍点を探し、多数派のクラスに属すると考えるモデル。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472670/c53c01a4-01fa-687e-f513-a6c6224e796e.png)

　近傍点の数を多くすればするほど、決定境界はより滑らかになる
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472670/72daa2e8-23e4-fbc1-766d-f5ca70080cb6.png)

　**理解しやすく高い性能を示す一方、処理速度が遅く特徴量を増やすことができないため、実際にはあまり利用されていない**

### 線形モデル(linear model)

　線形モデルによる予測式は以下のようになる。
　$ x[0] $ ～ $ x[p] $ は特徴量を示す。 $ \hat{y} $ はモデルの予測値を示す。

　$$\hat{y} = w[0] \times x[0]+w[1] \times x[1]+ \cdots + w[p] \times x[p] + b$$

#### 線形回帰（最小二乗法、Linear Regression）
　線形回帰にはパラメータがなく、モデルの複雑さを制御できない。
　特徴量が少ない場合、過学習を引き起こす可能性は低いが、特徴量が増えると、過学習が発生する可能性が高まる。
　しかし、パラメータが存在しないため、調整できない。
　**別のモデルを探さないといけない**

#### リッジ回帰(Ridge Regression)
　式自体は最小二乗法と同じ。
　ただし、係数(w)を0に近づけることで、特徴量が出力に与える影響を減らそうとしている。
　（傾きを小さくしようと正則化している。）
　リッジ回帰で利用される正則化はL2正則化と呼ばれる。

　**正則化**：過学習を防ぐために明示的にモデルを制約している。

　以下を最小にするイメージ。$y$：テストデータ　$\hat y$：予測値　$w$：係数
　$$\sum_{i=1}^n {| y_n - \hat y_n|}^2 + \frac{\lambda}{2}\sum_{i=1}^n|w_i|^2  $$

　scikit-learnのRidge回帰のハイパーパラメータは`alpha`だけであるが、おそらく、$\lambda$が`alpha`にあたると思われる。alphaが大きくなるとモデルが制限されることは上記の式からわかる。alphaが小さくなれば、線形回帰に近づく。
　実装にあたっては、ベクトル形式に直す必要がある。

　**参考**
　https://qiita.com/g-k/items/d3124eb00cb166f5b575

　また、データ数が多くなれば、過学習は防げるため、正則化は必要なくなっていく。

#### ラッソ回帰(Lasso Regression)
　リッジ回帰と同様、線形回帰に正則化項を追加したもの。L1正則化を行う。
　いくつかの係数が完全に0になるため、特徴量をいくつか無視する。
　リッジ回帰よりもモデルを解釈しやすく、特徴量の重要性がわかりやすい。

　以下を最小にするイメージ。$y$：テストデータ　$\hat y$：予測値　$w$：係数
　$$\sum_{i=1}^n {| y_n - \hat y_n|}^2 + \lambda\sum_{i=1}^n|w_i|  $$

#### リッジ回帰とラッソ回帰の使い分け
　基本はリッジ回帰でよい。
　ただし、特徴量が多く、重要な特徴量が少ないことが予測される場合はラッソ回帰のほうが向いている可能性が高い。
　また、解釈しやすいモデルが良い場合はラッソ回帰ほうが良い。

　※備考
　scikit-learnにはLassoとRidgeのペナルティを組み合わせたElasticNetクラスがある。
　L1正則化項とL2正則化項のパラメータを調整する必要があるが、最良の結果をもたらす。

### 線形モデルをクラス分類に適用する
<!--
コメントアウト
　2クラス分類の場合、以下の式で予測を行う。

　$$w[0] \times x[0]+w[1] \times x[1]+ \cdots + w[p] \times x[p] + b (=\hat y)> 0$$

　2つのクラスの決定境界を予測式として利用する。
　基本的な考え方は、「最も尤もらしい決定境界を選択する」＝確率が最も高い決定境界を求める


　よく利用されるのは以下の2つ
　・ロジスティック回帰(Logistic Regression)
　・線形サポートベクタマシン(Linear Support Vector Machines : SVM)

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472670/3ae8f414-821b-7957-a5eb-7ef4894fb795.png)
-->

#### 線形回帰と非線形回帰
| 分析方法 | 応答変数 | 確率モデル | 推定方法 |
|:-:|:-:|:-:|:-:|
| 回帰分析 | 連続変数 | OLS（最小二乗法） | 線形確率モデル |
| ロジスティック回帰分析 | 質的変数 | MLE（最尤法） | 非線形確率モデル |
| プロビット回帰分析 | 質的変数 | MLE（最尤法） | 非線形確率モデル |

　線形モデルの場合、$\hat y < 0$、$\hat y > 1$となることがあり、非線形モデルの場合は、$0<\hat y < 1$の間に収まる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472670/2eaf7598-1148-ec5d-49cd-37820fb8734a.png)

　目的変数が0または1などの分類問題を線形確率モデルで分析する場合、以下の課題がある

1. 不均一分散になる
1. $\hat y$ の予測値（確率）が0と1を超えてしまう。
1. 説明変数の値によって傾きが異なり、係数の推定にはバイアスが発生する。

　対処法としては以下のようになる
1. 頑強な標準誤差や GLS(一般化最小二乗法)を使えば正しく推定可能　*よくわかっていない。
1. 説明変数が極端でない値をとる限りは、深刻な問題ではない
1. 非線形モデル（「プロビットモデル」や「ロジットモデル」）を使って推定する

#### 線形モデルを非線形モデルに変換する
　以下の線形モデルを
　$\hat{y} = \beta_0 + \beta_1x +\varepsilon$
　以下のように変形する。
　$\hat{y} = F(\beta_0 + \beta_1x) +\varepsilon$

　説明変数xがどのような値でも確率$\hat y$が0～1の間に収まるように「累積分布関数F」を利用して変形を行う。
　この際の変換方法が2種類あり、以下のとおりである。

| 変換方法 | 分布関数 | 特徴 | 仕様分野 |
|:-:|:-:|:-:|:-:|
| Logit Model | ロジスティック分布 | 計算が簡素で解釈が用意 | 社会・心理・医療系 |
| Probit Model | 正規分布 | 計算式が複雑だが理論的に正当 | 経済学系 |

**理論的に正当**：世の中の多くは正規分布で近似でき、正規分布を利用することに合理性があること。
Logit Model と Probit Model の推定結果はほとんど同じため、どちらを利用しても問題ない。

#### Logit Modelの基礎知識
1. オッズ（Odds）

    ある事象が起こる確率$p$と起こらない確率$1-p$の比
    $$Odds = \frac{p}{1-p} $$
<!--
1. オッズ比
    ある事象の起こりやすさを2つの群で比較して示す尺度
    集団A内での発生確率pと集団B内での発生確率qを比較し、以下のように表す。
    $$OddsRatio = \frac{Odds[p]}{Odds[q]} = \frac{p/(1-p)}{q/(1-q)} = \frac{p(1-q)}{(1-p)q}$$

    $p=0.8$、$q=0.2$とした場合、
    $${Odds}_p = \frac{0.8}{1-0.8} = 4 $$
    $${Odds}_q = \frac{0.2}{1-0.2} = 0.2 $$

    となり、$OddsRatio= 4.0/0.25 = 16$となる。

    集団Aでは集団Bの16倍起こりやすいということを示している。
-->
1. 対数オッズ (Log Odds = logit)
    Oddsは下限が0となるため、説明変数としては扱いにくいため、対数変換を行う。
    これがlogitとなる。

    ※特徴
    $p=0$のとき、${Odds}_p = 0$となるため、 ${logit}_p = -\infty$
    $p=0.5$のとき、${Odds}_p = 1$となるため、 ${logit}_p = 0$
    $p=1$のとき、${Odds}_p = \infty$となるため、 ${logit}_p = \infty$

1. ロジスティック関数
    上記のlogit関数は0～1で表される確率pを実数全体へと射影する。
    となると、実数全体で表されるものを0～1で表したい場合はlogit関数の逆関数（＝ロジスティック関数）を利用すればよい、となる。

    話を元に戻し、線形モデル（実数全体で表される）を非線形モデル（0～1で表される）に変換する場合にこのロジスティック関数が利用できる。

    $$logit(p) = \log_e(Odds) = \log_e \frac{p}{1-p} = \log_e p - \log_e (1-p) $$
    
    逆関数を取り、以下のようになる

    $$ \phi(p) = e^{\frac{p}{(1-p)}} = e^p * \frac{1}{e^{1-p}} = \frac{1}{1+e^{-p}} $$

    先ほどの線形モデルを非線形モデルに変換するときにこのロジスティック関数を利用したとした場合、

    
    $\hat{y} = \beta_0 + \beta_1x +\varepsilon$
    以下のように変形できる。この式をロジスティック回帰分析に利用する。
    $\hat{y} = \phi (\beta_0 + \beta_1x) +\varepsilon = \frac{1}{1+e^{-(\beta_0 + \beta_1x)}} + \varepsilon$

    **参考**
    http://www.ner.takushoku-u.ac.jp/masano/class_material/waseda/keiryo/R31_logistic1.html
#### ロジスティック回帰分析の手順
　予測関数にロジスティック関数（＝シグモイド関数）を利用する。

　2値分類の場合、$\phi (p) > 0.5$のとき、クラス1に分類され、$\phi (p) < 0.5$のとき、クラス0に分類されると考える。
　
　$\phi (p)$によって得た予測値と実際のデータによる分類の誤差を最小にすることを目指す。
　ここではクロスエントロピーを利用する。
　すなわち、真の確率分布pと推定した確率分布qを以下の式で表現する。

$$
H(p,q) = \sum_x p(x)\log q(x)
$$

　この値が最も小さくなるように重みwを調整していく。

　最適化していく際の方法としては損失関数の偏微分を取って傾きを求める、勾配降下法を利用する。
　※数式よくわからないが、イメージとしてはこんな感じ・・・

　**参考**
　https://enjoyworks.jp/tech-blog/3087

　また、ロジスティック回帰にも正則化を行うことができ、L2正則化とL1正則化が利用できる。
　正則化パラメータはCとしてsciki-learnに実装されている

#### 他クラス分類への応用
　2クラス分類アルゴリズムを多クラス分類アルゴリズムへ適用する場合、1体その他として、複数の2クラス分類を行うことで実施する。
　詳細は省略

## おわりに
　まだ全体の半分くらいしか読み解けていない（脱線もしつつなので）
　次回以降は決定木を理解したい。