python - Scikit Learn roc_auc_score 和 ROC Plot 的正确输入
问题描述
我正在尝试确定roc_auc_score
验证集上的拟合模型。
我看到有关函数输入的一些相互矛盾的信息。
文档说:
“y_score 数组,形状为 (n_samples,) 或 (n_samples, n_classes) 目标分数。在二进制和多标签情况下,这些可以是概率估计或非阈值决策值(由某些分类器上的决策函数返回)。在多类情况,这些必须是总和为 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 的概率。也就是说,它将返回一个充满零和一之间数字的数组,包括零和一。
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])
推荐阅读
- arrays - C,GCC 警告:从不兼容的指针类型初始化
- kubernetes - Helm 3 通过删除命名空间来删除部署
- docker - Docker 中用户的概念是什么,权限如何在卷中起作用?
- google-calendar-api - 谷歌日历 API SLA
- bootstrap-4 - 如何在桌面上制作 3 列,在平板电脑上制作 2 列,不同的父母,但在平板电脑上时,1 个孩子去另一个父母
- php - php 正在下载而不是被加载
- iis - IIS ARR 负载均衡器总是命中顶级 URL 重写规则
- kubernetes - 掌舵图:字符串连接
- javascript - 为什么 RxJS subscribe 允许省略箭头函数和下面的方法参数?
- mysql - SQL将多个字段条件绑定为AND子句