python 中未匹配的 ROC 和 AUC 计算

Miss-matching ROC and AUC calculations in python

我目前正在使用 python 来训练随机森林模型。我最初尝试按如下方式计算 ROC 曲线表示:

import scikitplot as skplt
from sklearn.metrics import RocCurveDisplay
import sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics

model2_bert = RandomForestClassifier(bootstrap=False, max_depth=None, max_features='auto', min_samples_leaf=5, min_samples_split=5, n_estimators=50)
rf1 = model2_bert.fit(X_train, y_train)    
y_hat = rf1.predict(X_test)
ax = plt.gca()
rfc_disp = RocCurveDisplay.from_estimator(rf1, X_test, y_test, ax=ax)
plt.show()

这给了我数字:

由于某些规格的 AUC=1,我决定尝试用其他方式计算它。

fpr, tpr, thresholds = metrics.roc_curve(y_test, y_hat)
roc_auc = metrics.auc(fpr, tpr)
roc_auc
# method I: plt
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % roc_auc)
plt.legend(loc='lower right')
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()

第三种方法:

y_prob = rf.predict_proba(X_test)
rf1 = model2_bert.fit(X_train, y_train)

    skplt.metrics.plot_roc_curve(y_test, y_prob)
    metrics.plot_roc_curve(rf1, X_test, y_test)
    plt.show()

最后两个好像是重合的,都是基于计算出的AUC。那么第一张图有什么问题吗?

PS:这是混淆矩阵,所以 AUC=0.97 对我来说似乎很高。对于某些规格,我什至在第一个图中得到了 AUC=1...

我认为问题在于 y_hat = rf1.predict(X_test) 正在返回二进制分类输出(0 和 1)。对于 ROC AUC,您需要一个概率或分数。 相反,您应该使用 predict_proba:

y_prob = rf1.predict_proba(X_test)
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_prob )
.... 
<rest of your code>