「完璧なモデルなどといったものは存在しない。完璧な絶望が存在しないようにね。」


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

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

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

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

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

ではどうやってモデルを評価すればいいのでしょうか。この記事では、その評価方法を解説します。実は、モデルの評価は「ホールドアウト法」と「交差検定」と「混合行列」が分かれば大丈夫です。pythonとscikit-learnのコードと合わせて見ていきます。

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

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

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

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

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

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

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

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


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

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

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

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

交差検定では、用意したデータを例えば5個に分けて、1回目はそのうちの一つをテストデータ、それ以外を学習データとして、学習・評価します。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 = grid_search.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の混同行列になります。具体的な混合行列は、以下の図になります。
AI

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

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

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

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

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

適合率と再現率

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

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

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


本日のまとめ
機械学習のモデル評価は、交差検定と混合行列で確認しましょう。
より詳しく知りたい方は、以下の「pythonで始める機械学習」という本がおすすめです。モデルの評価と改良について、1章まるまる解説してくれています。pythonで機械学習される方は必読の本です。




合わせて読みたい
AIエンジニアが教えるゼロから機械学習の勉強法