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

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

クロスバリデーションでモデルの妥当性を検証する(Pythonによるスクレイピング&機械学習テクニック)

今回は、クロスバリデーションという手法でモデルの妥当性を検証しました。

学習したデータに対してとても良い精度を出すモデルであっても、予測が必要な新たなデータに対する精度が非常に低い、いわゆる「過学習」という状態になることが良くあります。こうならないように、汎用的に良い精度になるモデルを作成するためには、妥当性の検証が必要になります。

その1手法であるクロスバリデーションに挑戦しました。

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

今回は、Jupyter notebookを使って実行を行いました。

Jupyter notebookについては、以下もご参照ください。

oregin-ai.hatenablog.com

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

クロスバリデーションでモデルの妥当性を検証する

1.クロスバリデーションとは

クロスバリデーションとは、日本語では「交差検証」とも呼ばれます。

この手法は、データを複数のグループに分割して、学習用データと、検証用データを入れ替えていくことで少ないデータでもモデルの妥当性を評価することができる検証法になります。

例:4つのグループに分割する場合

  1. A~Dの4つのグループにデータを分ける。
  2. ABCを学習用データ、Dを検証法データとして精度1を求める。
  3. ABDを学習用データ、Cを検証法データとして精度2を求める。
  4. ACDを学習用データ、Bを検証法データとして精度3を求める。
  5. BCDを学習用データ、Aを検証法データとして精度4を求める。
  6. 精度1~4を平均してこのモデルを評価する。

f:id:kanriyou_h004:20200616223040p:plain

図1.クロスバリデーション概要図

2.全体像

コード全体は以下の通りで、Jupyter Notebook上で実行しました。

from sklearn import svm, datasets
from sklearn.model_selection import cross_val_score

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

# モデルを定義する
clf = svm.SVC(kernel='linear', C=1)

# クロスバリデーションを行う
scores = cross_val_score(clf, X, y, cv=5)
print("各正解率=", scores)
print("正解率=", scores.mean())

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

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

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)

4.モデルを定義する

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

ただし、今回は「kernel='liner'」を指定し、線形に分離します。また、「C=1」は、誤分類の許容度を表して、小さければ小さいほど誤分類を許容します。

clf = svm.SVC(kernel='linear', C=1)

5.クロスバリデーションを行う

sklearn.model_selectionモジュールの、cross_val_score()メソッドを使って、クロスバリデーションを行ってモデルの評価を行います。

これまでと違って、学習用データを使って学習(fit())を行い、検証データから予測(predict())を行ってから、精度(accuracy_score())などを求めるのではなく、一気に学習、検証、精度計算まで実施できます。

# クロスバリデーションを行う 
scores = cross_val_score(clf, X, y, cv=5)
print("各正解率=", scores)
print("正解率=", scores.mean())

6.Jupyter Notebook上で実行してみる

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

以下の通り、クロスバリデーションを実施して、このモデルの精度が測定できました。

f:id:kanriyou_h004:20200616225305p:plain

図2.クロスバリデーション実行結果

正解率は、98%となり、前回単純に作成したSVMモデルの93%より精度が上がりました。前回の実施内容は以下の通りです。

oregin-ai.hatenablog.com

 

次回は、グリッドサーチを使った、ハイパーパラメータのチューニングを行っていきたいと思います。

 

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

 

 

 【過去記事】

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

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

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

oregin-ai.hatenablog.com 

 

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

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

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

g-kentei.hatenablog.com

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