2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Logistic回帰(load_iris)

Last updated at Posted at 2020-10-08

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

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

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

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

##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 を縦軸)でプロット

<出力結果>
image.png
##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)

<出力結果>
image.png
次に、評価指標の数値を求めます。


# 適合率、再現率、F値を出力
print(classification_report(y_test, y_pred))

<出力結果>
image.png
以上より、Setosa と Versicolor における分類の評価を行うことができました。


##■ 最後に
ロジスティック回帰では上記1~6の手順をもとに、モデルの作成・評価を行っていきます。

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

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?