INDEX
混同行列の理解と応用
混同行列(Confusion Matrix)は、分類モデルの予測結果を整理し、どのような分類が正しく行われ、どのような誤分類が発生したかを確認するための表です。
分類モデルを評価する際には、単に正解率を見るだけでは不十分な場合があります。混同行列を使うことで、正しく分類できた数だけでなく、見逃しや誤検出の内容も詳しく確認できます。
混同行列を図で理解する

混同行列とは
混同行列は、実際のクラスとモデルが予測したクラスを組み合わせて整理した表です。二値分類では、TP、TN、FP、FNの4つに分類されます。
| 予測:Positive | 予測:Negative | |
|---|---|---|
| 実際:Positive | True Positive(TP) | False Negative(FN) |
| 実際:Negative | False Positive(FP) | True Negative(TN) |
TP・TN・FP・FNの意味
| 項目 | 意味 |
|---|---|
| True Positive(TP) | 実際にPositiveで、モデルもPositiveと予測した |
| True Negative(TN) | 実際にNegativeで、モデルもNegativeと予測した |
| False Positive(FP) | 実際はNegativeだが、モデルがPositiveと予測した |
| False Negative(FN) | 実際はPositiveだが、モデルがNegativeと予測した |
混同行列で分かること
混同行列を見ると、モデルがどのような間違いをしているかを確認できます。
- FPが多い場合: 本来NegativeのものをPositiveと誤判定している
- FNが多い場合: 本来Positiveのものを見逃している
- TPとTNが多い場合: 正しく分類できている割合が高い
例えば医療診断では、病気を見逃すFNが問題になりやすく、不正検知では不正を検出できないFNや、正常な取引を不正と判定するFPが重要になります。
Pythonでの混同行列の実装
Scikit-learnを使うと、混同行列を簡単に作成できます。
from sklearn.metrics import confusion_matrix
# 実際のクラス
y_true = [1, 0, 1, 1, 0, 1, 0, 0]
# モデルの予測クラス
y_pred = [1, 0, 0, 1, 0, 1, 1, 0]
# 混同行列を計算
cm = confusion_matrix(y_true, y_pred)
print(cm)
このコードでは、実際のクラスと予測クラスを比較し、混同行列を作成しています。
出力結果の例
[[3 1]
[1 3]]
Scikit-learnの二値分類の混同行列では、通常、行が実際のクラス、列が予測クラスを表します。
| 予測:Negative | 予測:Positive | |
|---|---|---|
| 実際:Negative | 3(TN) | 1(FP) |
| 実際:Positive | 1(FN) | 3(TP) |
混同行列から計算できる評価指標
混同行列をもとに、正解率、適合率、再現率、F1スコアなどの評価指標を計算できます。
| 指標 | 意味 |
|---|---|
| 正解率(Accuracy) | 全体のうち、正しく分類できた割合 |
| 適合率(Precision) | Positiveと予測したもののうち、実際にPositiveだった割合 |
| 再現率(Recall) | 実際にPositiveのもののうち、正しくPositiveと予測できた割合 |
| F1スコア | 適合率と再現率のバランスを表す指標 |
主な評価指標の計算式
正解率
正解率 = (TP + TN) / (TP + TN + FP + FN)
適合率
適合率 = TP / (TP + FP)
再現率
再現率 = TP / (TP + FN)
F1スコア
F1スコア = 2 × (適合率 × 再現率) / (適合率 + 再現率)
混同行列の応用例
- 医療診断: 病気の見逃しを減らすためにFNを確認する
- スパム判定: 通常メールをスパムと誤判定していないかFPを確認する
- 不正検知: 不正取引を見逃していないかFNを確認する
- 画像分類: どのクラス同士を間違えやすいか確認する
評価指標の使い分け
| 重視したいこと | 見るべき指標 |
|---|---|
| 全体的な正しさ | 正解率 |
| 誤検出を減らしたい | 適合率 |
| 見逃しを減らしたい | 再現率 |
| 適合率と再現率のバランス | F1スコア |