scikit learn中coverage_error指标的说明

时间:2015-07-09 07:45:18

标签: scikit-learn multilabel-classification

我不了解如何在scikit learn中计算coverage_error,可在sklearn.metrics模块中找到。文档中的说明如下:

  

coverage_error函数计算必须包含在最终预测中的标签的平均数量,以便预测所有真实标签。

例如:

import numpy as np
from sklearn.metrics import coverage_error
y_true = np.array([[1, 0, 0], [0, 1, 1]])
y_score = np.array([[1, 0, 0], [0, 1, 1]])
print coverage_error(y_true, y_score)
1.5

根据我的理解,我们需要在预测中包含3个标签,以获取y_true中的所有标签。所以覆盖误差= 3/2,即1.5。但我无法理解以下情况会发生什么:

>>> y_score = np.array([[1, 0, 0], [0, 0, 1]])
>>> print coverage_error(y_true, y_score)
2.0
>>> y_score = np.array([[1, 0, 1], [0, 1, 1]])
>>> print coverage_error(y_true, y_score)
2.0

为什么两种情况下的错误都相同?

1 个答案:

答案 0 :(得分:4)

您可以查看User Guide 3.3.3. Multilabel ranking metrics

  

enter image description here

     

enter image description here

您需要注意的一件事是如何计算排名并打破排名y_score中的关系。

具体而言,第一种情况:

In [4]: y_true
Out[4]:
array([[1, 0, 0],
       [0, 1, 1]])

In [5]: y_score
Out[5]:
array([[1, 0, 0],
       [0, 0, 1]])
  1. 对于第1个样本,第1个真实标签为真,第1个分数的等级为1。
  2. 对于2ed样本,2ed和3rd标签为真,分数等级分别为3和1,因此最高等级为3。
  3. 平均值为(3 + 1)/ 2 = 2。
  4. 第二种情况:

    In [7]: y_score
    Out[7]:
    array([[1, 0, 1],
           [0, 1, 1]])
    
    1. 对于第1个样本,第1个真实标签为真,第1个分数的等级为2。
    2. 对于2ed样本,2ed和3rd标签为真,分数等级分别为2和2,因此最高等级为2.
    3. 平均值为(2 + 2)/ 2 = 2。
    4. 修改

      排名在y_score的一个样本中。公式表示标签的等级是分数大于或等于其分数的标签(包括其自身)的数量。

      就像按y_score排序标签一样,得分最高的标签排名第1,第二大排名第2,第三大排名第3,等等。但如果排名第二和第三大标签具有相同的分数,它们都排在第3位。

      请注意y_score

        

      目标分数,可以是正类的概率估计,置信度值或二元决策。

      目标是预测所有真实标签,因此我们需要包含分数高于或等于真实标签的所有标签。