R语言中多分类问题 multicalss classification 的性能测量

对于分类问题,通常根据与分类器相关联的混淆矩阵来定义分类器性能。基于矩阵的条目,可以计算灵敏度(召回),特异性和精确度。  

对于二元分类问题,所有这些性能测量都很容易获得。哪种衡量标准取决于分类器的类型。硬分类器是非得分的,因为它们只产生结果。另一方面,软分类器是评分分类器,其产生可以应用截止的量,以便找到。对于非评分分类器,我介绍了两个版本的分类器准确度以及F1分数的微观和宏观平均值。对于评分分类器,我描述了用于绘制精确与召回曲线的一对一方法以及多类的AUC的一般化。 

非评分分类器的数据

为了在多类设置中展示非评分分类器的性能指标,让我们考虑使用观察的分类问题和使用五个类的分类问题 

<span style="color:#000000"><span style="color:#000000"><code>ref.labels <- c(rep(<span style="color:#880000">"A"</span>, <span style="color:#880000">45</span>), rep(<span style="color:#880000">"B"</span> , <span style="color:#880000">10</span>), rep(<span style="color:#880000">"C"</span>, <span style="color:#880000">15</span>), rep(<span style="color:#880000">"D"</span>, <span style="color:#880000">25</span>), rep(<span style="color:#880000">"E"</span>, <span style="color:#880000">5</span>))
predictions <- c(rep(<span style="color:#880000">"A"</span>, <span style="color:#880000">35</span>), rep(<span style="color:#880000">"E"</span>, <span style="color:#880000">5</span>), rep(<span style="color:#880000">"D"</span>, <span style="color:#880000">5</span>),
                 rep(<span style="color:#880000">"B"</span>, <span style="color:#880000">9</span>), rep(<span style="color:#880000">"D"</span>, <span style="color:#880000">1</span>),
                 rep(<span style="color:#880000">"C"</span>, <span style="color:#880000">2</span>))
df <- data.frame(<span style="color:#880000">"Prediction"</span> = predictions, <span style="color:#880000">"Reference"</span> = ref.labels)</code></span></span>

准确性和加权准确性

通常,多级准确度定义为正确预测的平均数量 

为了对单个类的性能更敏感,我们可以为每个类分配权重,使得。单个类的值越高,该类的观测值对加权精度的影响就越大。 

要平等地对所有类加权,我们可以设置。请注意,当使用除均匀权重之外的任何其他内容时,很难为某些权重组合找到合理的参数。 

计算精度和加权精度

准确性非常容易计算:

## [1] "Accuracy is: 0.78"
## [1] "Weighted accuracy is: 0.69"

请注意,均匀权重的加权精度低于总体准确度(0.78),因为它对五个类别的预测性能贡献相等,与观察数量无关。

F1分数的微观和宏观平均值

微观和宏观平均值代表了在多类设置中解释混淆矩阵的两种方法。在这里,我们需要计算每个类的混淆矩阵中的,使得 th混淆矩阵考虑类作为正类和所有其他类与作为否定类。由于每个混淆矩阵将用除了之外的类标记的所有观察汇集为负类,因此这种方法导致真阴性数量的增加,特别是如果有许多类。 

为了举例说明为什么真阴性的增加是有问题的,想象一下有10个类,每个类有10个观察值。然后,其中一个类的混淆矩阵可能具有以下结构:

预测/参考 1级 其他类
1级 8 10
其他类 2 80

基于这个矩阵,特异性将是尽管第1类仅在18个实例中的8个中被正确预测(精确度为44.4%)。 微观和宏观平均值仅针对F1分数而不是针对平衡准确度来定义,其取决于真实的负面率。8080+10=88.9%8080+10=88.9%

在下文中,我们将使用,和分别指示与 -相关联的混淆矩阵中的真阳性,假阳性和假阴性。类。此外,让精度用表示,并用调用。TPiTPiFPiFPiFNiFNiiiPPRR

微观平均值

 

如果分类器获得大,则表示它整体表现良好。微观平均值对个别类别的预测性能不敏感。因此,当类别分布不平衡时,微观平均值可能特别具有误导性。 

宏观平均值

 

如果具有较大的值,则表示分类器对每个单独的类执行良好。因此,宏观平均值更适合具有不平衡类分布的数据。 

计算R中的微观和宏观平均值

在这里,我演示了如何在R中计算F1得分的微观和宏观平均值。

一对一的混淆矩阵

找到微观和宏观平均值的第一步涉及为每个类计算一对一的混淆矩阵。我们将使用包中的confusionMatrix函数caret来确定混淆矩阵:

现在存储了所有类特定的混淆矩阵cm,我们可以总结所有类的性能:

##          Precision    Recall
## Class: A 0.9459459 0.7777778
## Class: B 0.5625000 0.9000000
## Class: C 0.8333333 0.6666667
## Class: D 0.7931034 0.9200000
## Class: E 0.1666667 0.2000000

这些数据表明,整体而言,性能相当高。但是,我们的假设分类器对于各个类(如B类(精度)和E类(精度和召回)都表现不佳)。我们现在将研究F1分数的微观和宏观平均值如何受到模型预测的影响。

微平均F1的整体表现

要确定,我们需要确定,和。这是由该功能完成的。然后,该函数简单地聚合计数并计算如上定义的F1分数。F1microF1microTPiTPiFPiFPiFNiFNi ∀i∈{1,…,K}∀i∈{1,…,K}get.conf.statsget.micro.f1

## [1] "Micro F1 is: 0.88"

用的值0.88,是相当高的,这表明良好的综合性能。正如预期的那样,微观平均的F1并没有真正考虑到分类器在E级上表现不佳,因为这个类中只有5个影响。 

具有宏观平均F1的类特定性能

由于每个混淆矩阵cm已经存储了一对一的预测性能,我们只需要从其中一个矩阵中提取这些值并按上面的定义计算:

## [1] "Macro F1 is: 0.68"

用的值0.68,是断然比微平均F1小()。由于E类的分类器表现不佳(精度:16.7%,回忆:20%)并且贡献到,它更低比。FmacroFmacro10.881515FmacroFmacroF1microF1micro

注意,对于当前数据集,微观和宏观平均F1具有与总体(0.78)和加权精度(0.69)相似的关系。

精确回忆曲线和AUC

ROC曲线下面积(AUC)是评估软分类器类别分离质量的有用工具。在多类设置中,我们可以根据它们的一对一精度回忆曲线可视化多类模型的性能。AUC也可以推广到多类设置。

一对一精确回忆曲线

正如 所讨论的,我们可以通过绘制二元分类器的性能来可视化多类模型的性能。KK

这种方法基于拟合 one-vs-all分类器,其中在 th迭代中,group被设置为正类,而所有类与被认为是消极类。请注意,此方法不应用于绘制传统的ROC曲线(TPR与FPR),因为由于二分法导致的大量负面示例,FPR将被低估。相反,应考虑精确度和召回率: 

R语言中多分类问题 multicalss classification 的性能测量

<span style="color:#000000"><span style="color:#000000"><code>print(paste0(<span style="color:#880000">"Mean AUC under the precision-recall curve is: "</span>, round(mean(aucs), <span style="color:#880000">2</span>)))</code></span></span>
## [1] "Mean AUC under the precision-recall curve is: 0.97"

该图表明可以很好地预测setosa,而变色维吉尼亚更难以预测。平均AUC 0.97表示该模型非常好地分离了这三个类。

多类设置的AUC的推广

对于多类设置,有几种AUC的概括。在这里,我将重点介绍Hand and Till在2001年所建立的概括。

单个决策值的广义AUC

当单个数量允许分离类时multiclass.rocpROC包中的函数可用于确定AUC。 该函数似乎没有实现Hand和Till的方法,因为不考虑类预测。但是,该文档警告该功能处于测试阶段。我目前正在等待包装作者对该multiclass.roc功能的回复,以验证我的理解是否正确。

## Multi-class area under the curve: 0.654

计算出的函数AUC就是所有成对类比较的平均AUC。

手工和耕作的AUC概括

 

假设类用标记为。为了概括AUC,我们考虑成对的类。一个好的分类器应该为正确的类分配高概率,同时为其他类分配低概率。这可以通过以下方式形式化。 

这里,乘数是因为存在方式,其中可以构造不同的对,考虑不同的排序。由于只计算了这些对中的一半,因此枚举数的值为2。2c(c−1)2c(c−1)c(c−1)c(c−1)

计算条件概率的示例

请参考下图,了解如何计算条件概率的示例。

R语言中多分类问题 multicalss classification 的性能测量

从Hand and Till实现AUC概括

由于Hand and Till(2001),似乎没有公开实现AUC的多级概括。因此,我写了一个实现。该函数compute.A.conditional确定。该函数用计算所有类对的,然后计算结果值的平均值。 

## [1] "Generalized AUC is: 0.988"
##    setosa/versicolor     setosa/virginica versicolor/virginica 
##            1.0000000            1.0000000            0.9627329

使用这种方法,广义AUC为0.988,这与二元一对一分类器的精确回忆曲线的平均值惊人相似。对所得的成对AUC的解释也是类似的。虽然用于分离setosa / versicolorsetosa / virginica的AUC均为1,但对于变色 / 维吉尼亚的AUC 略小,这与我们之前的发现一致,即从变色维吉尼亚的观察更难以准确预测。

 如果您有任何疑问,请在下面发表评论。 

 

上一篇:R语言中绘制ROC曲线和PR曲线


下一篇:log loss与ctr预估