ひとことで言うと
混同行列は、正解ラベルと予測ラベルの組合せを数える表です。二値分類では、陽性を当てた TP、陰性を陽性とした FP、陽性を陰性とした FN、陰性を当てた TN に分かれます。誤りの向きを残せる点が正解率との違いです。
実際の状態と判定結果の交差点に仕分ける台帳です。見逃しと誤警報を別の箱で数えます。
なぜ必要か
見逃しと誤警報では損失が違います。TP/FP/FN/TNを分けると、コストを決められ、その集計から precision や recall などの指標が導かれます。
正解率が同じでも、どの種類の誤りが多いかは同じとは限りません。たとえば、陽性を見逃した数と、陰性を誤って陽性と判定した数は、どちらも「不正解」ですが、混同行列では別のセルに残ります。したがって、評価値を読む前に、実際のラベルと予測ラベルのどちらを基準に集計しているかを表で確認できます。
この読み方は、単一の指標を選ぶ前の診断にも使えます。FPを減らすことを優先すると判定を陽性にしにくくする方向になり、FNを減らすことを優先すると陽性を拾う方向になります。どちらを重く扱うかは行列の数え方から自動的に決まるのではなく、誤警報と見逃しのコストをどう置くかで決まります。
FPとFNの重大さはタスク次第で、閾値を動かすと両者の数も変わります。
仕組み
実装では行と列の規約を固定します。scikit-learn の confusion_matrix は行が真のラベル、列が予測ラベルです。逆向きの教材もあるため、軸ラベルを先に読みます。
| 予測: 陰性 | 予測: 陽性 | |
|---|---|---|
| 真: 陰性 | TN | FP |
| 真: 陽性 | FN | TP |
この表を とし、行が真値 、列が予測値 なら要素は です。陽性を1、陰性を0と置けば、TN=、FP=、FN=、TP= です。予測陽性の列の合計は TP+FP、真陽性の行の合計は FN+TP で、ここから指標の分母が決まります。多クラスでは 行列となり、対角が正解、非対角が取り違えです。
行と列を取り違えると、同じ4つの数を使っていても誤りの向きが反転します。たとえば、行を予測、列を真値として読む表では、上の表のFPとFNに相当する位置が入れ替わります。コードの配列を確認するときは、行列の数字だけを眺めず、y_true をどの軸、y_pred をどの軸へ渡したかと、ラベルの並び順を一緒に確かめます。
多クラスでは、各行が「そのクラスが実際だったサンプルの行」、各列が「そのクラスと予測したサンプルの列」です。対角要素はクラスごとの正解数なので、対角から離れた非対角要素を見れば、どのクラス同士を混同したかが分かります。二値の4つの名前を無理に全セルへ当てはめるのではなく、注目するクラスを一つ決め、そのクラス対それ以外として行列を読むのが整理しやすい方法です。
行列の軸とラベル順を固定しておけば、モデルやデータ分割をまたいだ比較でも、同じ位置が同じクラスを表します。逆に、出現したラベルだけで軸を作ると、評価対象によって行列のサイズや位置が変わり、セルの横比較を誤る原因になります。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| TP/FP/FN/TNの対応 | 真値と予測値の軸を先に読む | 行列の位置を暗記して反転する |
| 指標の導出 | 分母が予測陽性か真陽性かを表から追う | 正解率だけで評価する |
| 多クラスの解釈 | 、対角が正解 | 二値の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は陽性を陰性と誤判定した数です。重みは用途のコストで決まります。