今回は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パーセントの的中率であることが分かった。