[機械学習のはじめ方] Part19: 混同行列と分類レポート

機械学習

はじめに:モデルの成績表を見てみよう👀

機械学習モデルを作ったら、そのモデルがどれだけ「良い」のかを客観的に評価する必要があります。特に、データを特定のカテゴリに分類する「分類問題」では、単に正解率(Accuracy)を見るだけでは不十分な場合があります。

そこで登場するのが「混同行列(Confusion Matrix)」と「分類レポート(Classification Report)」です!これらは、モデルが「どのように間違えたのか」「どのクラスの分類が得意/苦手なのか」を詳しく分析するための強力なツールです。💪

このステップでは、これらの評価指標を理解し、モデルの性能を正しく評価する方法を学びましょう。

混同行列(Confusion Matrix)とは?🤔

混同行列は、分類モデルの予測結果と実際の正解ラベルを比較し、どのクラスがどのクラスに間違って分類されたかを行列形式でまとめたものです。これにより、モデルの予測の傾向を詳細に把握できます。

特に二値分類(例:スパムメールか否か、陽性か陰性か)の場合、混同行列は以下の4つの要素で構成されます。

  • 真陽性(True Positive, TP): 実際に「陽性」であり、モデルも「陽性」と正しく予測した数。🎯
  • 真陰性(True Negative, TN): 実際に「陰性」であり、モデルも「陰性」と正しく予測した数。✅
  • 偽陽性(False Positive, FP): 実際は「陰性」なのに、モデルが「陽性」と間違って予測した数。(Type I Error)🚨
  • 偽陰性(False Negative, FN): 実際は「陽性」なのに、モデルが「陰性」と間違って予測した数。(Type II Error)😥

これらの要素を表にまとめると以下のようになります。

予測結果
陽性 (Positive)陰性 (Negative)
実際の値陽性 (Positive)TP (真陽性)FN (偽陰性)
陰性 (Negative)FP (偽陽性)

多クラス分類の場合でも同様に、行に実際のクラス、列に予測クラスを配置して作成されます。

Python (scikit-learn) での計算例

Pythonのライブラリscikit-learnを使うと簡単に混同行列を作成できます。


from sklearn.metrics import confusion_matrix

# 実際のラベル (0: 陰性, 1: 陽性)
y_true = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]
# モデルの予測結果
y_pred = [1, 0, 0, 1, 0, 1, 1, 0, 1, 0]

# 混同行列を計算
cm = confusion_matrix(y_true, y_pred)

print("混同行列:")
print(cm)
# 出力例:
# 混同行列:
# [[4 1]  <-- TN=4, FP=1 (実際のクラス 0)
#  [1 4]]  <-- FN=1, TP=4 (実際のクラス 1)
    

この例では、TN=4, FP=1, FN=1, TP=4 となります。

分類レポート(Classification Report)とは?📝

分類レポートは、混同行列の要素を使って計算される主要な評価指標をクラスごとにまとめたレポートです。モデルの性能を多角的に評価するのに役立ちます。

主な指標は以下の通りです。

  • 適合率(Precision): モデルが「陽性」と予測したものの中で、実際に「陽性」であったものの割合。
    計算式: Precision = TP / (TP + FP)
    💡 意味: 陽性と予測したもののうち、どれだけが本当に陽性だったか。誤報(FP)を減らしたい場合に重要(例:迷惑メールフィルタ)。
  • 再現率(Recall) / 感度(Sensitivity): 実際に「陽性」であるものの中で、モデルが「陽性」と正しく予測できたものの割合。
    計算式: Recall = TP / (TP + FN)
    💡 意味: 本当に陽性のものを見逃さずにどれだけ検出できたか。見逃し(FN)を減らしたい場合に重要(例:病気の診断)。
  • F1スコア(F1-Score): 適合率と再現率の調和平均。両者のバランスを取った指標。
    計算式: F1 = 2 * (Precision * Recall) / (Precision + Recall)
    💡 意味: 適合率と再現率がトレードオフの関係にある場合に、総合的な性能を見るのに役立つ。
  • サポート(Support): 各クラスの実際のサンプル数。指標の信頼性を判断するのに役立つ(サンプル数が少ないクラスの指標は不安定になりやすい)。

分類レポートには、これらの指標に加えて以下の平均値も表示されることが多いです。

  • Accuracy (正解率): 全ての予測のうち、正しく予測できた割合。
    計算式: Accuracy = (TP + TN) / (TP + TN + FP + FN)
  • Macro Avg (マクロ平均): 各クラスの指標値を単純に平均したもの。クラス間のサンプル数の偏りを考慮しない。
  • Weighted Avg (重み付き平均): 各クラスの指標値を、そのクラスのサポート(サンプル数)で重み付けして平均したもの。クラス間のサンプル数の偏りを考慮する。

Python (scikit-learn) での表示例

scikit-learnclassification_report関数を使います。


from sklearn.metrics import classification_report

# 上記と同じ y_true, y_pred を使用
y_true = [1, 0, 1, 1, 0, 1, 0, 0, 1, 0]
y_pred = [1, 0, 0, 1, 0, 1, 1, 0, 1, 0]

# 分類レポートを生成 (target_namesでクラス名を指定可能)
report = classification_report(y_true, y_pred, target_names=['陰性 (0)', '陽性 (1)'])

print("分類レポート:")
print(report)
# 出力例:
# 分類レポート:
#               precision    recall  f1-score   support
#
#     陰性 (0)       0.80      0.80      0.80         5
#     陽性 (1)       0.80      0.80      0.80         5
#
#     accuracy                           0.80        10
#    macro avg       0.80      0.80      0.80        10
# weighted avg       0.80      0.80      0.80        10
    

混同行列と分類レポートの活用ポイント ✨

混同行列と分類レポートは、モデルの性能を深く理解するために非常に重要です。

  • 単純な正解率だけを見ない: 特にデータが不均衡な場合(例:陽性サンプルが極端に少ない)、正解率が高くても少数派クラスを全く予測できていない可能性があります。混同行列や各クラスの指標(特に再現率やF1スコア)を確認しましょう。
  • 目的に応じて重視する指標を変える:
    • 偽陽性(FP)のコストが高い場合(例:無実の人を有罪と判断する)➡️ 適合率(Precision)を重視。
    • 偽陰性(FN)のコストが高い場合(例:重病患者を見逃す)➡️ 再現率(Recall)を重視。
    • どちらもバランス良く評価したい場合 ➡️ F1スコアを重視。
  • クラスごとの性能を見る: 分類レポートで各クラスの指標を確認し、特定のクラスの予測が苦手でないか分析します。苦手なクラスがあれば、データ収集や特徴量エンジニアリング、モデル選択の見直しなどを検討します。
  • サポート数を確認する: サポート数が少ないクラスの指標は、偶然による変動が大きい可能性があります。解釈には注意が必要です。

これらの指標を理解し活用することで、モデルの弱点を発見し、改善につなげることができます。🚀

まとめ

今回は、分類モデルの評価に不可欠な「混同行列」と「分類レポート」について学びました。

  • 混同行列は、モデルがどのように正解し、どのように間違えたかを詳細に示す表です (TP, TN, FP, FN)。
  • 分類レポートは、適合率、再現率、F1スコアなどの主要な評価指標をクラスごとにまとめ、モデルの性能を多角的に示します。

これらのツールを使ってモデルの性能を正しく評価し、目的に合ったより良いモデルを目指しましょう!🎉 次のステップでは、これらの指標をさらに深く理解するための「精度・再現率・F1スコアの計算と活用」について学びます。

コメント

タイトルとURLをコピーしました