如何计算多分类整体准确度、灵敏度和特异度?

10

谁能解释如何计算多类数据集的准确度,灵敏度和特异性?

enter image description here

2个回答

10
每个类的敏感性可以从其TP /(TP + FN)计算,每个类的特异性可以从其TN /(TN + FP)计算。对于多类分类,您可以使用一对所有方法。例如,假设有三个类:C1,C2和C3。 "C1的TP"是指被分类为C1的所有C1实例。 "C1的TN"是指未被分类为C1的所有非C1实例。 "C1的FP"是指被分类为C1的所有非C1实例。 "C1的FN"是指未被分类为C1的所有C1实例。要找到C2或C3的这四个术语,可以将C1替换为C2或C3。请参阅http://en.wikipedia.org/wiki/Sensitivity_and_specificity了解有关概念和方程式的更多信息。
在2x2中,一旦您选择了一个类别作为正面,另一个类别就自动变成了负面。有9个类别,根据您选择的哪一个作为“正面”,您基本上有9种不同的灵敏度。您可以通过折叠到2x2来计算这些,即Class1与非Class1,然后Class2与非Class2,依此类推。
示例:
我们得到了7种玻璃的混淆矩阵:
=== Confusion Matrix ===

  a  b  c  d  e  f  g   <-- classified as
 50 15  3  0  0  1  1 |  a = build wind float
 16 47  6  0  2  3  2 |  b = build wind non-float
  5  5  6  0  0  1  0 |  c = vehic wind float
  0  0  0  0  0  0  0 |  d = vehic wind non-float
  0  2  0  0 10  0  1 |  e = containers
  1  1  0  0  0  7  0 |  f = tableware
  3  2  0  0  0  1 23 |  g = headlamps

对于每种类型的玻璃,计算真正阳性率(敏感度),以及总体加权平均值:

=== Detailed Accuracy By Class ===

 TP Rate  FP Rate  Precision  Recall   F-Measure  MCC      ROC Area  PRC Area  Class
 0.714    0.174    0.667      0.714    0.690      0.532    0.806     0.667     build wind float
 0.618    0.181    0.653      0.618    0.635      0.443    0.768     0.606     build wind non-float
 0.353    0.046    0.400      0.353    0.375      0.325    0.766     0.251     vehic wind float
 0.000    0.000    0.000      0.000    0.000      0.000    ?         ?         vehic wind non-float
 0.769    0.010    0.833      0.769    0.800      0.788    0.872     0.575     containers
 0.778    0.029    0.538      0.778    0.636      0.629    0.930     0.527     tableware
 0.793    0.022    0.852      0.793    0.821      0.795    0.869     0.738     headlamps
 0.668    0.130    0.670      0.668    0.668      0.539    0.807     0.611     Weighted Avg.  

1
从结果来看,如果您选择不同的类作为正类,则性能显然会有所不同。在这种情况下,选择哪个作为总体性能报告的正确方式是什么? - SplitInf

0
您可以从下面的链接打印分类报告,以获取您模型的整体准确性。

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report

计算多分类的敏感性和特异性

from sklearn.metrics import precision_recall_fscore_support
res = []
for l in [0,1,2,3]:
     prec,recall,_,_ = precision_recall_fscore_support(np.array(y_true)==l,
                                                  np.array(y_prediction)==l,
                                                  pos_label=True,average=None)
     res.append([l,recall[0],recall[1]])

pd.DataFrame(res,columns = ['class','sensitivity','specificity'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接