俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

scikit-learnのSVMを使ってアヤメの品種を分類する(Pythonによるスクレイピング&機械学習テクニック)

今回は、scikit-learnのSVMを使って、アヤメの品種を分類できるようになりました。花びらの長さや幅などの特徴量から品種を分類するということで、本格的に機械学習となってまいりました。

 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第4章を参考にさせていただきながら、取り組んでいます。

環境構築については、Dockerを使われる方は、以下をご参照ください。

oregin-ai.hatenablog.com

OSから、Ubuntuを導入して取り組む方は、以下をご参照ください。

oregin-ai.hatenablog.com

では、振り返っていきたいと思います。

scikit-learnのSVMを使ってアヤメの品質を分類する。

1.全体像

コード全体は以下の通りで、「iris-train.py」に保存しました。

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm,metrics

 

# (1)アヤメのデータを読み込む
X, y = datasets.load_iris(return_X_y=True)
print('全データ:',X.shape, y.shape)

 

#(2) 訓練データと検証データにデータを分ける
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=0)

print('訓練データ:',X_train.shape, y_train.shape)
print('検証データ:',X_test.shape, y_test.shape)

 

#(3) データを学習し、予測する
clf = svm.SVC()
clf.fit(X_train, y_train)
pred = clf.predict(X_test)

 

#(4) 正解率を求める
ac_score = metrics.accuracy_score(y_test, pred)
print('正解率:',ac_score) 

では、コードを順番に見ていきます。

2.アヤメのデータを読み込む

scikit-learnには、分類や、回帰などの機械学習のサンプルデータとして、色々なデータが用意されています。

その中で、今回は、アヤメ(iris)のデータを使って品種を分類を実施します。

datasetsをimportしておいて、load_iris()メソッドを使う事で、データを取得できます。引数に、return_X_y=Trueを渡す事で、予測に使うデータと(説明変数X)と、分類のラベル(目的変数y)が取得できます。

X, y = datasets.load_iris(return_X_y=True)
print('全データ:',X.shape, y.shape)

3.訓練データと検証データにデータを分ける

scikit-learnには、データを学習用に使う訓練データと、学習したモデルの精度を測定するための検証データに分割するツールも用意されています。

今回は、sklearn.model_selectionから、train_test_splitをimport して、データを分割します。

train_test_split()メソッドは、説明変数Xと目的変数yを引数として渡して、test_sizeでテストデータの割合を指定して、分割を行います。

また、random_stateに固定の値を指定しておく事で、毎回同じ分割結果を得ることができます。

random_stateを指定しないと、実行毎に分割結果が変わるので、精度が上がった時に、データの分割具合がちょうどよくて精度が上がったのか、良いモデルができたので、精度が上がったのかがわからなくなるので、指定しておく必要があります。(再現性の確保とも呼ばれます。)

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=0)

print('訓練データ:',X_train.shape, y_train.shape)
print('検証データ:',X_test.shape, y_test.shape)

4.データを学習し、予測する

 前回同様、scikit-learnからインポートしたsvmサポートベクターマシン)のモジュールから、SVC(Support Vector Classification)のクラスを呼び出して、サポートベクターマシンを使った分類ができるモデルの実体を作ります。

clf = svm.SVC()

モデルの実体ができたら、あとは、fit()メソッドを使って、訓練データ(X_train)と正解ラベル(y_train)を引数に渡して実行するだけで、学習は完了です。

clf.fit(X_train, y_train)

学習したモデル(clf)を使って、予測を行います。

予測についても学習と同様に簡単で、predict()メソッドに検証データ(X_test)を渡すことで、予測した結果を出力してくれます。

pred = clf.predict(X_test) 

5.正解率を求める

 予測した結果(pred)の正解率を算出します。

前回は、一個一個正解ラベルを比較して正解率を出しましたが、今回は、scikit-learnからmetricsモジュールをimportして、accuracy_score()メソッドを使って算出します。

accuracy_score()は、検証データの正解ラベル(y_test)と予測した結果(pred)を引数に渡す事で、予測した結果が正解ラベルと同じだった割合を算出してくれます。

ac_score = metrics.accuracy_score(y_test, pred)
print('正解率:',ac_score)

6.コマンドラインから実行してみる。

先ほど作成したファイルを実行してみます。

python3 iris-train.py

以下の通り、アヤメのデータを読み込んで、svm.SVC()を使って、品種を分類するモデルを作成することができました。

f:id:kanriyou_h004:20200516161625p:plain

図1.iris-train.py実行結果

約93%の正解率の予測モデルとなりました。

scikit-learnを使えば、ほとんど何も考えずに、93%の予測モデルを作成することができました。

実業務では、もっと複雑なので、これほどうまくいくことはないかも知れませんが、必ずしも100%の精度を求められるようなものでなければ、十分実用に耐えられるなぁと感じました。

 

次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピング機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】