分類モデルの評価-ROC曲線とAUC


ROC(Receiver Operating Characteristic)曲線とは

ROC曲線は、縦軸に真陽性率(tpr: true positive rate)、横軸に偽陽性率(fpr: false positive rate)の値をプロットした曲線です。
真陽性率は、実際の正例のうちどれだけ正例を予測できたかの割合です。(=再現率)
偽陽性率は、実際の負例のうち正例と予測されてしまった割合です。

予測確率を予測ラベルに変換する際の閾値を1.0と0.0の間で徐々に変化させ、真陽性率と偽陽性率の関係をプロットします。

閾値(Threshold)とは

ロジスティック回帰は予測確率を出力します。予測確率を予測ラベルに変換する際に使用する値が閾値です。
例えばスパムメールの分類で、閾値を0.5と設定した場合、
予測確率が0.5より大きい場合スパムであると判定します。
予測確率が0.5未満の場合本物メールであると判定します。

ロジスティック回帰

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.4, random_state=42)

logreg = LogisticRegression()
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)

print(y_pred)

出力:

[0 0 0 0 0 0 0 1 0 1]

ロジスティック回帰の閾値はデフォルト0.5です。

また、予測確率は以下のように計算できます。

y_pred_prob = logreg.predict_proba(X_test)[:,1]
print(y_pred_prob)

出力:

[0.39590165 0.23957606 0.20329823 0.22763991 0.42805118 0.48236847
 0.06612875 0.64996227 0.49846704 0.63918863]

ROC曲線のプロット

from sklearn.metrics import roc_curve

# 予測確率の計算
y_pred_prob = logreg.predict_proba(X_test)[:,1]
print(y_pred_prob)

# ROC曲線の値の生成:fpr、tpr、閾値
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)

# ROC曲線のプロット
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr, label='Logistic Regression')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()

AUC(Area Under the Curve)とは

AUCは、ROC曲線の下部分の面積です。
AUCの面積が大きいほど機械学習の性能が良いです。

AUCの計算

from sklearn.metrics import roc_auc_score
from sklearn.model_selection import cross_val_score

y_pred_prob = logreg.predict_proba(X_test)[:,1]

# AUCの計算
print("AUC: {}".format(roc_auc_score(y_test, y_pred_prob)))

# AUCの計算(交差検証)
cv_auc = cross_val_score(logreg, X, y, cv=5, scoring='roc_auc')
print("5回の交差検証で計算されたAUC: {}".format(cv_auc))

出力:

AUC: 0.8254806777079764
5回の交差検証で計算されたAUC: [0.80148148 0.8062963  0.81481481 0.86245283 0.8554717 ]

参考情報