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

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

グリッドサーチでハイパーパラメータを調整する(Pythonによるスクレイピング&機械学習テクニック)

今回は、グリッドサーチでハイパーパラメータを調整しました。

これまで、学習モデルは、特に引数を指定しないか、特定の値のみ指定して学習をおこなっていました。この「引数」は、学習時に更新されていくパラメータとは区別して、「ハイパーパラメータ」と呼ばれます。

ハイパーパラメータの値によって、学習モデルの精度も変わってくるため、ハイパーパラメータを調整(チューニング)する必要があります。

この調整を自動的に行う手法の1つが「グリッドサーチ」になります。

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

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

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

oregin-ai.hatenablog.com

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

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

1.グリッドサーチとは

グリッドサーチは、前述の通り、学習モデルに渡す引数(ハイパーパラメータ)の組み合わせを、総当たりで試して、最も良い精度のハイパーパラメータを探索する手法になります。

この手法は、総当たりで探索するので、探索に時間がかかりますが、わかりやすい手法です。

例:3つのハイパーパラメータをを調整する場合

  • ハイパーパラメータA: or 10 or 100
  • ハイパーパラメータB:'linear' or 'rbf'
  • ハイパーパラメータC:16 or 32 or 64

 以下のように、組み合わせ1から順に、ハイパーパラメータの組み合わせを試していき、一番精度が高いハイパーパラメータの組み合わせを探索します。

f:id:kanriyou_h004:20200620184627p:plain

図1.ハイパーパラメータの組み合わせ

2.全体像

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

import pandas as pd
from sklearn import svm, metrics
from sklearn.model_selection import GridSearchCV

# MNISTのCSVデータを読み込む
train_csv = pd.read_csv("./mnist/train.csv")
test_csv  = pd.read_csv("./mnist/t10k.csv")

# 必要な列を抽出
train_label = train_csv.iloc[:, 0]
train_data  = train_csv.iloc[:, 1:577]
test_label  = test_csv.iloc[:, 0]
test_data   = test_csv.iloc[:, 1:577]
print("学習データ数=", len(train_label))

# グリッドサーチのパラメータを設定
params = [
    {"C": [1,10,100,1000], "kernel":["linear"]},
    {"C": [1,10,100,1000], "kernel":["rbf"], "gamma":[0.001, 0.0001]}
]

# グリッドサーチを行う
clf = GridSearchCV( svm.SVC(), params, n_jobs=-1,cv=3,iid=True )
clf.fit(train_data, train_label)
print("学習モデル=", clf.best_estimator_)

# 検証用データで精度を確認
pre = clf.predict(test_data)
ac_score = metrics.accuracy_score(pre, test_label)
print("正解率=",ac_score)

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

3.MNISTのCSVデータを読み込む

まず、MNISTのCSVデータを読み込みます。

MNISTのデータをダウンロードして、CSV化する手順については、以下をご参照ください。

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

CSVのデータが準備できたら、Pandasのread_csv()メソッドを使って、CSVデータを読み込みます。

train_csv = pd.read_csv("./mnist/train.csv")
test_csv = pd.read_csv("./mnist/t10k.csv")

4.必要な列を抽出

読み込んだPandasのデータから、訓練用データと訓練用の正解ラベルデータ、検証用データと検証用の正解ラベルデータを読み込みます。

正解ラベルデータは、それぞれのデータの先頭の列(.iloc[:, 0])にあります。

train_label = train_csv.iloc[:, 0]
train_data = train_csv.iloc[:, 1:577]
test_label = test_csv.iloc[:, 0]
test_data = test_csv.iloc[:, 1:577]
print("学習データ数=", len(train_label))

5.グリッドサーチのパラメータを設定

グリッドサーチをするために、ハイパーパラメータの組み合わせを設定します。

辞書型の変数(params)に、1~1000までの値の'C'と、'kernel'に'linear'を組み合わせるパターンと、1~1000までの値の'C'と、'kernel'に'rbf','gamma'に0.0001~0.001を組み合わせるパターンを設定します。

params = [ 
  {"C": [1,10,100,1000], "kernel":["linear"]},
  {"C": [1,10,100,1000], "kernel":["rbf"], "gamma":[0.001, 0.0001]}
     ]

なお、'C'はサポートベクターマシンの境界を計算する際に誤分類をどこまで許容するかを指定する値です。小さければ小さいほど誤分類を許容しません。

また、'kernel'は、サポートベクターマシンのアルゴリズムを指定します。'linear'は線形分類で、'rbm'は、ガウシアンカーネルを用いた分類となります。'gamma'は、ガウシアンカーネルで、境界の複雑さを表す値になります。小さいほど単純な境界で、大きいほど複雑な境界となります。

6.グリッドサーチを行う

sklearn.model_selectionモジュールの、GridSearchCV()メソッドを使って、グリッドサーチの実体を作成します。

引数の一つ目は、学習モデル(今回は、SVC(サポートベクターマシン分類))、二つ目は、先ほど設定した学習モデルに渡すハイパーパラメータの組み合わせになります。

続く'n_jobs'は、使用するCPUコア数で、-1を指定すると全コア数を利用します。'cv'はクロスバリデーションの分割数になります。

 

clf = GridSearchCV( svm.SVC(), params, n_jobs=-1,cv=3)

 グリッドサーチをの実体ができたら、fit()メソッドを使って、ハイパーパラメータの組み合わせを総当たりで学習します。

clf.fit(train_data, train_label)  

総当たりの学習が完了した時点で、best_estimator_で、精度が最も高かったハイパーパラメータの組み合わせを出力できます。

print("学習モデル=", clf.best_estimator_)

7.検証用データで精度を確認

predict()メソッドを使って、検証用データ(test_data)の予測を行います。 

pre = clf.predict(test_data)

 accuracy_score()メソッドを使って、予測データと正解データを比較して、正解率を計算します。

 ac_score = metrics.accuracy_score(pre, test_label)
print("正解率=",ac_score)

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

先ほど作成したコードをJupyter Notebook上で実行してみます。

以下の通り、グリッドサーチを実施して、ハイパーパラメータの組み合わせを探索後、このモデルの精度が測定できました。

f:id:kanriyou_h004:20200620201834p:plain

図2.グリッドサーチ実行結果

正解率は、86.6%となりました。

学習データ1000件でなかなかの性能が得られたと思います。

ただ、組み合わせを総当たりで探索するので、結構計算時間がかかりました。

 

今回で、第4章の機械学習が完了しました。

次回からは、第5章の深層学習に入ります!頑張ります!

 

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

 

 

 【過去記事】

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

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

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

oregin-ai.hatenablog.com 

 

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

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

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

g-kentei.hatenablog.com

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