はじめに
scikit-learnのライブラリを使って簡単にconfusion matirxを表示できるが、数値マトリックスのみでラベルがないので実用上は不便です。
この対応を簡単に行うためのメモです。(ラベルつきDataFrameに変換して表示する)
なお、ここで紹介している小ネタを含めて、Pythonでモデルを構築する際の便利な技は、私の著書「Pythonで儲かるAIをつくる」の中にいろいろと記載されています。
下記のサポートサイトでコードはすべて公開していますので、関心のある方は是非そちらも参照して下さい。
前提
sckit-learnがライブラリとして使えること
サンプルコード
以下にサンプルコードを記載します。
# 余分なワーニングを非表示にする
import warnings
warnings.filterwarnings('ignore')
# 必要ライブラリのimport
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# データフレーム表示用関数
from IPython.display import display
# y_test に正解値、 y_predに予測値がすでに入っていることを前提にします。
# 以下の2行はこの前提を満たすためのダミーコードです。
y_test = np.array(
['疾患なし', '疾患なし', '疾患なし', '疾患なし', '疾患なし',
'疾患あり', '疾患あり', '疾患あり', '疾患なし','疾患なし',
'疾患あり', '疾患なし', '疾患なし', '疾患なし', '疾患あり',
'疾患なし', '疾患なし', '疾患なし','疾患なし', '疾患なし',
'疾患あり', '疾患あり', '疾患なし', '疾患なし', '疾患なし',
'疾患あり', '疾患なし','疾患なし'])
y_pred = np.array(
['疾患なし', '疾患なし', '疾患なし', '疾患なし', '疾患なし',
'疾患あり', '疾患あり', '疾患あり', '疾患なし', '疾患なし',
'疾患あり', '疾患なし', '疾患なし', '疾患なし', '疾患あり',
'疾患なし', '疾患あり', '疾患なし', '疾患なし', '疾患なし',
'疾患なし', '疾患あり', '疾患なし', '疾患なし', '疾患なし',
'疾患あり', '疾患なし', '疾患なし'])
# 混同行列(confusion matrix)の取得
labels = ['疾患なし', '疾患あり']
from sklearn.metrics import confusion_matrix
matrix = confusion_matrix(y_test, y_pred, labels=labels)
print(matrix)
出力結果
[[19 1]
[ 1 7]]
ここで得られたnumpyの2次元配列matrix
がscikit-learnのライブラリで得られた結果なのですが、単に数値の配列なので、読み取るのが難しいです。
そこで、次のような関数を定義します。
# 混同行列表示用関数
def make_cm(matrix, columns):
# matrix numpy配列
# columns 項目名リスト
n = len(columns)
# '正解データ'をn回繰り返すリスト生成
act = ['正解データ'] * n
pred = ['予測結果'] * n
#データフレーム生成
cm = pd.DataFrame(matrix,
columns=[pred, columns], index=[act, columns])
return cm
次のような形で呼び出します。
# make_cmを使った混同行列標示
cm = make_cm(matrix, ['疾患なし', '疾患あり'])
# 結果の表示
display(cm)
結果は次のとおり。
きれいにラベルが振られて、意味のわかりやすい混同行列表示になりました。
実装のテクニックという観点で解説すると、DataFrameのdisplay関数は、2階層のインデックスの表示もできるので、その方法を使っています。
この例は二値分類ですが、同じコードで多値分類も対応可能です。