【问题标题】:Calculation of sensitivity and specificity from confusion matrix从混淆矩阵计算灵敏度和特异性
【发布时间】:2019-01-01 22:38:14
【问题描述】:

假设标记数据的数量为 0 = 1400,标记为 1 = 100。标记为 0 的数据表示正常运行条件,标记为1 的数据表示异常。只有异常事件才会触发警报。

假设二分类得到如下混淆矩阵

cmMatrix = 

                    predicted 0  predicted 1
           truth 0    1100 (TN)      300 (FP)
           truth 1    30 (FN)         70 (TP)


cmMatrix = [1100,300;30,70];
acc_0  = 100*(cmMatrix(1,1))/sum(cmMatrix(1,:));
acc_1  = 100*(cmMatrix(2,2))/sum(cmMatrix(2,:));

会给acc_0 = 78.5714acc_1 = 70

从 1400 个正常事件中读取混淆矩阵,其中 1100 个被正确识别为正常,300 个被错误识别为异常。 然后,在 100 个异常事件中,70 个被正确检测为异常,而 30 个被错误检测为异常。 我想计算第 1 类的敏感性和特异性,因为这是异常事件检测的主要关注点。我就是这样做的

Sensitivity = TP/(TP+FN) = 70/(70+30 ) = 0.70
Specificity = TN/(TN+FP) = 1100/(1100+300) = 0.78
  • 灵敏度是指测试正确检测异常事件的能力。为什么灵敏度如此之低且与准确度acc_1 如此之高(70%)不同。

  • 这个计算是否正确?各个类别的准确度和灵敏度有什么区别?

我是不是计算有误?

【问题讨论】:

  • 不客气。
  • @beaker:我的混淆矩阵是错误的,因此回答的人无法在我的计算中发现错误。这就是我一直在cmets下询问的原因。答案可能已过时且不适用。有没有办法得到修改后的答案?

标签: matlab machine-learning classification


【解决方案1】:

你的计算是正确的。鉴于您相对较高的准确性,我认为敏感性和特异性之间的不平衡让您感到困惑。这是正常的,并且是分类器的常见问题,尤其是当两个类之间没有均匀划分时。作为一个思想实验,假设您的分类器只是任意决定每个样本都被标记。这将为您提供 1400/1500 = 0.9333 的总体准确度,在您调查敏感性和特异性之前,这可能看起来非常好,这完全是由于类大小的差异。

正因为如此,以及在您的灵敏度非常低时误导性的高准确度,显示 F1 分数可能更具代表性:https://en.wikipedia.org/wiki/F1_score

【讨论】:

  • 感谢您的回答。那么什么指标被认为可以安全地说分类是好的呢?如果从混淆矩阵的第二行第一列看到,在我的情况下,很少有示例被错误标记为 (30) 为 0,我认为分类器做得很好。我的标准是分类器应该从异常(第 1 类)中遗漏更少的例子。您能否详细说明这一点?
  • 我还有一个后续问题在这里问stackoverflow.com/questions/51511959/…如果你能看一下它将会有很大的帮助。
  • 您使用的指标将取决于您的标准。我无法详细说明您的标准,这取决于您。你是说你希望你的正类是标记分数,所以我会首先重新格式化你的混淆矩阵以匹配它。请记住,准确性着眼于正确分类的整个百分比,但每当您谈论假阴性或敏感性或类似的事情时,这都是针对某个类别的。您可能还想查看这篇列出不同指标的维基百科文章:en.wikipedia.org/wiki/Confusion_matrix
  • 我的混淆矩阵是使用matlab中的confusionmatrix函数构造的。第一行用于标记为0 的类,第二行用于标记为1 的类。敏感度分数与标记为1 的类相关。不明白有错吗?
  • 您的混淆矩阵在数学上没有任何问题。但是由于您感兴趣的顺序是相反的,因此阅读它可能会混淆 :) 传统上,True Positives 位于矩阵的左上角。 Matlab中调用confusionmatrix函数时可以改变顺序
猜你喜欢
  • 2021-11-12
  • 2017-05-17
  • 1970-01-01
  • 2023-01-08
  • 2018-04-01
  • 2020-01-28
  • 2017-02-25
  • 2012-11-12
相关资源
最近更新 更多