scikit-learnのロジスティック回帰でiris(アヤメ)の分類

sklearnでアヤメの分類

scikit-learnには、機械学習を試すためのデータセットが何種類か用意されています。これらのデータセットを使うことで、すぐにscikit-learnを使った機械学習に取り掛かれます。

ここでは、いくつかあるデータセットの中の一つ、iris のデータセットを使って分類をしてみます。

ちなみに iris はアヤメという花のことです。

iris データセットの詳細

詳細は以下のURLで確認できます。

データセットには、アヤメの3品種(Setosa, Versicolour, Virginica)のデータが用意されています。データは150件、アヤメの3品種のデータがそれぞれ50件ずつ準備されています。

データの列数は以下の4つ、単位はすべて cm です。

  1. がく片の長さ (sepal length) [cm]
  2. がく片の幅 (sepal width) [cm]
  3. 花弁の長さ (petal length) [cm]
  4. 花弁の幅 (petal width) [cm]

データセットの詳細も確認できます。

# scikit-learnのデータセットからirisのデータセット取得
import pandas as pd
from sklearn import datasets
iris = datasets.load_iris()

# データの内容詳細
print(iris.DESCR)

# データの中身
print(pd.DataFrame(iris.data, columns=iris.feature_names))
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
5 5.4 3.9 1.7 0.4
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8

150 rows × 4 columns

ロジスティック回帰で分類してみる

ここではロジスティック回帰(Logistic Regression)を使って、3種類のアヤメの分類を行ってみます。150件のデータの内、7割を訓練データ、残り3割をテストデータとして扱うことにします。

データの分割には、ShuffleSplit というモジュールを用います。データセットを 7:3 のランダムな2つのデータに分割します。

import sklearn
import pandas as pd
from sklearn import datasets
from sklearn import linear_model

# irisのデータを用意
iris = datasets.load_iris()
X = iris.data
y = iris.target

# ランダムにシャッフルするためのモジュール
from sklearn.model_selection import ShuffleSplit
ss = ShuffleSplit(n_splits=1,
                  train_size=0.7,
                  test_size=0.3)

# シャッフルしたインデックスを取得
train_index, test_index = next(ss.split(X))
# print(train_index, test_index)

# 学習データとテストデータをそれぞれ取得
X_train, y_train = X[train_index], y[train_index]
X_test, y_test = X[test_index], y[test_index]

# ロジスティック回帰の識別器を用意
clf = linear_model.LogisticRegression()

# 識別器を学習させる
clf.fit(X_train, y_train)

# テストデータで識別結果を確認
print(clf.score(X_test, y_test))

# 90%前後でした

以上です。