首页 > 解决方案 > sklearn 如何计算average_precision_score?

问题描述

根据此处的平均精度(AP)分数的定义,AP是基于跨阈值的召回率和增量计算的。

在average_precision_score函数中,必选参数如下:
y_true:二进制标签指标中的真实二进制标签。

y_score:目标分数,可以是正类的概率估计、置信度值或决策的非阈值度量(由某些分类器上的“decision_function”返回)。

据我了解,y_true是每个记录所属的基本事实类别的列表。y_score是每条记录对应的预测类别列表。同样,对于二元分类任务,y_true = [1,0,0,1,1] 和y_score = [0,0,0,1,0] 将是可行的参数,其中对于记录 1,ground truth 类是正(1),但预测类别为负(0)。

我们尝试使用不同的阈值进行分类任务。因此,我们为每个阈值获得不同的y_score列表。在这种情况下,当我应用 average_precision_score 函数时,我将获得每个阈值的 AP 值。不是定义所暗示的跨阈值的单个值。在 sklearn 函数中无论如何都没有“阈值”参数。

请问我对sklearn中average_precision_score函数的理解是否正确?如果是,与定义相矛盾的原因是什么?

标签: pythonmachine-learningscikit-learn

解决方案


你犯了一个错误:

Y_score 不是 [0,0,1,0] 形式的

来自文档:

y_score : array, shape = [n_samples] or [n_samples, n_classes] 目标分数,可以是正类的概率估计、置信度值或决策的非阈值度量(由某些分类器上的“decision_function”返回)。

意味着它具有以下形式 [[0.33,0.66][0.65,0.35][0.1,0.9]...]。你得到每个类的概率。现在阈值是您将决定分配给每个点的类别的值。

例如,在我上面给出的阈值为 0.4 的列表中,如果 1 的概率高于 0.4,那么我分配 1。有了这个阈值,我的向量现在是 [1,0,1,...] 但如果阈值是 0.70,然后是 [0,0,1,....]。

因此,通过一个预测,您可以应用不同的阈值,从而计算平均精度分数。精度和召回率基于阈值。

几天前在这里做了一个很好的解释:了解ROC曲线


推荐阅读