「ロジスティック回帰分析」について

ロジスティック回帰分析の考え方

* 参考にしたもの：[機械学習のエッセンス](https://www.sbcr.jp/product/4797393965/)の第05章「機械学習アルゴリズム」
* [回帰](https://qiita.com/kazuya_minakuchi/items/186b20efd0eefdeb026b)、[サポートベクターマシン](https://qiita.com/kazuya_minakuchi/items/5102f2d1d865980f279a)は別ページ

# ロジスティック回帰分析とは

* [二値分類](https://ja.wikipedia.org/wiki/%E4%BA%8C%E9%A0%85%E5%88%86%E9%A1%9E)に使われるアルゴリズム。(=ラベルが2種類の教師あり訓練データ)
* **例1:ある人のデータから、病気が発症しているorしていないの判定**
* **例2:商品のデータ(大きさ、形、キズなど)から、その商品が合格or不合格の判定**

## ロジスティック回帰モデル

* $y$：コレが「0になるのか」「1になるのか」で、ラベルがどちらか予測したい
* $\mathbf{x}=(x_1, x_2, \cdots, x_n)$：コレを使って、$y$が0なのか1なのかを予測したい
* $P(Y=0|X=\mathbf{x})$：$\mathbf{x}$をもとに計算される、$y$が0になる確率。コレが0.5(50%)を超えるとき、「$y=0$」と予測する
* $P(Y=1|X=\mathbf{x})$：$\mathbf{x}$をもとに計算される、$y$が1になる確率。コレが0.5(50%)を超えるとき、「$y=1$」と予測する
* ※今回は、2パターンしかないので「$P(Y=0|X=\mathbf{x}) + P(Y=1|X=\mathbf{x}) = 1$」となる

今回は<font color="Red">「yが0になる確率」または「yが1になる確率」を使ってyを予測</font>したい。
しかし確率は必ず0~1 (0%~100%)であるのに対し、通常の重回帰分析は

```math
f(\mathbf{x}) = w_0 + w_1x_1 + w_2x_2 + \cdots + w_nx_n = w_0 + \sum_{i=1}^{n} w_ix_i = \mathbf{w}\mathbf{\tilde{x}} \\
\mathbf{\tilde{x}} = (1, x_1, x_2, \cdots, x_n)
```

と表され、予測結果が0~1の範囲から飛び出る可能性があり、確率の予測に向いてない。
そのため、[シグモイド関数](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B0%E3%83%A2%E3%82%A4%E3%83%89%E9%96%A2%E6%95%B0)を使って0~1に収まるように変換する。
※シグモイド関数:

```math
\sigma(\xi)= \frac{1}{1+e^{-\xi}}
```

↓こんなの($\lim_{\xi \to \infty}$で1に、$\lim_{\xi \to -\infty}$で0に近づく)
![シグモイド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/f9f12916-7a46-592e-1b7a-e947b57dd126.png)

コレの$\xi$に$f(\mathbf{x})$を放り込んで、「yが1になる確率」を

```math
P(Y=1|X=\mathbf{x}) = \sigma(f(\mathbf{x})) = \sigma(\mathbf{w}\mathbf{\tilde{x}})
```

と表し、<font color="Red">訓練データの正答率が一番高くなるような、パラメータ$\mathbf{w}=(w_0, w_1, w_2, \cdots, w_n)$を求める。</font>


## サンプル

winequality-red( http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality のwinequality-red.csv)に適用した例

* 簡単に図を作るため、↓を行っている
  * quality（=目的変数）が3と8のものだけ考える
  * 説明変数は"volatile acidity"と"alcohol"の2つだけで考える
* 点 = 実際のデータ（教師データ）
* 新しいデータに対しては、境界線のどちらに居るかで予測する
* 図を作ったコードはココ( https://github.com/kzy611/qiita/blob/master/LogisticRegression_winequality-red.ipynb )

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/6d2a5752-5379-72d9-9583-ce2b89894392.png)

## パラメータ(係数)の求め方

今回、$P(Y=0|X=\mathbf{x})$は「$P(Y=1|X=\mathbf{x})$ではない確率」なので、

```math
\begin{align}
P(Y=0|X=\mathbf{x}) &= 1-P(Y=1|X=\mathbf{x}) \\
&= 1-\sigma(\mathbf{w}\mathbf{\tilde{x}})
\end{align}
```

$y=0$の場合と$y=1$の場合を合体させると、↓のようになり

```math
P(Y=y|X=\mathbf{x}) = \left\{
\begin{array}{ll}
\sigma(\mathbf{w}\mathbf{\tilde{x}}) & (y = 1) \\
1-\sigma(\mathbf{w}\mathbf{\tilde{x}}) & (y = 0)
\end{array}
\right.
```

1つの式で表そうとすると↓のようになる。($y=0, y=1$を入れてみると、不要なほうが0乗になって消える)

```math
P(Y=y|X=\mathbf{x}) = \bigl(\sigma(\mathbf{w}\mathbf{\tilde{x}})\bigr)^y \bigl(1-\sigma(\mathbf{w}\mathbf{\tilde{x}})\bigr)^{1-y}
```

ここで、i番目のサンプルを$\mathbf{x_i}$とすると、n個の訓練データで全部正解する確率は

```math
\prod_{i=1}^{n} P(Y=y|X=\mathbf{x_i}) =  \prod_{i=1}^{n} \bigl(\sigma(\mathbf{w}\mathbf{\tilde{x_i}})\bigr)^y \bigl(1-\sigma(\mathbf{w}\mathbf{\tilde{x_i}})\bigr)^{1-y}
```


<font color="Red">コレ(=訓練データを全部正解する確率)が最大となるようなパラメータ$\mathbf{w}$</font>を求める。（=**最尤法**）

**「関数が最小・最大となるパラメータ$\mathbf{w}$を求める」=「関数を微分したものが0になるパラメータ$\mathbf{w}$を求める」**

が定石だが、掛け算・乗数がたくさんあると微分しづらい。

そのため、<font color="Red">代わりに「対数をとってマイナスをかけたもの↓」を考え、コレを最小にするパラメータ$\mathbf{w}$を求める。</font>

```math
\begin{align}
E(\mathbf{w}) &= -\log \Bigl({ \prod_{i=1}^{n} \bigl(P(Y=y|X=\mathbf{x_i}) \bigr)} \Bigr) \\
&= -\log{\Bigl( \prod_{i=1}^{n} \bigl(\sigma(\mathbf{w}\mathbf{\tilde{x_i}})\bigr)^y \bigl(1-\sigma(\mathbf{w}\mathbf{\tilde{x_i}})\bigr)^{1-y}\Bigr)} \\
&= - \sum_{i=1}^{n} \Bigl(y \log{\sigma(\mathbf{w}\mathbf{\tilde{x_i}})} + (1-y) \log{\bigl(1-\sigma(\mathbf{w}\mathbf{\tilde{x_i}})\bigr)}\Bigr)
\end{align}
```

コレをwで微分したときの一階微分は↓のようになる、(途中計算は[機械学習のエッセンス](https://www.sbcr.jp/product/4797393965/)を参照して・・・)

```math
\frac{\partial E(\mathbf{w})}{\partial \mathbf{w}} = \sum_{i=1}^{n} (\sigma(\mathbf{w}\mathbf{\tilde{x_i}})-y_i)\mathbf{\tilde{x_i}}
```

ココまでできれば、あとは一階微分が0になるパラメータ$\mathbf{w}$を求めれば完了。([機械学習のエッセンス](https://www.sbcr.jp/product/4797393965/)では、二階微分を使って[ニュートン法](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%88%E3%83%B3%E6%B3%95)によって求めてる)

## パラメータ使って結果を予測する

↑で求めたパラメータ$\mathbf{w}$を使い、与えられた$\mathbf{x}$から$P(Y=0|X=x), P(Y=1|X=x)$を計算し、

- $P(Y=0|X=x)$が大きい(=0.5(50%)を超える)⇒「y=0」と予測⇒ラベルがどちらか予測
- $P(Y=1|X=x)$が大きい(=0.5(50%)を超える)⇒「y=1」と予測⇒ラベルがどちらか予測

# 参考リンク

* [ロジスティック回帰(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%B8%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E5%9B%9E%E5%B8%B0)
* [ロジスティック回帰分析の例や説明変数を解説！](https://to-kei.net/regression/logistic_regression/)
* [ニュートン法とは何か？？ニュートン法で解く方程式の近似解](https://qiita.com/PlanetMeron/items/09d7eb204868e1a49f49)