今回はPythonの機械学習ライブラリ「scikit-learn」で用意されているデータセットを使って、機械学習の「分類」をやってみる。

機械学習には「回帰」や「分類」、「クラスタリング」などがあるが、今回おこなう「分類」は「教師あり学習」の一つで、過去の特徴量データを学習させたモデルを使って、新しく出現したデータをカテゴライズする手法だ。

scikit-learnでは簡単に機械学習を試せるように、いくつかのサンプルデータセットがあらかじめ用意されており、今回はアヤメの品種データを使うことにする。

アヤメは花びらの長さと、がくの長さにより3つの品種に分類することができるのだ。

アヤメデータの読み込み

scikit-learnから読み込む方法が一番簡単だ。
以下の2行のコードでアヤメの特徴量データセットを読み込むことができる。

from sklearn.datasets import load_iris
data_set = load_iris()

読み込んだデータは扱いやすくするため、pandasのデータフレームに変換しておこう。

df = pd.DataFrame(data_set.data, columns=data_set.feature_names)

headで中身を確認すると次の結果が返る。

df.head()
#    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

sepal length、sepal widthは「がくの長さと幅」、petal length、petal widthは「花弁の長さと幅」を意味する。

データの前処理

データセットの読み込みを終えたら、データを「品種名」と「特徴量(がくと花弁の長さ)」に分ける。

# ラベル(品種 0〜2)
y = data_set.target

# 特徴量
x = df

訓練用データとテスト用データに分ける

次にラベルと特徴量データをそれぞれ、訓練用データとテスト用データに分ける。

引数のtest_sizeとtrain_sizeで、テスト・訓練のデータの振り分けを行い、shuffleオプションは振り分けのランダマイズを意味している。

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8, shuffle=True)

モデルに学習させ、テストデータを評価する

最後に、用意したモデルに訓練用データを与えて学習させれば完成だ。

テストデータをモデルのpredict関数に与え、分類予測の的中率を確認してみよう。

from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# モデルに訓練用データを与えて学習させる
clf = SVC()
clf.fit(x_train, y_train)

# テストデータを評価する
y_pred = clf.predict(x_test)
accuracy_score(y_test, y_pred)

# 0.9666666666666667

テストデータを機械学習モデルにより分類した結果、予測の精度は96.6パーセントの的中率であることが分かった。