7
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

【Python機械学習Tips】sckit-learnのconfusion matrixでラベルを含めて表示する

はじめに

scikit-learnのライブラリを使って簡単にconfusion matirxを表示できるが、数値マトリックスのみでラベルがないので実用上は不便です。
この対応を簡単に行うためのメモです。(ラベルつきDataFrameに変換して表示する)

なお、ここで紹介している小ネタを含めて、Pythonでモデルを構築する際の便利な技は、私の著書「Pythonで儲かるAIをつくる」の中にいろいろと記載されています。
下記のサポートサイトでコードはすべて公開していますので、関心のある方は是非そちらも参照して下さい。

書籍「Pythonで儲かるAIをつくる」サポートサイト

スクリーンショット 2020-09-19 14.27.39.png

前提

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)

結果は次のとおり。

スクリーンショット 2020-09-19 14.23.28.png

きれいにラベルが振られて、意味のわかりやすい混同行列表示になりました。
実装のテクニックという観点で解説すると、DataFrameのdisplay関数は、2階層のインデックスの表示もできるので、その方法を使っています。

この例は二値分類ですが、同じコードで多値分類も対応可能です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
7
Help us understand the problem. What are the problem?