ハイパーパラメータの最適化と結果の見方【Pythonとscikit-learnで機械学習:第8回】

機械学習においてハイパーパラメータを最適化する手法について、実装・解説します。

本シリーズでは、Pythonを使用して機械学習を実装する方法を解説します。

各アルゴリズムの数式だけでなく、その心、意図を解説していきたいと考えています。

本記事では、XORデータに対してKernel SVCを適用する例題を基に、ハイパーパラメータの最適化手法と、その結果の見方を紹介します。

パラメータ探索の実装

今回はグリッドサーチと呼ばれる手法でハイパーパラメータの最適化を行います。

グリッドサーチは事前に決めたパラメータの組み合わせを全部試してみて、一番良いパラメータを決定する方法です。

Kernel SVCのカーネル、罰則の大きさC、カーネルの形γを最適化します。

まずは実装コードと結果をご覧ください。

まずはじめに学習データとテストデータに分割し、学習データで最適化を行います。

# 解説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回:ハイパーパラメータの最適化手法と結果の見方でした。

次回からは、教師なし学習について解説します。

【目次】Python scikit-learnの機械学習アルゴリズムチートシートを全実装・解説
scikit-learnのアルゴリズムチートマップで紹介されている手法を、全て実装・解説してみました。 ...