本記事では、機械学習モデルの評価方法を解説します。

機械学習モデルの評価は「ホールドアウト法」と「交差検定(クロスバリデーション)」と「混合行列」が分かれば大丈夫です。Pythonとscikit-learnのコードと合わせて見ていきます。

関連記事:AIエンジニアが教えるゼロから機械学習の勉強法

評価方法①:ホールドアウト法

ホールドアウト法は、モデルを作る学習データ (Train Data)と、モデルを評価するテストデータ(Test Data)に分割して評価します。

なぜデータを分けるのでしょうか。理由は、モデルは未知のデータに対して予測できなければならないからです。学習データでテストしても、モデルの汎化能力は評価できません。

①データセットを学習データとテストデータに分割する

学習データとテストデータに分割します。
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.30)

②学習データを使ってモデルを開発する

fit関数でモデルが出来ます。
clf = svm.SVC(C=10, gamma=0.0001)
clf.fit(X_train, y_train)


③テストデータで評価する

score関数でモデルを評価出来ます。
print(clf.score(X_test, y_test))

参考記事:実務で使うとこだけ!python機械学習(AI)のデータ処理(pandas/scikit-learn)

評価方法②:交差検定(クロスバリデーション)

最も利用されている評価方法です。

交差検定では、用意したデータを例えば5個に分けて、1回目はそのうちの1個をテストデータ、それ以外の4個を学習データとして、学習・評価します。2回目は、1回目と異なる別のデータをテストデータとして使い、3回目は1,2回目と異なるデータで評価をします。そして、各回で測定した精度の平均を取ります。

今回は、グリッドサーチで最適なパラメータを探しながらモデルを交差検定で評価します。

①探索したいパラメータを設定する

探索したいパラメータをリスト型で定義します。パラメータはアルゴリズムによって異なります。
parameters  = {'C': [1, 10, 100, 1000],  'gamma': [0.01, 0.001, 0.0001]}

②GridSearch関数にデータを学習させる

GridSearchCV関数は、素晴らしい関数です。ハイパーパラメータの探索、モデル学習、交差検定での評価をすべて行ってくれます。
関数内のcvパラメータは、データセットの分割数です。ここでは5分割なので、5回学習されます。また、今回の学習回数は、上で設定したコスト関数Cの4つと、カーネルpammaの3つの総当たりで、12回の学習が行われます。

clf = model_selection.GridSearchCV(svm.SVC(), parameters, cv=5)
clf.fit(X, y)
print(clf.best_score_)

(参考)ホールドアウト法と交差検定はどちらが良いのか

交差検定とホールドアウト法を比べた場合、交差検定の方がより評価結果の信頼が高いです。なぜならデータを交差して評価するという事を繰り返し、平均化しているので、たまたまテストデータに特定のデータが偏っているという事がないからです。

例えばプロジェクトで、10-fold交差検定で精度60%のモデルを、ホールドアウト法に変えたところ72%の精度が出たとします。この場合ホールドアウト法の精度を報告したくなりますが、交差検定の結果を報告すべきです。

評価方法③:混合行列

モデル評価では、正解率が王様です。しかし、最も正解率が高いモデル=業務で利用できるモデルとは言えないこともあります。

例えば、異常検知のような偏りのあるデータを考えてみましょう。100個のデータのうち、99個は正常で、1個が異常のデータです。この100件のデータを学習した結果、すべてのデータを正常と判断するモデルができました。このモデルの正解率は、99%と非常に高精度になります。しかし、このモデルは業務では使えません。異常を検知出来ていないからです。

このようにきちんと学習ができたかどうかは、正解率だけではなく、実際にどんな感じでモデルが判別されているか確認する必要があります。その確認方法が、混合行列です。

混合行列の意味を読み解く

混同行列は、実際のクラスを縦軸に、モデルが予測したクラスを横軸に表した行列のことです。正常と異常の2分類を行うケースでは、2×2の混同行列になります。具体的な混合行列は、以下の図になります。
AI2

なんだかわかりにくいですね。よく混乱される部分でもあります。例として、HIVに感染したかどうかを判断するモデルの混合行列を考えてみます(上の図です)。

青色の部分:予測が当たっている
TP(True Positive):実際に感染している人を、モデルが感染していると予測
TN(True Negative):実際に感染してない人を、モデルが感染してないと予測

赤色の部分:予測が間違っている
FP(False Positive):実際に感染していない人を、モデルが感染していると予測
FN(False Negative):実際に感染している人を、モデルが感染していないと予測

FPとFN、どちらがまずいか分かりますか。
FPは、感染していない人を感染したと予測したわけです。予測された本人は落ち込むでしょうが、再検査すれば感染していないことが判明するわけです。ですので、そこまで問題にはなりません。

一方FNは、すでに感染している人を、感染していないと予測したわけです。本人は感染していないと思いますから、早期の治療機会を失ってしまうことになります。HIVの感染者が広がってしまう危険性もあります。そのため、FNの誤りは致命的な誤りになります。HIVのモデル開発では、FNを0に近づけるように努力すべきでしょう。

適合率と再現率

適合率や再現率という評価指標もあります。今回のHIV感染判別モデルでは、FNが含まれる再現率を重視すべきでしょう。

・適合率 (precision):正と予測したデータのうち,実際に正であるものの割合
  Precision=TP/TP+FP

・再現率 (recall):実際に正であるもののうち,正であると予測されたものの割合
  Recall=TP/TP+FN

なお、再現率と適合率が高ければ高いほど、そのモデル性能は高いです。ですが、両者はトレードオフの関係になっています。そこで、双方を共に追求する際の指標として、両者の調和平均を意味するF値が参照されることもあります。

機械学習モデルの前提:完璧なモデルは存在しない

機械学習とは、ある対象の"特徴"をモデルという数式に置き換える手法です。よって、精度100%のモデルは開発できません。世の中の事象には、無限の特徴量が存在しているので、対象のすべての特徴量データを収集することは不可能だからです。
またサイコロのような偶然が支配する事象の予測も不可能です。

しかし人間の行動には、一定のパターンが存在しています。データサイエンティストの仕事は、そのパターンをモデルとして開発し、精度をなるべく100%に近づける事です。

データサイエンティストがモデルを開発する場合、以下のような選択をしています。
・特徴量を選択する
・機械学習のアルゴリズムを選択する
・アルゴリズムのハイパーパラメーターを設定する

参考記事:これだけは知っておけ!PythonでAI開発の基礎まとめ

いろんな選択肢があるため、精度の高いモデルを開発するためには、実際にモデル作って評価してみないと分かりません。

今回はモデルの評価方法として、「ホールドアウト法」と「交差検定」と「混合行列」をご紹介しました。

本日のまとめ

機械学習のモデル評価は、「交差検定」と「混合行列」で確認しましょう。

なお本記事の参考書籍は、「Pythonで始める機械学習」です。モデルの評価と改良について、1章まるまる解説してくれています。機械学習を学ぶ最初の1冊におすすめです。