【scikit-learn】ロジスティク回帰でアヤメの分類
前回、パーセプトロンによるアヤメの分類を行ってみました。
クラスを完全に線形分離できない場合は決して収束しないという問題点もあるため、ロジスティック回帰による分類を試してみた。
データ準備
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()
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%と予測している。