Logistic回帰（load_iris）

今回はロジスティック回帰の実装をまとめていきます。

##■ ロジスティックの手順

次の6つのSTEPで進めます。

1. モジュールの用意
2. データの準備
3. データの可視化
4. モデルの作成
5. 分類を予測
6. モデルの評価
<br>

##1. モジュールの用意
最初に、必要なモジュールをインポートしておきます。

```python

import numpy as np
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 可視化を行うモジュール
import seaborn as sns

# データセットを読み込むモジュール
from sklearn.datasets import load_iris

# 標準化（分散正規化）を行うモジュール
from sklearn.preprocessing import StandardScaler

# 訓練データとテストデータを分割するモジュール
from sklearn.model_selection import train_test_split

# ロジスティック回帰を実行するモジュール
from sklearn.linear_model import LogisticRegression

# 分類の評価を行うモジュール
from sklearn.metrics import classification_report

# 混同行列を扱うモジュール
from sklearn.metrics import confusion_matrix
```
<br>

##2. データの準備
今回はirisデータセットを使って、二値分類をしていきます。

最初にデータの取得をし、標準化を行ってから分割します。

```python

# irisデータセットの読み込み
iris = load_iris()

# 目的変数と説明変数に分ける
X, y = iris.data[:100, [0, 2]], iris.target[:100]

# 標準化（分散正規化）
std = StandardScaler()
X = std.fit_transform(X)

# 訓練データとテストデータに分割する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)
```
二値分類を行うために、データセットを100行目まで（Setosa・Versicolor のみ）と指定しています。
またプロットしやすくするために、説明変数も2つに絞っています。（Sepal Length・Petal Lengh のみ）

標準化は、例えば2桁と4桁の特徴量（説明変数）があった際に、後者の影響が大きくなってしまうため
全ての特徴量に対して平均を0・分散を1にして、スケールを揃えています。

random_state では、データの分割結果が毎回同じになるようにシード値を固定しています。
<br>
##3. データの可視化
ロジスティック回帰で分類をする前のデータをプロットして見ておきます。

```python

# 描画オブジェクトとサブプロットの作成
fig, ax = plt.subplots()

# Setosa のプロット
ax.scatter(X_train[y_train == 0, 0], X_train[y_train == 0, 1], 
           marker = 'o', label = 'Setosa')

# Versicolor のプロット
ax.scatter(X_train[y_train == 1, 0], X_train[y_train == 1, 1],
           marker = 'x', label = 'Versicolor')

# 軸ラベルの設定
ax.set_xlabel('Sepal Length')
ax.set_ylabel('Petal Length')

# 凡例の設定 
ax.legend(loc = 'best')

plt.show()
```
Setosa (y_train ==0) に対応する特徴量（0：Sepal Lengh を横軸, 1: Petal Length を縦軸）でプロット
Versicolor (y_train ==1) に対応する特徴量（0：Sepal Lengh を横軸, 1: Petal Length を縦軸）でプロット

＜出力結果＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/f811cb02-8080-a41e-26c2-35802e08d47b.png)
##4. モデルの作成
ロジスティック回帰の実行関数（インスタンス）を作成し、訓練データに当てはめます。

```python

# インスタンスを作成
logreg = LogisticRegression()

# 訓練データからモデルを作成
logreg.fit(X_train, y_train)
```
<br>
##5. 分類を予測
モデルが完成したので、まず分類の確率を予測します。

```python
# 分類の確率を予測
y_proba = logreg.predict_proba(X_test)[: , 1]
print(y_proba)
```
＜出力結果＞

```python

y_proba: [0.02210131 0.99309888 0.95032727 0.04834431 0.99302674 0.04389388
 0.10540851 0.99718459 0.90218405 0.03983599 0.08000775 0.99280579
 0.99721384 0.78408501 0.08947531 0.01793823 0.99798469 0.01793823
 0.99429762 0.9920454 ]
```
シグモイド関数によって、0 ～ 1 の範囲で数字が出力され
0 に近づくほど Setosa、1に近づくほど Versicolor である確率が高くなっています。

$$\sigma(z)=\frac{1}{1+\exp(-z)}$$<br>
次に分類の結果を予測してみます。

```python

# 分類の結果を予測
y_pred = logreg.predict(X_test)
print(y_pred)
```
＜出力結果＞

```python

y_pred: [0 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1]
```
先ほどシグモイド関数で出力した0～1の値に対して
0.5 より小さい値は 0：Setosa、0.5 より大きい値は 1：Versicolor と分類を行いました。
<br>
##6. モデルの評価
今回は分類（二値分類）となるので、混同行列を用いた評価を行います。

```python

# 混同行列を作成
classes = [1, 0]
cm = confusion_matrix(y_test, y_pred, labels=classes)

# データフレーム化
cmdf = pd.DataFrame(cm, index=classes, columns=classes)

# 混同行列をプロット
sns.heatmap(cmdf, annot=True)
```
＜出力結果＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/e44eb288-04d1-3181-02e4-baa6c5d62b13.png)
次に、評価指標の数値を求めます。

```python

# 適合率、再現率、F値を出力
print(classification_report(y_test, y_pred))
```
＜出力結果＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/6f52ed6f-86af-4e5f-9dd7-328dad0ac0c9.png)
以上より、Setosa と Versicolor における分類の評価を行うことができました。
<br>
##■ 最後に
ロジスティック回帰では上記1～6の手順をもとに、モデルの作成・評価を行っていきます。

今回は初学者の方向けに、実装（コード）のみまとめさせていただきましたが
今後タイミングを見て、理論（数式）についても記事を作成していければと思います。

ご精読いただき、ありがとうございました。