【Python】機械学習でアヤメを分類する

こんにちは。のっくんです。

今日の記事では、アヤメを機械学習で学習し分類する方法をご紹介します。

花のデータを取得する

学習に使う花(アヤメ)のデータを取得します。

Jupyter Notebookを起動して以下のコードを書いてみましょう。

import urllib.request as req
import pandas as pd

# ファイルをダウンロード
url = "https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv"
savefile="iris.csv"

req.urlretrieve(url, savefile)

requestを使って、githubからデータを取得して、iris.csvという名前で保存しています。

次にデータの中身を見てみましょう。

pandasで読み取ったcsvの中身をみてみましょう。

上のコードに続けて以下を追加します。

csv = pd.read_csv(savefile, encoding="utf-8")
csv

Jupyter Notebookだと変数名を打つだけでその中身を表示してくれるので便利です。

実行してみましょう。

がく片の長さ、がく片の幅、花びらの長さ、花びらの幅、アヤメの品種の順で並んでいます。

一部しか表示していませんが、全部で150行ほどあります。

アヤメの品種には3種類あり、4つのがく片や花びらの情報から機械学習を使ってアヤメの品種を予測します。

データセットの作成

ダウンロードしたアヤメのデータを学習用とテスト用に分ける必要があります。

scikit-learnを使うと1行でこれを実行してくれる便利な機能があるんです。

新しいJupyter Botebookで新しいセルを追加して、以下のコードを書きます。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# アヤメデータの読み込み
iris_data = pd.read_csv("iris.csv", encoding="utf-8")

# アヤメデータをラベルと入力データに分離する
y = iris_data.loc[:,"Name"]
x = iris_data.loc[:,["SepalLength","SepalWidth","PetalLength","PetalWidth"]]

# 学習用とテスト用に分離する
x_train, x_test, y_train, y_test = train_test_split( x, y, test_size = 0.2, train_size = 0.8, shuffle = True)

ラベルはアヤメの品種です。

今回は教師有り学習ですので、予め正解を学習させます。

Nameにアヤメの品種が入っているのでそれをラベルyとしています。

他の4つの花びらやガクの情報を入力データxとしています。

train_test_splitを使うと、学習用とテスト用のデータを自動的に作ってくれます。比率は

テスト:学習=2:8

にしています。

また、データの偏りが無いように「shuffle=True」とし、元データをランダムに並び替えた後にデータを抽出するようにしています。

(このパラメータはデフォルトでTrueなので、指定しなくても良いです。)

学習と評価

データセットができたところで、学習、評価をします。

先ほどのコードに以下を追加して下さい。

# 学習する
clf = SVC()
clf.fit(x_train, y_train)

# 評価する
y_pred = clf.predict(x_test)
print("正解率 = ", accuracy_score(y_test, y_pred))

SVCというアルゴリズムを使って、学習と評価をしています。

実行すると、

正解率 =  0.9666666666666667

高精度でアヤメの品種を当てることができました。

参考

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog