機械学習の分類モデルの評価指標・混同行列についての基本まとめ【Pythonサンプルコードあり/3分類以上でも簡単】
目次
こんにちは。
今回は機械学習で作った分類モデルを評価する方法をまとめます。
最近このブログではペンギンデータセットを使った機械学習入門というシリーズで記事を書いているのですが、その続編です。
モデルを作って分類してみたはいいけど、どれくらい正しく分類できているのか?どういう見方をすればよいのか?といったときに役立つかと思います。
機械学習の分類モデルの評価指標 ~ 正解率/精度/検出率/F値
機械学習で作成したモデルの目的は「未知のデータから正しく予測・分類すること」なので、どれくらい正しく予測できているのか?という「正しさ」が評価指標となります。
その「正しさ」には色々な種類があります。
- Accuracy 正解率
- 全データに対して、正しくラベルを予測できた割合
- Precision 精度
- 目的のラベルに「予測された」データの中で、正しく予測できた割合
- Recall 検出率
- 目的のラベルに「予測されるべき」データに中で、正しく予測できた割合
- F1 Score F値
- 精度と検出率のバランスの良さ
文字で読むとなんとなく指標として納得できる感じです。
精度と検出率は少しわかりにくいかもしれないので、ペンギンの種類の分類問題で例えてみます。例えばアデリーペンギンを分類したい場合、
- Precision 精度
- アデリーペンギンと「予測された」ペンギンの中で、本当にそれがアデリーペンギンだった割合
- Recall 検出率
- アデリーペンギンに「予測されるべき」ペンギンの中で、アデリーペンギンと予測された割合
といったことです。
混合行列とは
さて、上記の評価指標を計算するにあたって、分類するデータと予測されたラベルを表に表すことを考えてみます。
実際のデータのラベルを縦軸に、予測されたラベルを横軸にとります。そして、データセットのデータがそれぞれ表のどこにあてはまるか調べて、表に件数を書いていきます。それが混合行列です。
混合行列を使うと、機械学習モデルによってデータがどのように正しく分類されたのか、わかりやすく見ることができます。
混同行列をPythonで作成する方法
前回の記事で作成した決定木モデルを参考に、混合行列を見てみたいと思います。
from sklearn.tree import DecisionTreeClassifier # モデルのインポート
tree = DecisionTreeClassifier(max_depth=3) # インスタンスを作成し、枝分かれを3分割までにする
tree.fit(X,y) # フィッティング
y_pred = tree.predict(X) # フィッティングしたモデルで教師データを予測
以上で準備が整いました。混合行列を作成するにはsklearn.metrics
からconfusion_matrix
をインポートします。
from sklearn.metrics import confusion_matrix
confusion_matrix(y,y_pred) # 真のデータ、予測したデータ の順に引数に渡す
結果
array([[146, 0, 5],
[ 1, 122, 5],
[ 4, 1, 58]])
ラベルは{'Adelie': 0, 'Gentoo': 1, 'Chinstrap': 2}
です。表の左上から(0,1,2)なので、上記の表から以下のことがわかります。
- 1行目
- アデリーペンギン151羽のうち、アデリーペンギンに分類されたのは146羽、ヒゲペンギンに分類されたのは5羽
- 1列目
- アデリーペンギンと分類されたペンギン151羽のうち、本当にアデリーペンギンだったのは146羽。ジェンツーペンギンだったのは1羽、ヒゲペンギンだったのは4羽
などなど。分類の結果が簡単にわかりやすく表現できるようになりました。
正解率、検出率、精度、F値をPythonで計算する方法 ~ 分類するラベルが3つ以上でも簡単
それでは評価指標の「正解率」「検出率」「精度」「F値」をPythonで求めてみましょう。上の混同行列からも計算できますが、簡単に算出できる関数が用意されています。
from sklearn.metrics import accuracy_score, precision_score, recall_score
# 正解率
accuracy_score(y, y_pred)
# 0.9532163742690059
# 精度
precision_score(y, y_pred, average=None)
# array([0.96688742, 0.953125 , 0.92063492])
# 検出率
recall_score(y, y_pred, average=None)
# array([0.96688742, 0.99186992, 0.85294118])
# F1 Score
f1_score(y, y_pred, average=None)
# array([0.96688742, 0.97211155, 0.88549618])
先程のアデリーペンギンの「精度」でいうと、146/151= 0.96688...なので、正しく計算できていそうです。一度混同行列を作ってみたので、検算も簡単ですね。
average
は2値分類の場合は不要ですが、分類するラベルが3つ以上の場合はこれを渡さないとエラーになります。
分類モデルの評価指標の使い方
これらの評価指標は目的に応じて使い分ける必要があります。例えば、ジェンツーペンギンとヒゲペンギンはどっちでもいいけど、アデリーペンギンだけは正しく見極める必要がある!という場合は、アデリーペンギンの「検出率」を上げる必要があります。
それでは評価指標をどうやって上げればよいのか?というと「ハイパーパラメータのチューニング」です。また、未知のデータに対する評価指標を高めるには「データセットの交差検証」といったことが必要になります。これらについてはまた別の記事にまとめようと思います。
【補足】 よく出てくる TP,TN, FP, FN について
2値分類問題でよく出てくる TP, TN, FP, FNについてもまとめておきます。
- TP (True Positive, 真陽性)
- 目的のラベルのものを正しく目的のラベルに分類した数
- TN (True Negative, 真陰性)
- 目的のラベルではないものを正しく「目的のラベルではない」と分類した数
- FP (False Positive, 偽陽性)
- 目的のラベルではないものを誤って目的のラベルに分類した数
- 第一種の過誤とも言う。
- 目的のラベルではないものを誤って目的のラベルに分類した数
- FN (False Negative, 偽陰性)
- 目的のラベルのものを誤って「目的のラベルではない」と分類した数
- 第二種の過誤とも言う。
- 目的のラベルのものを誤って「目的のラベルではない」と分類した数
「目的のラベルに分類された=Positive」、「正しい=True」と考えればわかりやすいです。
まとめ
というわけで今回は機械学習の分類モデルの評価指標と混合行列についてまとめてみました。
3ラベル以上に分類する場合でも、表敬式で簡単に分類結果を表示することができました。また、精度や検出率といった評価指標も簡単に計算できました。
ご参考になれば幸いです。
それでは〜
関連記事
【データサイエンス入門】決定木分析をPythonで簡単に試す & 分類と条件分岐を可視化する方法まとめ【サンプルコードあり】
ペンギンデータセットでデータサイエンス入門 〜 教師あり学習・分類編【Python/scikit-learn/機械学習/ガウシアンナイーブベイズ】
ペンギンデータセットでデータサイエンス入門 〜 機械学習の基本・単回帰編【Python/scikit-learn/教師あり学習】