基本的な定義
以下の用語は、分類問題における予測結果の評価に用いられます:
- 真正陽性(TP):実際には正例であり、かつモデルが正例と予測した場合
- 偽陽性(FP):実際には負例だが、モデルが正例と予測した場合
- 偽陰性(FN):実際には正例だが、モデルが負例と予測した場合
- 真正陰性(TN):実際にも負例であり、モデルも負例と予測した場合
真正陽性率(TPR)(再現率)は、全正例の中で正しく予測された割合を示します:
$$ TPR = \frac{TP}{TP + FN} $$
偽陽性率(FPR)は、全負例の中で誤って正例と予測された割合です:
$$ FPR = \frac{FP}{FP + TN} $$
ROC曲線の理解
ROC曲線(受信者操作特性曲線)は、FPRを横軸、TPRを縦軸とするグラフです。この曲線は、分類器の性能を視覚的に評価するのに役立ちます。
対角線(0,0)から(1,1)への線は、ランダムな分類器の性能を示します。この線より上側にある点は、より良い分類器を意味し、下側にある点は劣化した分類器を示します。
理想的な分類器は左上の点(0,1)に位置し、これはすべての正例を正しく識別し、負例を誤って正例としないことを意味します。
AUROC(AUC)とは
AUROC(Area Under the ROC Curve)は、ROC曲線の下の面積を指します。値は0〜1の範囲を取り、1に近いほど分類器の性能が高いことを示します。
AUROCの解釈:
- AUROC = 1:完全な分類器。すべてのサンプルを正確に分類できる。
- 0.5 < AUROC < 1:ランダムより優れた性能。適切な閾値設定により有用な予測が可能。
- AUROC = 0.5:ランダム分類器と同等。予測力なし。
- AUROC < 0.5:ランダムより悪いが、予測を逆転させれば改善可能。
具体例と実装
4.1 フォーミュラによる計算
与えられたラベルと予測確率を以下のようにします:
labels = [1, 0, 0, 0, 1, 0, 1, 0]
probs = [0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7]閾値0.5で分類すると、以下のような混同行列が得られます:
TP = 3, FP = 2, FN = 1, TN = 2ROC曲線は、閾値を変化させながら各々のTPRとFPRをプロットして作成されます。最終的に得られる曲線の下の面積がAUROCです。
4.2 Pythonによる実装
方法1:独自関数による計算
def compute_auc(labels, probabilities):
pos_indices = [i for i in range(len(labels)) if labels[i] == 1]
neg_indices = [i for i in range(len(labels)) if labels[i] == 0]
auc_score = 0.0
total_pairs = len(pos_indices) * len(neg_indices)
for i in pos_indices:
for j in neg_indices:
if probabilities[i] > probabilities[j]:
auc_score += 1
elif probabilities[i] == probabilities[j]:
auc_score += 0.5
return auc_score / total_pairs
# 使用例
labels = [1, 0, 0, 0, 1, 0, 1, 0]
probs = [0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7]
result = compute_auc(labels, probs)
print(result)出力結果:0.5666666666666667
方法2:scikit-learnライブラリの使用
from sklearn.metrics import roc_curve, auc
labels = [1, 0, 0, 0, 1, 0, 1, 0]
probs = [0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7]
fpr, tpr, _ = roc_curve(labels, probs, pos_label=1)
auc_value = auc(fpr, tpr)
print(auc_value)出力結果:0.5666666666666667