[機械学習のはじめ方] Part20: 精度・再現率・F1スコアの計算と活用

機械学習

モデルがどれだけ「的確」で「網羅的」かを測る指標を学びます。

こんにちは!機械学習の学習、順調に進んでいますか?😊 前回の「混同行列と分類レポート」では、分類モデルの予測結果を整理し、基本的な評価の土台となる考え方を学びましたね。

今回は、混同行列から計算される重要な評価指標である精度 (Precision)再現率 (Recall)、そしてF1スコア (F1 Score) について詳しく見ていきます。これらの指標は、モデルの性能をより深く理解し、目的に合わせて改善していく上で不可欠です。しっかりマスターしましょう!💪

1. 精度 (Precision) とは? 🤔

精度 (Precision) は、モデルが「陽性 (Positive)」と予測したサンプルのうち、実際に陽性であったサンプルの割合を示す指標です。言い換えると、「モデルの陽性予測がどれだけ信頼できるか」を表します。

計算式は以下の通りです。

精度 (Precision) = TP / (TP + FP)
  • TP (True Positive): 実際に陽性で、予測も陽性
  • FP (False Positive): 実際は陰性なのに、予測は陽性 (Type I Error)

精度が高ければ高いほど、モデルが陽性と予測した結果は信頼性が高いと言えます。

精度が特に重要視されるのは、偽陽性 (False Positive) のコストが高い場合です。つまり、「本当は違うのに、陽性と間違って予測してしまう」ことによる損失が大きいケースです。

  • スパムメールフィルタ: 重要なメールをスパムと誤判定(FP)してしまうと、ユーザーは大切な情報を見逃す可能性があります。そのため、スパムと判定したメールは、本当にスパムである確率が高い(精度が高い)ことが求められます。
  • 製品の推薦システム: ユーザーが全く興味のない製品を推薦(FP)してしまうと、ユーザー体験を損ないます。推薦するものは、ユーザーが興味を持つ可能性が高い(精度が高い)方が望ましいです。

Pythonのライブラリ scikit-learn を使うと簡単に計算できます。


from sklearn.metrics import precision_score

# y_true: 実際の正解ラベルのリスト or 配列
# y_pred: モデルの予測ラベルのリスト or 配列

# 例 (実際の値はデータとモデルによります)
y_true = [0, 1, 0, 1, 1, 0, 0, 1]
y_pred = [0, 1, 1, 1, 0, 1, 0, 1] # FPが2つ, TPが3つ

# 陽性クラス (通常は 1) の精度を計算
precision = precision_score(y_true, y_pred, pos_label=1) # pos_labelで陽性クラスを指定

print(f"Precision: {precision:.4f}")
# 出力例: Precision: 0.6000  (TP=3, FP=2 なので 3 / (3 + 2) = 0.6)
        

2. 再現率 (Recall / Sensitivity) とは? 🧐

再現率 (Recall) は、実際に陽性であるサンプルのうち、モデルが正しく陽性と予測できたサンプルの割合を示す指標です。「感度 (Sensitivity)」や「真陽性率 (True Positive Rate, TPR)」とも呼ばれます。見逃しがないか、網羅的に陽性サンプルを検出できているかを表します。

計算式は以下の通りです。

再現率 (Recall) = TP / (TP + FN)
  • TP (True Positive): 実際に陽性で、予測も陽性
  • FN (False Negative): 実際は陽性なのに、予測は陰性 (Type II Error)

再現率が高ければ高いほど、モデルは実際の陽性サンプルを見逃しにくいと言えます。

再現率が特に重要視されるのは、偽陰性 (False Negative) のコストが高い場合です。つまり、「本当は陽性なのに、陰性と見逃してしまう」ことによる損失が大きいケースです。

  • 病気の診断システム: 癌などの深刻な病気を見逃してしまう(FN)と、患者の命に関わる可能性があります。そのため、実際の患者をできるだけ多く陽性と判定する(再現率が高い)ことが求められます。多少、健康な人を誤って陽性と判定(FP)してしまっても、再検査などで対応できる場合が多いです。
  • 不正検知システム: 不正な取引を見逃してしまう(FN)と、企業や顧客に金銭的な損害が発生します。不正の可能性のある取引をできるだけ網羅的に検出する(再現率が高い)ことが重要になります。

再現率も scikit-learn で簡単に計算できます。


from sklearn.metrics import recall_score

# y_true: 実際の正解ラベルのリスト or 配列
# y_pred: モデルの予測ラベルのリスト or 配列

# 例 (実際の値はデータとモデルによります)
y_true = [0, 1, 0, 1, 1, 0, 0, 1] # 陽性は4つ
y_pred = [0, 1, 1, 1, 0, 1, 0, 1] # FNが1つ, TPが3つ

# 陽性クラス (通常は 1) の再現率を計算
recall = recall_score(y_true, y_pred, pos_label=1) # pos_labelで陽性クラスを指定

print(f"Recall: {recall:.4f}")
# 出力例: Recall: 0.7500  (TP=3, FN=1 なので 3 / (3 + 1) = 0.75)
        

💡 精度のトレードオフ: 一般的に、精度と再現率の間にはトレードオフの関係があります。つまり、一方を高めようとすると、もう一方が低くなる傾向があります。

例えば、病気の診断で「少しでも怪しければ陽性」という基準にすると、再現率は上がります(見逃しが減る)が、健康な人を誤って陽性と判定するFPが増え、精度は下がります。逆に、「確実な証拠がない限り陰性」という基準にすると、精度は上がりますが、見逃し(FN)が増えて再現率は下がります。このバランスをどう取るかが重要になります。

3. F1スコア (F1 Score) とは?⚖️

F1スコア (F1 Score) は、精度 (Precision) と再現率 (Recall) の調和平均を取った指標です。精度と再現率のバランスを考慮した総合的な評価を行いたい場合に用いられます。

計算式は以下の通りです。

F1スコア = 2 * (Precision * Recall) / (Precision + Recall)

F1スコアは 0 から 1 の値をとり、1 に近いほど良いモデルとされます。調和平均を用いているため、精度と再現率の両方がバランス良く高い場合に F1スコアも高くなります。どちらか一方だけが極端に低いと、F1スコアも低くなる傾向があります。

F1スコアは、以下のような場合に特に有用です。

  • 精度と再現率の両方をバランス良く評価したい場合: どちらか一方だけを重視するのではなく、総合的な性能を見たいときに使います。
  • クラス間のデータ不均衡がある場合: 例えば、陽性クラスのデータが極端に少ない場合、単純な正解率 (Accuracy) ではモデルの性能を正しく評価できないことがあります。F1スコアは、少数派クラスに対する性能をより適切に反映することがあります。
  • どの指標を重視すべきか明確でない場合や、トレードオフのバランス点を見つけたい場合: まず F1スコアを見て、全体的な性能を確認するのに役立ちます。

F1スコアも scikit-learn で計算できます。


from sklearn.metrics import f1_score

# y_true: 実際の正解ラベルのリスト or 配列
# y_pred: モデルの予測ラベルのリスト or 配列

# 例 (前の例と同じ値を使用)
y_true = [0, 1, 0, 1, 1, 0, 0, 1]
y_pred = [0, 1, 1, 1, 0, 1, 0, 1]

# Precision = 0.6, Recall = 0.75

# 陽性クラス (通常は 1) のF1スコアを計算
f1 = f1_score(y_true, y_pred, pos_label=1) # pos_labelで陽性クラスを指定

print(f"F1 Score: {f1:.4f}")
# 出力例: F1 Score: 0.6667 (2 * (0.6 * 0.75) / (0.6 + 0.75) = 0.9 / 1.35 = 0.666...)
        

4. 指標の使い分けと注意点 🧭

これまで見てきたように、精度、再現率、F1スコアはそれぞれ異なる側面からモデルの性能を評価します。どの指標を最も重視すべきかは、解決したいビジネス上の課題や、モデルの誤分類によって生じるコストによって異なります。

指標計算式意味重視するケースの例
精度 (Precision)TP / (TP + FP)陽性予測の信頼性スパムフィルタ (FPのコストが高い)
再現率 (Recall)TP / (TP + FN)陽性サンプルの網羅性 (見逃しの少なさ)病気の診断 (FNのコストが高い)
F1スコア2 * (Prec * Rec) / (Prec + Rec)精度と再現率のバランス両方のバランスを取りたい、クラス不均衡がある場合

これまでは主に二値分類(陽性/陰性)を前提に説明してきましたが、3つ以上のクラスに分類する多クラス分類の場合、これらの指標の計算方法にはいくつかバリエーションがあります。

  • Macro Average: 各クラスごとに指標を計算し、その単純平均を取ります。クラス間のサンプル数の違いは考慮されません。すべてのクラスを平等に扱いたい場合に用います。
  • Micro Average: 全てのクラスのTP, FP, FNを合計してから、全体の指標を計算します。サンプル数の多いクラスの影響が大きくなります。
  • Weighted Average: 各クラスごとに指標を計算し、各クラスのサンプル数で重み付けした平均を取ります。クラス間の不均衡を考慮したい場合に用います。

scikit-learnprecision_score, recall_score, f1_score 関数では、average引数でこれらの計算方法を指定できます(例: average='macro', average='micro', average='weighted')。

前回の記事でも紹介しましたが、scikit-learnclassification_report 関数を使うと、各クラスごとの精度、再現率、F1スコア、そしてそれらの平均(macro avg, weighted avg)などをまとめて表示してくれるため、非常に便利です。ぜひ活用しましょう!


from sklearn.metrics import classification_report

# y_true, y_pred は準備済みとする

print(classification_report(y_true, y_pred))

# 出力例 (二値分類の場合)
#               precision    recall  f1-score   support
#
#            0       0.67      0.50      0.57         4  # クラス0の指標
#            1       0.60      0.75      0.67         4  # クラス1の指標
#
#     accuracy                           0.62         8  # 全体の正解率
#    macro avg       0.63      0.62      0.62         8  # マクロ平均
# weighted avg       0.63      0.62      0.62         8  # 重み付き平均
        

5. まとめ 🎉

今回は、分類モデルの評価に欠かせない以下の3つの指標について学びました。

  • 精度 (Precision): 陽性予測の信頼性。FPを避けたい場合に重要。
  • 再現率 (Recall): 陽性サンプルの網羅性。FNを避けたい場合に重要。
  • F1スコア: 精度と再現率の調和平均。両者のバランスを見たい場合に重要。

これらの指標の意味を理解し、解きたい課題に応じて適切に使い分けることが、より良い機械学習モデルを構築するための鍵となります🔑。混同行列と合わせて、モデルの特性を多角的に評価する習慣をつけましょう。

次回は、分類モデルの閾値を変えたときの性能変化を視覚的に評価する「ROC曲線とAUC」について学びます。お楽しみに!🚀

コメント

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