我想评估一下我的机器学习模型。用roc_auc_score()
计算ROC曲线下面积,用sklearn的plot_roc_curve()
函数绘制ROC曲线。在第二个函数中,还计算了AUC,并在图中显示。现在我的问题是,我得到了两个AUC不同的结果。
以下是示例数据集的可重现代码:
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import plot_roc_curve
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import MinMaxScaler
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
model = MLPClassifier(random_state=42)
model.fit(X_train, y_train)
yPred = model.predict(X_test)
print(roc_auc_score(y_test, yPred))
plot_roc_curve(model, X_test, y_test)
plt.show()
roc_auc_score
函数显示为0.979,曲线图显示为1.00。尽管第二个函数将模型作为参数并再次预测yPred,但结果应该没有什么不同。这不是舍入错误。如果我减少训练迭代以获得一个不好的预测器,则值仍然不同。
使用我的真实数据集,我在两种方法之间“实现”了0.1的差异。这种反常现象是如何产生的?
发布于 2020-12-11 23:33:27
您应该将预测概率传递给roc_auc_score
,而不是预测的类。如下所示:
yPred_p = model.predict_proba(X_test)[:,1]
print(roc_auc_score(y_test, yPred_p))
# output: 0.9983354140657512
当您通过预测类时,这实际上是计算AUC的曲线(这是错误的):
重新生成的代码:
from sklearn.metrics import roc_curve, auc
fpr, tpr, _ = roc_curve(y_test, yPred)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, label='AUC = ' + str(round(roc_auc, 2)))
plt.legend(loc='lower right')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
https://stackoverflow.com/questions/65249043
复制相似问题