Pythonによる多クラス混同行列の作成と評価指標の計算
Pythonを使って多クラス混同行列を作り、評価指標を計算してみましょう。
混同行列はsklearn.metricsパッケージを使うと非常に簡単に計算することができますので、Excelで計算させるよりもパッとPythonでやってしまいましょう。
混同行列についてはこちらをご覧ください。
混同行列を作成する
ここでは一例として、じゃんけんの手の画像を見せて、それが「グー」「チョキ」「パー」のいずれなのかを判断させるAIを考えます。
まず、混同行列を書くという事は、「正解データ」と「推測データ」が存在しているはずです。
それでは正解データ10枚に対して、AIの推論結果は以下になったとします。
正解 | 推論 |
グー | グー |
チョキ | チョキ |
パー | パー |
パー | チョキ |
パー | チョキ |
パー | チョキ |
グー | グー |
チョキ | パー |
パー | グー |
グー | グー |
この情報をリスト化して、confusion_matrixメソッドを使うと。。。
1 2 3 4 5 6 |
train = ["グー","チョキ","パー","パー","パー","パー","グー","チョキ","パー","グー"] pred = ["グー","チョキ","パー","チョキ","チョキ","チョキ","グー","パー","グー","グー"] name = ["グー","チョキ","パー"] from sklearn.metrics import confusion_matrix val_mat = confusion_matrix(train, pred, labels=name) |
1 2 3 |
[[3 0 0] [0 1 1] [1 3 1]] |
あっという間に混同行列が出てきました。
ちなみに、confusion_matrixの引数のlabelsに順番を指定すると、混同行列の列と行がその順番に並びます。
また、以下のようにすれば結果をExcelに吐き出すことができます。
1 2 |
conf_mat = pd.DataFrame(val_mat,index=name,columns=name) conf_mat.to_csv("result.csv") |
今回は3×3なので良いですが、100×100くらいになってくると出来上がった表はExcelで見たほうが分かりやすいかもしれません。
評価指標を計算する
さて、お次は混同行列における評価指標のうち、「正解率」「再現率」「適合率」「F値」を出してみます。
こちらも、それぞれ1行で計算できる便利メソッドが準備されています。
正解率(Accuracy)
正解率は混同行列全体に対して1つだけ計算されます。
1 2 3 |
from sklearn.metrics import accuracy_score acc_score = accuracy_score(train, pred) print(acc_score) |
1 |
0.5 |
正解率は0.5と計算されました。
10個中、5個正解しているので正しい答えのようです。
再現率(Recall)
再現率はクラスごとに計算されます。
1 2 3 |
from sklearn.metrics import recall_score rec_score = recall_score(train, pred, average=None) print(rec_score) |
1 |
[1. 0.5 0.2] |
「グー」の再現率は1.0、「チョキ」の再現率は0.25、「パー」の再現率は0.5だと分かりました。
ちなみに、全ての再現率を平均した値を知りたければ、引数average=”macro”を指定すればOKです。
適合率(Precision)
適合率はクラスごとに計算されます。
1 2 3 |
from sklearn.metrics import precision_score pre_score = precision_score(train, pred, average=None) print(pre_score) |
1 |
[0.75 0.25 0.5 ] |
「グー」の適合率は0.75、「チョキ」の適合率は0.25、「パー」の適合率は0.5だと分かりました。
こちらも引数average=”macro”とすれば平均値が出せます。
F値
F値もクラスごとに計算されます。
1 2 3 |
from sklearn.metrics import f1_score f1_score = f1_score(train, pred, average=None) print(f1_score) |
1 |
[0.85714286 0.33333333 0.28571429] |
「グー」のF値は約0.86、「チョキ」のF値は0.33、「パー」のF値は0.29だと分かりました。
こちらも引数average=”macro”とすれば平均値が出せます。
まとめ
これで、Pythonで混同行列とその評価指標が計算できました。
ほんの数行で計算できますので、是非活用して頂ければと思います。