- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 scikit learn 中,您可以使用以下方法计算二元分类器的曲线下面积
roc_auc_score( Y, clf.predict_proba(X)[:,1] )
我只对误报率小于 0.1 的曲线部分感兴趣。
Given such a threshold false positive rate, how can I compute the AUC only for the part of the curve up the threshold?
这里有几个 ROC 曲线的例子,用于说明:
scikit 学习文档展示了如何使用 roc_curve
>>> import numpy as np
>>> from sklearn import metrics
>>> y = np.array([1, 1, 2, 2])
>>> scores = np.array([0.1, 0.4, 0.35, 0.8])
>>> fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
>>> fpr
array([ 0. , 0.5, 0.5, 1. ])
>>> tpr
array([ 0.5, 0.5, 1. , 1. ])
>>> thresholds
array([ 0.8 , 0.4 , 0.35, 0.1 ]
有没有一种简单的方法可以从这里转到部分 AUC?
似乎唯一的问题是如何计算 fpr = 0.1 时的 tpr 值,因为 roc_curve 不一定会给你这个值。
最佳答案
假设我们从
开始import numpy as np
from sklearn import metrics
现在我们设置真实的 y
和预测的 scores
:
y = np.array([0, 0, 1, 1])
scores = np.array([0.1, 0.4, 0.35, 0.8])
(请注意,y
已从您的问题中向下移动 1。这无关紧要:无论预测 1、2 还是 0,都会获得完全相同的结果(fpr、tpr、阈值等) , 1,但是一些 sklearn.metrics
函数如果不使用 0, 1 是一个拖累。)
让我们在这里查看 AUC:
>>> metrics.roc_auc_score(y, scores)
0.75
如您的示例所示:
fpr, tpr, thresholds = metrics.roc_curve(y, scores)
>>> fpr, tpr
(array([ 0. , 0.5, 0.5, 1. ]), array([ 0.5, 0.5, 1. , 1. ]))
这给出了以下情节:
plot([0, 0.5], [0.5, 0.5], [0.5, 0.5], [0.5, 1], [0.5, 1], [1, 1]);
通过构造,有限长度 y 的 ROC 将由矩形组成:
对于足够低的阈值,一切都会被归类为负面。
随着阈值不断增加,在离散点,一些负分类会变成正分类。
因此,对于有限的 y,ROC 将始终由从 (0, 0) 到 的一系列连接的水平和垂直线表征(1, 1)。
AUC 是这些矩形的总和。此处,如上所示,AUC 为 0.75,因为矩形的面积为 0.5 * 0.5 + 0.5 * 1 = 0.75。
在某些情况下,人们会选择通过线性插值来计算 AUC。假设 y 的长度远大于为 FPR 和 TPR 计算的实际点数。然后,在这种情况下,线性插值是可能之间的点的近似值。在某些情况下,人们还遵循这样的猜想,即如果y 足够大,中间的点将被线性插值。 sklearn.metrics
不使用这个猜想,为了得到与 sklearn.metrics
一致的结果,需要使用矩形求和,而不是梯形求和。
让我们编写自己的函数来直接从 fpr
和 tpr
计算 AUC:
import itertools
import operator
def auc_from_fpr_tpr(fpr, tpr, trapezoid=False):
inds = [i for (i, (s, e)) in enumerate(zip(fpr[: -1], fpr[1: ])) if s != e] + [len(fpr) - 1]
fpr, tpr = fpr[inds], tpr[inds]
area = 0
ft = zip(fpr, tpr)
for p0, p1 in zip(ft[: -1], ft[1: ]):
area += (p1[0] - p0[0]) * ((p1[1] + p0[1]) / 2 if trapezoid else p0[1])
return area
此函数采用 FPR 和 TPR,以及一个可选参数,说明是否使用梯形求和。运行它,我们得到:
>>> auc_from_fpr_tpr(fpr, tpr), auc_from_fpr_tpr(fpr, tpr, True)
(0.75, 0.875)
对于矩形求和,我们得到与 sklearn.metrics
相同的结果,对于梯形求和,我们得到不同的、更高的结果。
所以,现在我们只需要看看如果我们在 FPR 为 0.1 时终止,FPR/TPR 点会发生什么变化。我们可以用 bisect
module 来做到这一点
import bisect
def get_fpr_tpr_for_thresh(fpr, tpr, thresh):
p = bisect.bisect_left(fpr, thresh)
fpr = fpr.copy()
fpr[p] = thresh
return fpr[: p + 1], tpr[: p + 1]
这是如何运作的?它只是检查 fpr
中 thresh
的插入点在哪里。鉴于 FPR 的属性(它必须从 0 开始),插入点必须在水平线上。因此,这个之前的所有矩形都应该不受影响,这个之后的所有矩形都应该被删除,这个应该可能被缩短。
让我们应用它:
fpr_thresh, tpr_thresh = get_fpr_tpr_for_thresh(fpr, tpr, 0.1)
>>> fpr_thresh, tpr_thresh
(array([ 0. , 0.1]), array([ 0.5, 0.5]))
最后,我们只需要计算更新版本的 AUC:
>>> auc_from_fpr_tpr(fpr, tpr), auc_from_fpr_tpr(fpr, tpr, True)
0.050000000000000003, 0.050000000000000003)
在这种情况下,矩形和梯形求和给出相同的结果。请注意,一般情况下,他们不会。为了与 sklearn.metrics
保持一致,应使用第一个。
关于python - 如何计算部分曲线下面积 (AUC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39537443/
在 SQL 中计算 AUC 的最佳方法是什么? 这是我得到的(假设表 T(label, confid) 和 label=0,1): SELECT sum(cumneg * label) * 1e0 /
我正在训练用于图像分类的CNN。由于我的数据集有限,我正在使用转移学习。基本上,我使用的是Google在其再培训示例(https://www.tensorflow.org/tutorials/imag
我正在 sci-kit learn 中构建 MLPClassifier 模型。我使用 gridSearchCV 和 roc_auc 对模型进行评分。训练和考试的平均成绩在 0.76 左右,还不错。 c
我使用我的测试集作为验证集。我使用了与 How to compute Receiving Operating Characteristic (ROC) and AUC in keras? 类似的方法
我分别从 sklearn 的 RandomForestClassifier 和 roc_curve、auc 方法收到不同的 ROC-AUC 分数。 以下代码让我获得了 0.878 的 ROC-AUC(
如何获得具有 fpr 和 tpr 的 AUC 值? Fpr 和 tpr 只是从这些公式中获得的 2 个浮点数: my_fpr = fp / (fp + tn) my_tpr = tp / (tp +
我有一个分类问题,我想在 sklearn 中使用 cross_validate 获取 roc_auc 值。我的代码如下。 from sklearn import datasets iris = dat
我有一个分类问题,我想在 sklearn 中使用 cross_validate 获取 roc_auc 值。我的代码如下。 from sklearn import datasets iris = dat
在 scikit learn 中,您可以使用以下方法计算二元分类器的曲线下面积 roc_auc_score( Y, clf.predict_proba(X)[:,1] ) 我只对误报率小于 0.1 的
我正在尝试为我的 SVM 找到参数,这些参数会给我最好的 AUC。但是我在 sklearn 中找不到 AUC 的任何评分函数。有人有想法吗?这是我的代码: parameters = {"C":
这是一个代表 library(caret) library(dplyr) set.seed(88, sample.kind = "Rounding") mtcars % mutate(am = a
对于二元分类问题,我有一个略微不平衡的数据集,正负比为 0.6。 我最近从这个答案中了解到了 auc 指标:https://stats.stackexchange.com/a/132832/12822
我有一个 Spark 数据框,如下所示: predictions.show(5) +------+----+------+-----------+ | user|item|rating| predi
我正在研究一个分类问题,其评估指标为 ROC AUC。到目前为止,我已经尝试使用具有不同参数的 xgb 。这是我用来采样数据的函数。并且可以找到相关笔记本here (google colab) def
我对 python 中的 scikit-learn 中如何生成阈值感到困惑。对于以下示例,生成了四个阈值,当我将 pred 中的第三个值更改为 0.6 时,阈值数量降至 3。任何人都可以解释为什么会这
假设我有一个如下所示的数据集: word label_numeric 0 active 0 1 adventurous 0 2 aggressive 0 3 aggressi
我有一个分类问题,需要根据给定的数据预测 (0,1) 类。基本上我有一个包含超过 300 个特征(包括预测目标值)和超过 2000 行(样本)的数据集。我应用了不同的分类器,如下所示: 1. Dec
我的目标是找到预测模型来确定是否偿还贷款。我的来源是一个 CSV 文件,其中包含贷款特征以及是否已偿还。我使用 ROC 曲线和 AUC 评估模型的性能 df = pd.read_csv(your_pa
我想知道为什么我们的目标是在最大化准确率时最大化 AUC? 我认为,除了最大化准确性的主要目标之外,AUC 也会自动变大。 最佳答案 我想我们使用 AUC 是因为它解释了我们的方法能够在多大程度上独立
我正在尝试在非常不平衡的数据集上使用 LightGBM 构建分类器。不平衡的比例为 97:3,即: Class 0 0.970691 1 0.029309 我使用的参数和训练代码如下所示。
我是一名优秀的程序员,十分优秀!