ロジスティック回帰モデルのまとめ

この記事は個人的なお勉強用のメモです。

# 講義

### 分類

- ある入力からクラスに分類する問題
- 例えば、犬 or 猫を見分ける
- 出力は 0 or 1といった離散的な値
- 有名なのは、タイタニックデータ（出力は、生存 or 死亡）、IRIS（出力はアヤメの種類）

### 3種類のアプローチ

##### 1. 識別的アプローチ 
$P(C_k|x)$ を直接モデル化する。 
ある $x$ が与えられたときに、どの $C_k$ に属するか。
正しくは、クラスkに割り当てられる確率が出力される。
ロジスティック回帰はこのアプローチ。

##### 2. 生成的アプローチ
$P(C_k)$ と $P(x|C_k)$ をモデル化し、それらを元にベイズの定理を用いて $P(C_k|x)$ を求める。  
生成的アプローチのメリット：
- 外れ値に強い。
- GANでデータ生成できる。

ベイズの定理の変形

```math
\begin{align}
P(C_k|x)
&=\frac{P(C_k,x)}{P(x)}\\
&=\frac{P(x|C_k)p(C_k)}{p(x)}
\end{align}
```

##### 3. 識別関数

識別関数を作る。
$f(X)>0 => C=1$
$f(X)<0 => C=2$
など。
SVMで使われる。

### ロジスティック回帰の処理の流れ

1. 線形結合 $\hat{y}=w^Tx+w_0$ で $\hat{y}$ を求める。
2. $\hat{y}$ の値を [0,1] の範囲につぶす。

### 出力された実数を分類

$w^Tx$ で得られるのは実数全体。
クラスに分類するには、[0, 1]の範囲につぶす。
（0から1までの範囲というのは確率が取りうる範囲）
つぶすには、シグモイド関数を使う。

シグモイド関数

```math
\sigma (z) = \frac{1}{1+\exp(-z)}\\
\sigma (z) = \frac{\exp(z)}{1+\exp(z)}
```

係数ありの場合

```math
\sigma (z) = \frac{1}{1+\exp(-az)}\\
\sigma (z) = \frac{\exp(az)}{1+\exp(az)}
```

係数が小さいと、シグモイド関数は直線に近づく。
係数が大きいと、ステップ関数のような形状になる。

#### シグモイド関数の微分

```math
\begin{align}
\sigma(z)
&=\frac{1}{1+\exp(-z)}\\
&=(1+\exp(-z))^{-1}
\end{align}
```

$t=1+\exp(-z)$ と置くと、$\sigma(z)=t^{-1}$。
$s=-z$ と置くと、$t=1+\exp(s)$。

```math
\begin{align}
\frac{\partial \sigma(z)}{\partial z}
&=
\frac{\partial \sigma(z)}{\partial t}
\frac{\partial t}{\partial s}
\frac{\partial s}{\partial z}\\
&=
(-1)t^2 \exp(s) (-1)\\
&=
(1+\exp(-z))^2\exp(-z)\\
&=
\frac{1}{1+\exp(-z)}\frac{\exp(-z)}{1+\exp(-z)}\\

&= \sigma(z)\frac{\exp(-z)}{1+\exp(-z)}\\
&= \sigma(z)\frac{1+\exp(-z)-1}{1+\exp(-z)}\\
&= \sigma(z)\frac{1+\exp(-z)-1}{1+\exp(-z)}\\
&= \sigma(z)\biggl(1-\frac{1}{1+\exp(-z)}\biggr)\\
&= \sigma(z)(1-\sigma(z))
\end{align}
```

シグモイド関数を微分すると、微分後の式はシグモイド関数自身で構成される。

### 出力値の確率を求める式

$Y=1$ になる確率

```math
P(Y=1|x)=\sigma(w_0+w_1x_1+...+w_mx_m)
```

一番簡単なのは、確率が 0.5 以上ならば1、0.5未満なら 0 と予測する。
しきい値は 0.5 である必要はなく、0.8 でも 0.7 でも何でもいい。

### パラメータの推定

ロジスティック回帰では、ベルヌーイ分布を使う。
データから未知のパラメータを推定する。
これを最尤推定という。

### 尤度関数と最尤推定

ベルヌーイ分布
1回の試行で $y=y_1$ になる確率。

```math
P(y)=p^y(1-p)^{1-y}
```

n回の試行で $y_1,...,y_n$ が同時に起こる確率。

```math
P(y_1,y_2,...,y_n;p)=\Pi_{i=1}^n p^{y_i}(1-p)^{1-y_i}
```

【重要】
既知は $y_i$ というデータであり、未知は確率 $p$ であること。
この関数を尤度関数という。
尤度関数を最大化するパラメータを求めることを最尤推定という。

### 最尤推定の方法

- 対数を取る。
 - 微分の計算が簡単になる（掛け算が足し算になる。指数が掛け算になる）
 - 確率の掛け算の繰り返しによる桁落ちを防ぐ（この目的のため、実装上は対数を取るのが必須）

```math
\begin{align}
E(w_0,w_1,...,w_m)
&=-\log L(w_0,w_1,...,w_m)\\
&=-\sum_{i=1}^n \Bigl(y_i \log p_i+ (1-y_i)\log(1-p_i)\Bigr)
\end{align}
```

マイナスを付けているのは、最小値を求めるという意味。

### 勾配降下法

シグモイド関数を含んでいるため、解析解をきれいに求められない。
代わりに、傾きの方向へ徐々に最小化する方向へ向かうよう $w$ を更新する。

```math
w^{k+1}=w^k-\eta \frac{\partial E(w)}{\partial w}
```

$E(w)$ ：ロス関数
$\eta$ ：学習率

### ロス関数の微分

```math
\begin{align}
E(w)&=-\log L(w)\\
&=
-\sum_{i=1}^n (y_i \log p_i + (1-y_i) \log (1-p_i))\\
&=
-\sum_{i=1}^n E_i
\end{align}
```
↑ $E_i=y_i \log p_i + (1-y_i) \log (1-p_i)$
ここでシグモイド関数 $p_i$ はこちら。

```math
\begin{align}
p_i&=\sigma (w^Tx_i)\\
&=\frac{1}{1+\exp(w^Tx_i)}\\
\end{align}
```

$z_i=w^Tx_i $ と置くと

```math
\begin{align}
p_i&=
\frac{1}{1+\exp(z_i)}\\
\end{align}
```

これらを踏まえて $E(w)$ を微分する。

```math
\begin{align}
\frac{\partial E(w)}{\partial w}
&=
-\sum_{i=1}^n \frac{\partial E_i}{\partial p_i}\frac{\partial p_i}{\partial z_i}\frac{\partial z_i}{\partial w}\\
&=
-\sum_{i=1}^n \biggl(\frac{y_i}{p_i}-\frac{1-y_i}{1-p_i}\biggr)p_i(1-p_i)x_i\\
&=
-\sum_{i=1}^n \Bigl(y_i(1-p_i)-(1-y_i)p_i\Bigr)x_i\\
&=
-\sum_{i=1}^n \Bigl(y_i-y_ip_i-p_i+y_ip_i\Bigr)x_i\\
&=
-\sum_{i=1}^n \Bigl(y_i-p_i\Bigr)x_i\\
\end{align}
```

### 確率的勾配降下法

$n$ が大きいとメモリ使用量が大きくなってしまうため、
データを1つずつランダムに選んでパラメータを更新する。
これを確率的勾配降下法という。
（この抽出をミニバッチ法とも）

## モデルの評価

ロジスティック回帰の評価

### 混同行列

予測(positive, negative)と結果(positive, negative)の個数を表にしたもの。

||結果positive|結果negative|
|---|---|---|
|予測positive|真陽性(True Positive)|偽陽性(False Positive)|
|予測negative|偽陽性(False Negative)|偽陽性(True Negative)|

覚え方
- True/Falseは、予測が当たったかどうか
- Positive/Negativeは、予測がどうだったか

つまり、予測を中心にして考える。
例：
予測Positiveで結果Negative
→予測Positiveが外れたのでFalse Positive

### 分類の評価方法

##### 正解率(Accuracy)

```math
正解率=\frac{TP+TN}{TP+TN+TN+FP}
```

すべての予測に対する正解率。

##### 再現率(Recall)

```math
再現率=\frac{TP}{TP+FN}
```

結果がPositiveのものを漏れなく予測できたかどうか。
例：がんを正しく見付けられたかどうか。

この場合、実際はがんでない場合にがんと予測(FP)しても問題にはならない。

##### 適合率(Precision)

```math
再現率=\frac{TP}{TP+FP}
```

Positive予想に対して、結果がどうだったか。
例：確実にスパムメールだけ、スパム扱いする。

##### F値

F値は再現率と適合率の調和平均。
再現率と適合率はトレードオフの関係にあるため
バランスをとるためにF値が用いられる。

```math
F値=\frac{2\times 適合率 \times 再現率}{適合率 + 再現率}
```

# 実装演習

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/92b46dbb-ddfb-8fe1-4506-2cb901fc564b.png)

運賃(Fare)が61の場合は0、つまり死亡が出力されている。
一方で、62の場合の確率を見てみると、生存と死亡の確率がほぼ同じ。
つまり、この辺りを境にして、生存と死亡が分かれている。
試しに、predict関数に62を指定すると、1つまり生存が出力された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/98b623bb-8507-98fe-8a61-16a3f3a52b67.png)

シグモイド関数の式はロジスティック回帰によって求めた $w_0$ と $w_1$ を利用した、
 $\frac{1}{\exp(w_1x+w_0)}$ 

このシグモイド関数の曲線と、ロジスティック回帰による予測値は一致している。
ロジスティック回帰(LogisticRegression)の内部で、
上記のシグモイド関数と同様の処理を行っていることが推測される。

運賃だけで判断すると、運賃が高い方が生存率が高くなる。
運賃が高いと逃げやすい部屋だったり乗務員によるサポートがあったり
優先してボートに乗れたりといったことがあったのだろうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/dbf24d6e-e240-aaaf-755e-81d80943c177.png)

Pclass：1上流、2中流、3下流
Gender：1男性、0女性

Pclass_Gender=0つまり上流階級の女性は青が多く、生存確率が高い。
それに対してPclass_Gender=4つまり下流階級の男性は赤が多く、生存確率が低い。

階級や性別によって当時何か差があったのだろうか。

メモ
scatter時のrandom関数呼び出しは、散布図の丸を表示するときに上下に少しぶらすことによって
丸同士の重なりを抑えて見やすくするため。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810819/46956f18-7400-5f43-7880-311f1a2abbec.png)

ロジスティック回帰によって得られた傾きや切片を元に
直線を描いている。
この線の右上に該当すると死亡の確率が高く、左下に該当すると生存の確率が高い、
という目安になる。

コメントアウトされているcontourf関数やcolorbar関数を使って等高線を描いている。
右上に該当すればどれも同じ、というわけではなく、場所によって確率が変わっている。

## 演習問題

演習問題がない。