马修斯相关系数与多类

机器算法验证 机器学习 分类 多级 协议统计
2022-03-12 03:29:06

马修斯相关系数 ( ) 是衡量二元分类质量的度量 ([Wikipedia][1])。公式用于使用真阳性( )、假阳性( )、假阴性( ) 和真阴性( ) 值进行二元分类,如下所示:MCCMCCTPFPFNTN

MCC=TP×TNFP×FN(TP+FP)(TP+FN)(TN+FP)(TN+FN)

我有一个案例,我需要对三个不同的类进行分类。值后,我可以应用上述公式计算多类情况的吗,如下所示? ABCMCCTPTNFPFN

TP=TPA+TPB+TPC;TN=TNA+TNB+TNC;FP=FPA+FPB+FPC;FN=FNA+FNB+FNC;

4个回答

是的,一般来说,你可以。您要使用的这种方法有时称为“微平均”:首先,将每个类的所有TNs、FPs 等相加,然后计算感兴趣的统计量。

组合单个类的统计数据的另一种方法是使用所谓的“宏观平均”:在这里您首先计算单个类的统计数据(A 与非 A、B 与非 B 等),然后计算他们。

你可以在这里查看一些额外的细节。该页面讨论了精确度和召回率,但我相信它适用于马修系数以及基于列联表的其他统计数据。

宏观平均技术适用于精度、灵敏度和特异性。但是当我为 MCC 尝试它时,它没有给出正确的结果。有关多类 MCC 计算的更多详细信息,请参阅:

  1. Jurman G、Riccadonna S、Furlanello C(2012 年)“多类预测中 MCC 和 CEN 误差度量的比较”。公共科学图书馆一号 7(8):e41882。doi:10.1371/journal.pone.0041882
  2. 尤尔曼、朱塞佩和切萨雷弗拉内罗。“多类预测中性能度量的统一观点。” arXiv 预印本 arXiv:1008.2908 (2010)。

以下代码对我有用:

% the confusion matrix at input is given by matrix cm_svm_array
mcc_numerator=0;count=1;
% limits klm=1 TO n SUM(ckk.cml - clk.ckm)
for k = 1:1:length(cm_svm_array)
    for l=1:1:length(cm_svm_array)
        for m=1:1:length(cm_svm_array)
          mcc_numerator1(count) = (cm_svm_array(k,k) *cm_svm_array(m,l))-
                                  (cm_svm_array(l,k)*cm_svm_array(k,m))
          mcc_numerator=mcc_numerator+mcc_numerator1(count)
          count=count+1;
        end
    end
end

mcc_denominator_1=0 ; count=1;
for k=1:1:length(cm_svm_array)
     mcc_den_1_part1=0;
    for l=1:1:length(cm_svm_array)
        mcc_den_1_part1= mcc_den_1_part1+cm_svm_array(l,k);
    end
    mcc_den_1_part2=0;
    for f=1:1:length(cm_svm_array)
        if f ~=k
          for g=1:1:length(cm_svm_array)
            mcc_den_1_part2= mcc_den_1_part2+cm_svm_array(g,f);
          end
        end
    end
    mcc_denominator_1=(mcc_denominator_1+(mcc_den_1_part1*mcc_den_1_part2));
end

mcc_denominator_2=0; count=1;
for k=1:1:length(cm_svm_array)
     mcc_den_2_part1=0;
    for l=1:1:length(cm_svm_array)
        mcc_den_2_part1= mcc_den_2_part1+cm_svm_array(k,l);
    end
    mcc_den_2_part2=0;
    for f=1:1:length(cm_svm_array)
        if f ~=k
          for g=1:1:length(cm_svm_array)
            mcc_den_2_part2= mcc_den_2_part2+cm_svm_array(f,g);
          end
        end
    end
    mcc_denominator_2=(mcc_denominator_2+(mcc_den_2_part1*mcc_den_2_part2));
end

mcc = (mcc_numerator)/((mcc_denominator_1^0.5)*(mcc_denominator_2^0.5))

MCC 可用于二进制和多类分类维基百科,它在sci-kit learn中实现,用于二进制和多类标签。

MCC 专为二进制分类而设计。

如果你想得到一个类似的分类器度量,你可以试试 Cohen's Kappa,它可以应用于多类混淆矩阵。