今回はロジスティック回帰の実装をまとめていきます。
##■ ロジスティックの手順
次の6つのSTEPで進めます。
- モジュールの用意
- データの準備
- データの可視化
- モデルの作成
- 分類を予測
- モデルの評価
##1. モジュールの用意
最初に、必要なモジュールをインポートしておきます。
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
##2. データの準備
今回はirisデータセットを使って、二値分類をしていきます。
最初にデータの取得をし、標準化を行ってから分割します。
# 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 では、データの分割結果が毎回同じになるようにシード値を固定しています。
##3. データの可視化
ロジスティック回帰で分類をする前のデータをプロットして見ておきます。
# 描画オブジェクトとサブプロットの作成
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 を縦軸)でプロット
<出力結果>
##4. モデルの作成
ロジスティック回帰の実行関数(インスタンス)を作成し、訓練データに当てはめます。
# インスタンスを作成
logreg = LogisticRegression()
# 訓練データからモデルを作成
logreg.fit(X_train, y_train)
##5. 分類を予測 モデルが完成したので、まず分類の確率を予測します。
# 分類の確率を予測
y_proba = logreg.predict_proba(X_test)[: , 1]
print(y_proba)
<出力結果>
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)}$$
次に分類の結果を予測してみます。
# 分類の結果を予測
y_pred = logreg.predict(X_test)
print(y_pred)
<出力結果>
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 と分類を行いました。
##6. モデルの評価
今回は分類(二値分類)となるので、混同行列を用いた評価を行います。
# 混同行列を作成
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)
# 適合率、再現率、F値を出力
print(classification_report(y_test, y_pred))
<出力結果>
以上より、Setosa と Versicolor における分類の評価を行うことができました。
##■ 最後に
ロジスティック回帰では上記1~6の手順をもとに、モデルの作成・評価を行っていきます。
今回は初学者の方向けに、実装(コード)のみまとめさせていただきましたが
今後タイミングを見て、理論(数式)についても記事を作成していければと思います。
ご精読いただき、ありがとうございました。