python - Scikit Learn roc_auc_score 和 ROC Plot 的正确输入

标签 python scikit-learn roc auc

我正在尝试确定 roc_auc_score用于验证集上的拟合模型。
我看到有关函数输入的一些相互矛盾的信息。
Documentation说:
"y_score 类似数组的形状 (n_samples,) 或 (n_samples, n_classes)
目标分数。在二元和多标签情况下,这些可以是概率估计或非阈值决策值(由某些分类器上的 decision_function 返回)。在多类情况下,这些必须是总和为 1 的概率估计。二元情况需要一个形状 (n_samples,),并且分数必须是具有更大标签的类的分数。多类和多标签情况需要一个形状 (n_samples, n_classes)。在多类情况下,类分数的顺序必须对应于标签的顺序(如果提供),或者对应于 y_true 中标签的数字或字典顺序。”
不确定这到底需要什么:1)针对测试集中实际 y 值的预测概率或 2)针对测试集中实际 y 值的类别预测
我一直在搜索,在二元分类的情况下(我的兴趣),有些人使用预测概率,而其他人使用实际预测(0 或 1)。换句话说:
适合型号:

model.fit(X_train, y_train)
使用:
y_preds = model.predict(X_test)
或者:
y_probas = model.predict_proba(X_test)
我发现:
roc_auc_score(y_test, y_preds)
和:
roc_auc_score(y_test, y_probas[:,1]) # probabilites for the 1 class
产生非常不同的结果。
哪一个是正确的?
我还发现要实际绘制 ROC 曲线,我需要使用概率。
任何指导表示赞赏。

最佳答案

model.predict(...)将为您提供每个观察的预测标签。也就是说,它将返回一个充满 1 和 0 的数组。model.predict_proba(...)[:, 1]会给你每个观察值等于 1 的概率。也就是说,它将返回一个包含 0 和 1 之间的数字的数组,包括 0 和 1。
ROC 曲线是通过取每个可能的 来计算的。概率 ,使用它作为阈值并计算结果的真阳性率和假阳性率。因此,如果您通过 model.predict(...)metrics.roc_auc_score() ,您正在计算仅使用两个阈值(一或零)的 ROC 曲线的 AUC。 这是不正确的 ,因为这些不是模型的预测概率。
要获得模型的 AUC,您需要将预测概率传递给 roc_auc_score(...) :

from sklearn.metrics import roc_auc_score
roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])

关于python - Scikit Learn roc_auc_score 和 ROC Plot 的正确输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65398299/

相关文章:

python - 与 Pandas 的参差不齐的转置

python - labelEncoder在sklearn中的工作

python - sklearn StackingClassifier 和样本权重

machine-learning - ROC 曲线教程

r - 为 R 中的逻辑回归模型绘制多条 ROC 曲线

python - 使用 turtle 图形的强化学习算法不起作用

python - 哪个正则表达式更有效?

python - Pickle Tfidfvectorizer 以及自定义分词器

r - 在不同层使用 ggplot2 绘制多条 ROC 曲线

python - 将 django ORM 与多处理一起使用?