機械学習

混同行列

正解ラベルと予測ラベルの組合せを数え、TP・FP・FN・TNと分類指標の土台を作る表です。

  • C|周辺
  • 機械学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

混同行列は、正解ラベルと予測ラベルの組合せを数える表です。二値分類では、陽性を当てた TP、陰性を陽性とした FP、陽性を陰性とした FN、陰性を当てた TN に分かれます。誤りの向きを残せる点が正解率との違いです。

実際の状態と判定結果の交差点に仕分ける台帳です。見逃しと誤警報を別の箱で数えます。

なぜ必要か

見逃しと誤警報では損失が違います。TP/FP/FN/TNを分けると、コストを決められ、その集計から precision や recall などの指標が導かれます。

正解率が同じでも、どの種類の誤りが多いかは同じとは限りません。たとえば、陽性を見逃した数と、陰性を誤って陽性と判定した数は、どちらも「不正解」ですが、混同行列では別のセルに残ります。したがって、評価値を読む前に、実際のラベルと予測ラベルのどちらを基準に集計しているかを表で確認できます。

この読み方は、単一の指標を選ぶ前の診断にも使えます。FPを減らすことを優先すると判定を陽性にしにくくする方向になり、FNを減らすことを優先すると陽性を拾う方向になります。どちらを重く扱うかは行列の数え方から自動的に決まるのではなく、誤警報と見逃しのコストをどう置くかで決まります。

FPとFNの重大さはタスク次第で、閾値を動かすと両者の数も変わります。

仕組み

実装では行と列の規約を固定します。scikit-learn の confusion_matrix は行が真のラベル、列が予測ラベルです。逆向きの教材もあるため、軸ラベルを先に読みます。

予測: 陰性予測: 陽性
真: 陰性TNFP
真: 陽性FNTP

この表を CC とし、行が真値 ii、列が予測値 jj なら要素は Ci,jC_{i,j} です。陽性を1、陰性を0と置けば、TN=C0,0C_{0,0}、FP=C0,1C_{0,1}、FN=C1,0C_{1,0}、TP=C1,1C_{1,1} です。予測陽性の列の合計は TP+FP、真陽性の行の合計は FN+TP で、ここから指標の分母が決まります。多クラスでは K×KK\times K 行列となり、対角が正解、非対角が取り違えです。

行と列を取り違えると、同じ4つの数を使っていても誤りの向きが反転します。たとえば、行を予測、列を真値として読む表では、上の表のFPとFNに相当する位置が入れ替わります。コードの配列を確認するときは、行列の数字だけを眺めず、y_true をどの軸、y_pred をどの軸へ渡したかと、ラベルの並び順を一緒に確かめます。

多クラスでは、各行が「そのクラスが実際だったサンプルの行」、各列が「そのクラスと予測したサンプルの列」です。対角要素はクラスごとの正解数なので、対角から離れた非対角要素を見れば、どのクラス同士を混同したかが分かります。二値の4つの名前を無理に全セルへ当てはめるのではなく、注目するクラスを一つ決め、そのクラス対それ以外として行列を読むのが整理しやすい方法です。

行列の軸とラベル順を固定しておけば、モデルやデータ分割をまたいだ比較でも、同じ位置が同じクラスを表します。逆に、出現したラベルだけで軸を作ると、評価対象によって行列のサイズや位置が変わり、セルの横比較を誤る原因になります。

Ci,j=#{真のクラスが i、予測クラスが j のサンプル}C_{i,j}=\#\{\text{真のクラスが }i\text{、予測クラスが }j\text{ のサンプル}\}

試験でどう問われるか

問われ方正解に寄る条件引っかけ
TP/FP/FN/TNの対応真値と予測値の軸を先に読む行列の位置を暗記して反転する
指標の導出分母が予測陽性か真陽性かを表から追う正解率だけで評価する
多クラスの解釈K×KK\times K、対角が正解二値の4箱をそのまま置く

実装で確かめる

y_true が行、y_pred が列になることを確認します。

import numpy as np

y_true = [0, 1, 0, 1]
y_pred = [1, 1, 1, 0]
cm = np.zeros((2, 2), dtype=int)
for truth, prediction in zip(y_true, y_pred):
    cm[truth, prediction] += 1
print(cm.tolist())
assert np.array_equal(cm, [[0, 2], [1, 1]])

取り違えやすいもの

用語切り分け
正解率TPとTNの割合だけで、FPとFNの向きを区別しない
precision予測陽性の中で当たった割合。表ではTPとFPを使う
recall真の陽性をどれだけ拾ったか。表ではTPとFNを使う
多クラス行列各クラス間の混同を一つの行列で数える

想起チェック

行と列の向きが不明な行列を見たら、最初に何を確認するか

軸ラベルと定義を確認します。規約が違えば TP などの位置も入れ替わります。

FPとFNの違いは何か

FPは陰性を陽性と誤判定し、FNは陽性を陰性と誤判定した数です。重みは用途のコストで決まります。

出典