Kohei Blog

夫・父親・医療系エンジニア

【scikit-learn】ロジスティク回帰でアヤメの分類

前回、パーセプトロンによるアヤメの分類を行ってみました。

kei01011.hatenablog.com

クラスを完全に線形分離できない場合は決して収束しないという問題点もあるため、ロジスティック回帰による分類を試してみた。

データ準備

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
import seaborn as sns

from sklearn import datasets
iris = datasets.load_iris()

X = iris.data[:,[2,3]]

y = iris.target

print('Class',np.unique(y))

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=1,stratify=y)

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()

# トレーニングデータの平均と標準偏差を計算
sc.fit(X_train)

#平均と標準偏差を用いて標準化
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

ロジスティック回帰モデルのトレーニン

from sklearn.linear_model import LogisticRegression as LR

lr = LR(C=100.0,random_state=1)
lr.fit(X_train_std,y_train)

# plot
plot_decision_regions(X_combined_std, y_combined, classifier=lr,test_idx=range(105,150))

# plot label
plt.xlabel('petal length std')
plt.ylabel('petal width std')

plt.legend(loc='upper left')

plt.tight_layout()
plt.show()

f:id:kei_01011:20210521123106p:plain

predictを出力してみる。

lr.predict_proba(X_test_std[:3,:])
array([[1.52213484e-12, 3.85303417e-04, 9.99614697e-01], [9.93560717e-01, 6.43928295e-03, 1.14112016e-15], [9.98655228e-01, 1.34477208e-03, 1.76178271e-17]])

1行目は1つ目のサンプルに関するクラスの所属確率 2行目は2つ目のサンプルに関するクラスの所属確率を表している

1行目でもっとも大きいのは0.853で、1つ目のサンプルがクラス3(Virginica)に属している確率を85.3%と予測している。