多类问题的准确性与 Jaccard

机器算法验证 scikit-学习 准确性 多级 杰卡相似度
2022-03-29 04:33:50

TL;DR对于多类问题,Jaccard 分数是否与准确率相同?


2019 年 3 月 29 日更新

现在使用 pull request #13151修复了 scikit-learn 中的错误实现万岁!

PS 这里的教训是,无论库、框架或想法多么成熟和广泛,它们总是存在错误和缺点。作为一名工程师、科学家或学生,您有责任验证您工作的理论和实际结果,尤其是当您依赖其他人的结果时。


我正在研究分类问题并使用scikit-learn计算准确度和 Jaccard 分数,我认为它是 pythonic 科学世界中广泛使用的库。但是,我和我的 matlab 同事得到了不同的结果。

sklearn.metrics.jaccard_similarity_score声明如下:

注意:在二分类和多分类中,这个函数相当于accuracy_score。它在多标签分类问题上有所不同。

sklearn.metrics.accuracy_score说:

注释 在二元和多类分类中,此函数等于 jaccard_similarity_score 函数。

实际上,如果问题不是多标签类型,则jaccard_similarity_score实现会回到准确性:

if y_type.startswith('multilabel'):
    ...
else:
    score = y_true == y_pred

return _weighted_sum(score, sample_weight, normalize)

是不是和Jaccard 索引(交集大于联合)的定义相矛盾?这些“分数”和“索引”是不同的指标吗?为多类问题计算 Jaccard 度量的正确且普遍接受的方法是什么?

2个回答

该问题已在 scikit-learn GitHub 存储库中报告:multiclass jaccard_similarity_score should not be equal to accuracy_score #7332

scikit-learn 的多类分类任务的 Jaccard 分数不正确。


{1} 中最常用的性能指标概览:

在此处输入图像描述

准确度是 AA+BB+CCAA+AB+AC+BA+BB+BC+CA+CB+CC.

平均 Jaccard 分数又名平均 Jaccard 系数是:

 13(AAAA+AB+AC+BA+CA+BBAB+BA+BB+BC+CB+CCAC+BC+CA+CB+CC)


例如,如果混淆矩阵是:

在此处输入图像描述

然后:

  • 准确度是 1+0+01+0+0+1+0+0+1+0+0= 13
  • 平均 Jaccard 得分为 13(11+0+0+1+1+00+1+0+0+0+00+0+1+0+0)=19

参考:

案例(尝试)的K 类多项式分类结果n是一个名义变量。因此,它可以表示为一组 k 个二进制虚拟变量。

现在,通过一组二元属性,两个案例(行向量)之间的Jaccard相似系数为aa+b+c; 准确得分(我相信是 F1 得分)等于Dice系数:2a2a+b+c(它将遵循链接背后的公式)。条款来自表格:

            case Y
             1   0
            -------
        1  | a | b |
case X      -------
        0  | c | d |
            -------
a = number of variables on which both objects X and Y are 1
b = number of variables where object X is 1 and Y is 0
c = number of variables where object X is 0 and Y is 1
d = number of variables where both X and Y are 0
a+b+c+d = p, the number of variables.

好的。考虑您链接到的文档中给出的示例:

y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
where values are class labels; 4 classes in all

这些可以看作是 8 个案例(试验)配对为 4 个实验(X 案例)和 4 个相应的真实输出(Y 案例)。将所有内容堆叠在一列中并转换为虚拟变量。在虚拟变量1中,每一行都有一个:

case         data      v_0      v_1      v_2      v_3

x1              0        1        0        0        0
x2              2        0        0        1        0
x3              1        0        1        0        0
x4              3        0        0        0        1
y1              0        1        0        0        0
y2              1        0        1        0        0
y3              2        0        0        1        0
y4              3        0        0        0        1

计算所有 8 个案例之间的 Jaccard 系数矩阵,成对计算,同样地计算 Dice 系数矩阵:

在此处输入图像描述

因为我们只对 X 和 Y 情况之间的比较感兴趣,所以我们只关注矩阵的黄色突出部分。我们将对黄色区域内的系数求和或平均。此外,由于数据是配对的,我们可能只考虑对角线的红色值并对它们进行平均。您的文件说他们的“Jaccard 分数”是各个 Jaccard 指数的平均值。所以我们在这里。

您会看到两个黄色方块中的条目是相同的:Jaccard 似乎等于 Dice(对于我们的名义数据情况)。4 个对角线值的平均值是(1+0+0+1) / 4 = 0.5,您的文档中给出的结果。

(例如,显示 X1 和 Y1 案例之间相似性系数的计算):

                       v_0      v_1      v_2      v_3
x1                      1        0        0        0
y1                      1        0        0        0

               Y1
             1   0
            -------
        1  | 1 | 0 |
    X1      -------
        0  | 0 | 3 |
            -------

Jaccard: 1/(1+0+0)=1; Dice: 2*1/(2*1+0+0)=1
Note that with a single set of dummy variables both coefficients
can attain only values 0 or 1.