ロジスティック回帰における評価指標:ROC曲線とAUCの詳細解説

基本的な定義

以下の用語は、分類問題における予測結果の評価に用いられます:

  • 真正陽性(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 = 2

ROC曲線は、閾値を変化させながら各々の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

タグ: ROC曲線 AUC 機械学習 分類器 評価指標

5月17日 19:27 投稿