機械学習においてハイパーパラメータを最適化する手法について、実装・解説します。
本シリーズでは、Pythonを使用して機械学習を実装する方法を解説します。
各アルゴリズムの数式だけでなく、その心、意図を解説していきたいと考えています。
本記事では、XORデータに対してKernel SVCを適用する例題を基に、ハイパーパラメータの最適化手法と、その結果の見方を紹介します。
パラメータ探索の実装
今回はグリッドサーチと呼ばれる手法でハイパーパラメータの最適化を行います。
グリッドサーチは事前に決めたパラメータの組み合わせを全部試してみて、一番良いパラメータを決定する方法です。
Kernel SVCのカーネル、罰則の大きさC、カーネルの形γを最適化します。
まずは実装コードと結果をご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | # 1:ライブラリのインポート-------------------------------- import numpy as np #numpyという行列などを扱うライブラリを利用 import pandas as pd #pandasというデータ分析ライブラリを利用 import matplotlib.pyplot as plt #プロット用のライブラリを利用 from sklearn import svm, metrics, preprocessing, cross_validation #機械学習用のライブラリを利用 from mlxtend.plotting import plot_decision_regions #学習結果をプロットする外部ライブラリを利用 from matplotlib.colors import ListedColormap #plot用 from sklearn import grid_search #最適パラメータ探索用のライブラリ from sklearn import metrics #識別結果の表示用 # 2:XORのデータを作成する(x=正、y=正)=0,(x=正、y=負)=1, 的な-------------- np.random.seed(0) X_xor=np.random.randn(200,2) y_xor=np.logical_xor(X_xor[:,0]>0, X_xor[:,1]>0) y_xor=np.where(y_xor,1,0) pd.DataFrame(y_xor) #この行を実行するとデータが見れる # 3:プロットしてみる------------------------------------------------------ %matplotlib inline plt.scatter(X_xor[y_xor==1, 0], X_xor[y_xor==1, 1], c='b', marker='x', label='1') plt.scatter(X_xor[y_xor==0, 0], X_xor[y_xor==0, 1], c='r', marker='s', label='0') plt.legend(loc='best') plt.show # 4:データの整形------------------------------------------------------- X_std=X_xor z=y_xor #データを学習データとテストデータに分ける X_train, X_test, train_label, test_label=cross_validation.train_test_split(X_std,z, test_size=0.1, random_state=0) # 解説5:グリッドサーチを設定する--------------------------------------------------- clf=svm.SVC(class_weight='balanced', random_state=0) param_range=[0.01, 0.1, 1.0] #変化させるパラメータに設定する値たち param_grid=[{'C':param_range,'kernel':['rbf', 'linear'], 'gamma':param_range}] #Cとカーネルとgammaを変化させて最適化させる # 解説6:グリッドサーチにより最適値を求める gs=grid_search.GridSearchCV(estimator=clf, param_grid=param_grid, scoring='accuracy', cv=10, n_jobs=-1) gs=gs.fit(X_train,train_label) print(gs.best_score_) print(gs.best_params_) # 解説7:最適なパラメータをテストデータに適用し,結果を見る clf=gs.best_estimator_ pred=clf.predict(X_test) ac_score=metrics.accuracy_score(test_label,pred) print(ac_score) #テストデータの正答率 cnfmat=metrics.confusion_matrix(y_true=test_label,y_pred=pred ) print(cnfmat) #混合行列の表示 report=metrics.classification_report(y_true=test_label,y_pred=pred ) print(report) #適合率、再現率、F値の結果 #plotする X_train_plot=np.vstack(X_train) train_label_plot=np.hstack(train_label) X_test_plot=np.vstack(X_test) test_label_plot=np.hstack(test_label) plot_decision_regions(X_test_plot, test_label_plot, clf=clf, res=0.01, legend=2) #テストデータをプロット |
まずはじめに学習データとテストデータに分割し、学習データで最適化を行います。
# 解説5:グリッドサーチを設定する
clf=svm.SVC(class_weight=’balanced’, random_state=0)
param_range=[0.01, 0.1, 1.0] #変化させるパラメータに設定する値たち
param_grid=[{‘C’:param_range,’kernel’:[‘rbf’, ‘linear’], ‘gamma’:param_range}]
ここでは、SVCのカーネルはrbfかlinearとし、Cとγは0.01, 0.1, 1.0をそれぞれ検証することに設定しています。
# 解説6:グリッドサーチにより最適値を求める
gs=grid_search.GridSearchCV(estimator=clf, param_grid=param_grid, scoring=’accuracy’, cv=10, n_jobs=-1)
gs=gs.fit(X_train,train_label)
print(gs.best_score_)
print(gs.best_params_)
ここではグリッドサーチを10分割のクロスバリデーションで行い、その結果最もよかった識別率とパラメータ条件を求めています。
# 解説7:最適なパラメータをテストデータに適用し,結果を見る
clf=gs.best_estimator_
pred=clf.predict(X_test)
ac_score=metrics.accuracy_score(test_label,pred)
print(ac_score) #テストデータの正答率
cnfmat=metrics.confusion_matrix(y_true=test_label,y_pred=pred )
print(cnfmat) #混合行列の表示
report=metrics.classification_report(y_true=test_label,y_pred=pred )
print(report) #適合率、再現率、F値の結果
ここでは、学習データで最適だったパラメータ条件で、テストデータを識別した結果を求めています。
混合行列を見れば、各クラスのデータがどのように判定されていたのかを知ることができます。
縦方向が本当のクラス、横方向が判定されたクラスを示します。
今回の結果ですと、クラス0になるはずの2つが誤ってクラス1と判定されています。
presitionは適合率です。
クラス0と判定されたもののうち、本当にクラス0だった割合を示します。
recallは再現率です。
本当はクラス0のうち、クラス0と判定されたものの割合を示します。
F値は聞きなれないですが、その心は、「2クラス分類問題において、この識別器でクラス0と判定されたテストデータの結果に対して、どれくらい信頼性があるのか」を示す値です。
クラス1をクラス0と判定したり、(適合率が低い)、クラス0をクラス1と判定してしまうと(再現率が低いと)、F値が減少します。
これらのレポートはマルチクラスでも、自分のクラス対その他のクラスで計算することができます。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第8回:ハイパーパラメータの最適化手法と結果の見方でした。
次回からは、教師なし学習について解説します。