Balanced Accuracy

入門

4.3.6

Balanced Accuracy

最終更新 2020-04-08 読了時間 2 分
まとめ
  • Balanced Accuracy は各クラスの再現率を平均して偏りを補正する指標です。
  • 乳がん診断データで Accuracy との差を描画し、少数クラスの影響を確認します。
  • 不均衡データで KPI として用いる際の注意点を整理します。
  • 混同行列 の概念を先に学ぶと理解がスムーズです

1. 定義 #

陽性クラスの再現率(TPR)と陰性クラスの再現率(TNR)を平均したものが Balanced Accuracy です。混同行列の記号を使うと次式になります。

$$ \mathrm{Balanced\ Accuracy} = \frac{1}{2}\left(\frac{TP}{TP + FN} + \frac{TN}{TN + FP}\right) $$

多クラス分類の場合も、各クラスの再現率を平均すれば同様の考え方で拡張できます。


2. Python 3.13 での実装 #

1
2
python --version        # 例: Python 3.13.0
pip install scikit-learn matplotlib

以下のコードは Accuracy との比較に使ったものと同じで、ランダムフォレストを学習させたあと alanced_accuracy_score と ccuracy_score を並べています。図は Accuracy の記事でも使っている static/images/eval/classification/accuracy/accuracy_vs_balanced.png を共有します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, balanced_accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
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.25, random_state=42, stratify=y
)
pipeline = make_pipeline(
    StandardScaler(),
    RandomForestClassifier(random_state=42, n_estimators=300),
)
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
acc = accuracy_score(y_test, y_pred)
bal_acc = balanced_accuracy_score(y_test, y_pred)
print(f"Accuracy: {acc:.3f}, Balanced Accuracy: {bal_acc:.3f}")
Accuracy と Balanced Accuracy の比較

Balanced Accuracy はクラスごとの再現率を平均するため、不均衡データでも過大評価を避けられる。


3. いつ Balanced Accuracy を使うか #

  • クラス不均衡が大きいとき … Accuracy だけでは多い方のクラスを当ててしまうだけで高得点になる。Balanced Accuracy なら少数クラスの再現率も同じ重みで評価できる。
  • モデル間の比較 … 不均衡データ上で複数モデルを比較する際、Balanced Accuracy を併用すると能力差が浮き彫りになる。
  • 閾値調整の目安 … Precision / Recall と組み合わせれば、どの閾値で両クラスをバランスよく拾えているかがわかる。

4. 他指標との併用 #

指標何を測るか不均衡データでの注意点
Accuracy全体の正解割合多数派クラスだけを当てても高得点になる
Recall / Sensitivity特定クラスの検出率クラスごとに値が異なるので別々に報告が必要
Balanced Accuracyクラスごとの再現率の平均各クラスを同じ重みで評価できる
Macro F1Precision と Recall の調和平均(各クラス同等)Precision も考慮したい場合に有効

まとめ #

  • Balanced Accuracy は「クラスごとの再現率の平均」。不均衡データでモデルを評価する際の基準に適している。
  • Python 3.13 では alanced_accuracy_score 一行で計算でき、Accuracy との違いを数値で比較できる。
  • Precision / Recall / F1 など他指標と併せて、どのクラスを重視するかを明確にしながら評価を進めよう。

閾値とバランス正解率 #

閾値を変えると正解率とバランス正解率がどう異なるか比較できます。

よくある質問 #

F1スコアとBalanced Accuracyはどちらを使う? #

F1スコアは陽性クラスの精度(Precision)と再現率(Recall)のみを対象とするため、陰性クラスの性能は評価されません。Balanced Accuracyは陽性・陰性両クラスの再現率を平均するため、全クラスのバランスを見たい場合に向いています。詐欺検知など「見逃しを減らすことが最優先」の場合はF1、医療診断や多クラス分類で全クラスを公平に評価したい場合はBalanced Accuracyが適しています。

sklearnでのBalanced Accuracyの計算方法は? #

1
2
from sklearn.metrics import balanced_accuracy_score
score = balanced_accuracy_score(y_true, y_pred)

adjusted=Trueを指定すると、ランダム予測を0、完全予測を1にスケール調整したBalanced Accuracy(Informedness)が得られます。

Balanced Accuracyが0.5に近い場合は? #

二値分類でBalanced Accuracyが0.5に近い場合は、モデルがランダム予測と同程度の性能しか発揮できていないことを意味します。クラス不均衡が原因の場合は、SMOTEによるオーバーサンプリング、class_weightパラメーターの調整、または閾値チューニングを試みてください。

多クラス分類でも使える? #

はい。多クラスでは各クラスの再現率(TPR)の単純平均として計算されます。scikit-learnのbalanced_accuracy_scoreは多クラスにも対応しており、クラス数が多い場合でも同じ関数で計算できます。


  • 正解率(Accuracy) — 均衡データでの基本指標
  • 混同行列 — TP/FP/FN/TN の全体像を把握
  • MCC — 不均衡データに強い相関指標
  • SMOTE — 少数クラスのオーバーサンプリング手法
  • Focal Loss — 不均衡データ向けの損失関数