はじめに
分類モデルの性能を評価する際に、「精度(Accuracy)」だけを見て満足していませんか?
実は分類問題では、「どのクラスをどれだけ正しく予測できているか」を詳しく確認する必要があり、そのための指標が「混同行列」や「精度・再現率・F1スコア」です。
本記事では、それぞれの指標の意味と使いどころ、そしてscikit-learnによる実装例をわかりやすく解説します。
混同行列(Confusion Matrix)とは?
概要
混同行列とは、分類モデルの予測結果と実際の正解をマトリクス(表)形式で示したものです。
2値分類の例:
| 予測:陽性(1) | 予測:陰性(0) | |
|---|---|---|
| 実際:陽性(1) | TP(真陽性) | FN(偽陰性) |
| 実際:陰性(0) | FP(偽陽性) | TN(真陰性) |
この4つの値をもとに、以下のような指標を計算します。
評価指標の定義と意味
精度(Accuracy)

- 全体のうち正しく分類された割合
- データが偏っているときに過大評価されやすい
適合率(Precision)

- 「陽性」と予測したうち、どれだけ正しかったか
- FPを減らすことに関心がある場面(例:スパム検出)
再現率(Recall)

- 実際に陽性だったものをどれだけ取りこぼさず検出できたか
- FNを減らすことに関心がある場面(例:がん検出)
F1スコア

- Precision と Recall のバランスをとる指標
- どちらも重要な場合に最適
実装:分類結果を評価してみよう
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, classification_report
# データセットとモデル準備
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)
# 予測と評価
y_pred = model.predict(X_test)
print("混同行列:\n", confusion_matrix(y_test, y_pred))
print("分類レポート:\n", classification_report(y_test, y_pred))多クラス分類の場合は?
- 混同行列はクラスごとに正解/誤りの関係を整理
- precision/recall/F1 は「micro平均」「macro平均」「weighted平均」などでまとめられる
🔸用語の前提
- 多クラス分類:例)犬・猫・ウサギを分類するタスク(3クラス)
- 各クラスごとにPrecision, Recall, F1が出せる
- それらを全体として1つの評価指標にまとめる方法が、今回の3つです。
✅ micro平均(マイクロ平均)
🔹特徴
- 全クラスの「個々の予測」を合算して計算。
- 各クラスを区別せずに1つの混同行列としてまとめて評価するイメージ。
🔹イメージ
各クラスのTP(True Positive)、FP、FNを全部足し合わせてから、PrecisionやRecallを計算。
micro_Precision = 全クラスのTPの合計 / 全クラスの( TP + FP )の合計
micro_Recall = 全クラスのTPの合計 / 全クラスの( TP + FN )の合計🔹向いているケース
- 不均衡データで、全体の正確さを重視したいとき。
- 「全体でどれくらい正しく当てたか?」を重視。
✅ macro平均(マクロ平均)
🔹特徴
- 各クラスの指標を個別に計算して平均をとる。
- クラスごとのバランスを見るのに適している。
🔹イメージ
macro_Precision = (P_クラス1 + P_クラス2 + P_クラス3) / 3
macro_Recall = (R_クラス1 + R_クラス2 + R_クラス3) / 3🔹向いているケース
- クラス数が少ない or クラスの重要度が等しい場合に◎
- 少数派クラスも等しく重視したいとき。
✅ weighted平均(加重平均)
🔹特徴
- 各クラスの指標に「そのクラスのサンプル数」で重みをかけて平均する。
🔹イメージ
weighted_Precision = Σ(P_i × サンプル数_i) / 全サンプル数🔹向いているケース
- クラスに偏りがある(例:猫が9割)ときでも、全体を代表するようなスコアが欲しいとき。
- macro平均の弱点(少数クラスの影響が大きすぎる)を補いたいとき。
🎯まとめ表
| 指標 | 計算方法 | 特徴 | 向いているケース |
|---|---|---|---|
| micro平均 | 全クラスのTP,FP,FNを合算 | 全体の正解率を反映 | 全体の性能評価をしたいとき |
| macro平均 | 各クラスの指標を平均 | 各クラスを同等に扱う | 少数クラスも重要なとき |
| weighted平均 | 各クラスにサンプル数の重みを加える | クラス数に応じた現実的な平均 | クラス不均衡を反映しつつ平均したいとき |
どの指標を使えばよいか?
| タスク例 | 重視する指標 |
| スパムフィルタ | Precision(誤検出を防ぎたい) |
| 医療診断 | Recall(見逃しを減らしたい) |
| バランス型の分類 | F1スコア(PrecisionとRecallのバランス) |
おわりに
分類モデルの評価は「正しく分類できたか?」だけではなく、「どのように間違えたか?」が非常に重要です。
混同行列と主要指標(Precision・Recall・F1)を理解し、課題に応じた適切な指標を選ぶことで、より信頼性の高いモデル設計が可能になります。
次回は、SVM・決定木・ランダムフォレストなどのモデルを比較し、精度と解釈性のトレードオフについて解説します。
練習問題
Q1. 再現率が高いとはどういうこと?
- A. 誤検出が少ない
- B. 見逃しが少ない
- C. 全体精度が高い
Q2. F1スコアは何のバランスをとる指標?
- A. AccuracyとRecall
- B. PrecisionとRecall
- C. FPとFN
Q3. 精度(Accuracy)の過信が危険な状況は?
- A. データが均等に分布しているとき
- B. クラスに偏りがあるとき
- C. 多クラス分類のとき
🔗 機械学習シリーズ 関連リンク
▶ 入門〜分類編
- 【入門】scikit-learnとは?機械学習の全体像と学習の流れ
- 【準備】sklearnのインストールとデータセットの扱い方
- 【分類①】K近傍法(KNN)を使ってシンプルな分類をしてみよう
- 【分類②】ロジスティック回帰でスパム判定をしてみよう
- 【分類③】決定木・ランダムフォレストの特徴と可視化方法
- 【分類④】混同行列・精度・再現率・F1スコアの正しい使い方
- 【モデル比較】SVM・決定木・ランダムフォレストの精度と解釈性の違い

コメント