アヤメデータを使った機械学習の流れを簡単にまとめてみた

アヤメデータはirisデータとも呼ばれ、機械学習の分類問題における初心者向けのレクチャーに使われます。今回はこのアヤメデータを機械学習のSVMモデルで分類してみたいと思います。

アヤメ(iris)データとは?

irisデータとは、機械学習でよく使われるアヤメの品種のデータです。アヤメの品種のSetosa Versicolor Virginicaの3品種に関する150件のデータが入っています。

  

データセットの中身はSepal Length(がく片の長さ)Sepal Width(がく片の幅)Petal Length(花びらの長さ)Petal Width(花びらの幅)の4つの特徴量を持っています。データセットはこれら4つの特徴量と、品種名で成り立っています。


SVMとは?

SVMとは、サポートベクターマシンのことで、1995年頃に発表されたパターン識別用の教師あり機械学習方法です。分類問題に適していて、スパム判別器などもSVMで作ることができます。教師あり学習なので、特徴量となるデータに紐づいて、目的変数となるラベルも必要になります。

今回は、アヤメデータに品種名と特徴量もあるのでSVMモデルを使っていきます。scikit-learnを使うことで簡単に学習することができるので、流れを一つ一つ見ていきましょう。

モデルについてより詳しく知りたい方はwikipediaを見てみてください。

参考 サポートベクターマシンwikipedia

アヤメデータを分類してみる

流れを確認しましょう。

  • 手順1
    データの読み込み
    アヤメのデータセットを取り込みます。pandasライブラリのread_csv()メソッドを使います。
  • 手順2
    データとラベルに分ける
    取り込んだデータを、アヤメの情報とそのラベルに分けます。pandasのloc()メソッドを使います。
  • 手順3
    学習用とテスト用データに分ける
    80%を学習用のデータに、残りの20%をテスト用のデータに分けます。scikit-learnライブラリのtrain_test_split()を使います。
  • 手順4
    学習させて評価する
    実際に学習させ、それをテストデータで試し分類の精度を評価します。学習はscikit-learnライブラリのfit()を、予測はpredict()を、そして正解度の計算はaccuracy_score()メソッドを使います。

1. データの読み込み

データを読み込む方法はいくつかあります。scikit-learnからロードする方法や、csvファイルをダウンロードしてそのファイルをpandasで取り込む方法もあります。前者の紹介もしますが、今回は後者のやり方で進めていきます。

1-1. ブラウザからダウンロード

以下のURLにアクセスすると、github上のアヤメのデータセットが出てきます。開いたら以下の画像のRawというボタンをクリックすると、csvデータがブラウザ上に表示されるので右クリックなどで保存してください。

参考 アヤメデータセットgithub

1-2. ダウンロードしたcsvデータをインポート

ローカルにcsvファイルをダウンロードできたら、pandasのread_csv()で読み込みましょう。今回はスクリプトと同じディレクトリにiris.csvを置いたので、以下のように指定します。

Python
import pandas as pd
iris_data =  pd.read_csv("iris.csv", encoding="utf-8")
Pandasのread_csvでcsvファイルを読み込む方法

(参考)scikit-learnからirisデータをインポート

irisのデータセットをscikit-learnから読み込める簡単な方法もあります。こちらの方が一般的に多く解説されているので、今回は扱いませんでしたが、非常に便利なのでサンプルコードを載せておきます。

Python
from sklearn.datasets import load_iris
iris_dataset = load_iris()

1-3. データを確認する

インポートしたデータを確認してみましょう。確認する方法はいくつかありますが、head()で最初の5行を確認したり、shapeで行数と列数をチェックできます。Nameにアヤメの品種名が入っていて、その他は特徴量に値する数値が入っています。

Python
iris_data.head()
	SepalLength	SepalWidth	PetalLength	PetalWidth	Name
0	5.1	3.5	1.4	0.2	Iris-setosa
1	4.9	3.0	1.4	0.2	Iris-setosa
2	4.7	3.2	1.3	0.2	Iris-setosa
3	4.6	3.1	1.5	0.2	Iris-setosa
4	5.0	3.6	1.4	0.2	Iris-setosa
iris_data.shape
(150, 5)
MEMO
SepalLengthとSepalWidthは、がく片の長さと幅の長さで、PetalLengthとPetalWidthは花弁の長さと幅の長さです。
DataFrame(データフレーム)入門:基本的な使い方を総まとめ!

2. データとラベルに分ける

csvファイルを読み込めたら、データの前処理をしていきます。pandasのloc()を使ってラベルに当たる品種名と、特徴量にあたるデータ(がく片と花弁の長さ)に分けていきます。品種名が目的変数、特徴量が説明変数という位置付けになります。

Python
# アヤメデータをラベルと入力データに分離する
y = iris_data.loc[:, "Name"]
x = iris_data.loc[:, ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]]
【Pandas】データフレームから特定の行・列を取得する方法を総まとめ!

3. 学習用とテスト用データに分ける

品種名が入った目的変数にあたるyと、データが入った説明変数にあたるxを、それぞれ学習用とテスト用に分けます。train_test_split()で分けることができます。引数にtest_sizeとtrain_sizeを入れて、分ける割合を決めることができます。ここでは80:20にします。また、shuffle=Trueでランダムに分けます。

Python
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)

4. 学習させて評価する

最後にtrainデータを学習させて、それをtestデータで試して精度を測ってみましょう。学習の仕方は、SVMモデルをインポートしてx_trainとy_trainを引数に入れるだけです。SVMモデルが3行で使えるのが、scikit-learnの凄いところです。

精度の評価はaccuracy_scoreで先ほど分けたtestデータに充てることができます。最後に精度が出ますが、学習データとテストデータはランダムに分けたので、もちろん毎回異なる精度が出てきます。これで精度の評価までできました。

Python
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.9333333333333333

まとめ

今回はSVMモデルを使ってアヤメデータの分類をしてみました。機械学習の一歩目なので、よく学習してみてください。scikit-learnを使えば意外と簡単にできたりします!