关于算法:R语言中的多类别问题的绩效衡量F1score-和广义AUC

原文链接:http://tecdat.cn/?p=11160

原文出处:拓端数据部落公众号

对于分类问题,通常依据与分类器关联的混同矩阵来定义分类器性能。依据混同矩阵 ,能够计算灵敏度(召回率),特异性和精度。 

对于二进制分类问题,所有这些性能指标都很容易取得。  

非得分分类器的数据

为了展现多类别设置中非得分分类器的性能指标,让咱们思考察看到N = 100的分类问题和察看到G = {1,…,5}的五个分类问题:

ref.labels <- c(rep("A", 45), rep("B" , 10), rep("C", 15), rep("D", 25), rep("E", 5))
predictions <- c(rep("A", 35), rep("E", 5), rep("D", 5),
                 rep("B", 9), rep("D", 1),
                 rep("C", 7), rep("B", 5), rep("C", 3),
                 rep("D", 23), rep("C", 2),
                 rep("E", 1), rep("A", 2), rep("B", 2))

准确性和加权准确性

通常,将多类准确性定义为正确预测的平均数:

其中 I 是指标函数,如果类匹配,则返回1,否则返回0。

为了对各个类的性能更加敏感,咱们能够为每个类调配权重 w\_k ,以使 sum\_ {k = 1} ^ {| G |} w\_k = 1  。单个类别的 w\_k  值越高,该类别的观测值对加权准确性的影响就越大。加权精度取决于:

为了均匀加权所有类,咱们能够设置 w_k =   frac {1} {| G |} , for all k in  {1,…,G }  )。留神,当应用除均等权重之外的任何其余值时,很难找到对于权重的特定组合的正当论证。

计算精度和加权精度

精度很容易计算:

    return(length(which(predictions == ref.labels)) / length(ref.labels))

    lvls <- levels(ref.labels)

    if (sum(weights) != 1) {
        stop("Weights do not sum to 1")
    }
    accs <- lapply(lvls, function(x) {
        idx <- which(ref.labels == x)
        return(calculate.accuracy(predictions\[idx\], ref.labels\[idx\]))
    })
    acc <- mean(unlist(accs))
accuracy(Prediction, Reference)
## \[1\] "Accuracy is: 0.78"
## \[1\] "Weighted accuracy is: 0.69"

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

宏观平均值和宏观平均值示意在多类设置中解释混同矩阵的两种形式。在这里,咱们须要为每个类 (g_i  in G =  {1, ldots,K  } )计算一个混同矩阵,以使第 (i  )个混同矩阵思考类 (g\_i  )作为必定类,而所有其余类 (g\_j  )作为 (j  neq i  )作为否定类。 

为了阐明为什么减少实在正数会带来问题,请设想有10个类别,每个类别有10个察看值。而后,其中一个类别的混同矩阵可能具备以下构造:

预测/参考

1类

其余类

1类

8

10

其余类

2

80

基于此矩阵,特异性将为 (  frac {80} {80 + 10} = 88.9 % ),只管仅在18个实例中的8个实例中正确预测了1类(精度为44.4%)。 

在下文中,咱们将应用 TP\_i  , FP\_i 和 FN_i  别离在与第(i)个相关联的混同矩阵中批示真阳性,假阳性和假阴性类。此外,让精度由 P 示意,并由 R  示意。

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

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

 咱们将应用 包中的  confusionMatrix 函数 来确定混同矩阵:

当初, 能够总结所有类的性能:

metrics <- c("Precision", "Recall")
print(yClass\[, metrics\])
##          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分数。

micro.f1 <- get.f1(cm)
## \[1\] "Micro F1 is: 0.88"

 值为  0.88相当高,表明整体性能良好。 

宏均匀F1的类特定性能

因为其中的每个混同矩阵都  cm 曾经存储了一对多的预测性能,因而咱们只须要从其中一个矩阵中提取这些值,而后按上述定义计算\(F1 _ {rm {macro}}):

    c <- cm\[\[1\]\]$byClass 
    re <- sum(c\[, "Recall"\]) / nrow(c)
    pr <- sum(c\[, "Precision"\]) / nrow(c)
    f1 <- 2 * ((re * pr) / (re + pr))
    return(f1)

f1(cm)
## \[1\] "Macro F1 is: 0.68"

 值  0.68。 

请留神,对于以后数据集,宏观均匀和宏观均匀F1的总体(0.78)和加权精度(0.69)具备类似的关系。

ROC曲线下的面积(AUC)

ROC曲线下的面积(AUC)是评估软分类器分类拆散品质的有用工具。在多类别设置中,咱们能够依据它们对所有精度召回曲线的关系可视化多类别模型的性能。AUC也能够推广到多类别设置。

一对一的准确召回曲线

 咱们能够通过绘制K 二进制分类器的性能来可视化多类模型的性能。

该办法基于拟合K 对所有分类器,其中在第(i)次迭代中,组g\_i设置为正类,而所有类g\_j与j neq i 一起被视为否定类。请留神,此办法不利用于绘制惯例ROC曲线(TPR与FPR),因为产生的大量负面实例会导致FPR被低估。相同,应思考精度和召回率:

for (i in seq_along(levels(response))) {

  model <- NaiveBayes(binary.labels ~ .,)
  pred <- predict(model, iris.test\[,-5\], type='raw')
  score <- pred$posterior\[, 'TRUE'\] # 正类的后验
   
  lines(roc.y ~ roc.x, col = colors\[i\], lwd = 2)
  # 保留AUC
  auc <- performance(pred, "auc")
  auc <- unlist(slot(auc, "y.values"))
  aucs\[i\] <- auc

 

## \[1\] "Mean AUC under the precision-recall curve is: 0.97"

该图表明  setosa  能够很好地预测,而   _virginica_  则更难预测。 均匀AUC  0.97 示意该模型很好地分隔了三个类别。

多类设置的AUC通用化

单个决策值的狭义AUC

 当单个数量容许分类时,可应用包装中的roc 确定AUC。  

## Multi-class area under the curve: 0.654

函数的计算出的AUC只是所有成对类别比拟中的平均值AUC。

 狭义AUC 

上面从Hand and Till,2001开始形容AUC的一般化  。

 

仿佛因为Hand and Till(2001),没有公开可用的AUC多类概括的实现。因而,我编写了一个实现。该函数 确定 hat {A}(i | j) 。 为所有具备 (i <j )的类对计算 ( hat {A}(i,j) ),而后计算结果值的平均值。输入为狭义AUC  (M  ),该属性 AUCs 批示 (A(i,j) )的值。


 
    pairs <- unlist(lapply(combn(labels, 2, simplify = FALSE), function(x) paste(x, collapse = "/")))

    A.ij.joint <- sum(unlist(A.mean))
    M <- 2 / (c * (c-1)) * A.ij.joint 
    attr(M, "pair_AUCs") <- A.mean
 
model <- NaiveBayes(iris.train$Species ~ ., data = iris.train\[, -5\])
pred <- predict(model, iris.test\[,-5\], type='raw')
pred.matrix <-  posterior
ref.outcome <-  Species
 auc(pred.matrix, ref.outcome)
## \[1\] "Generalized AUC is: 0.988"
print(  "pair_AUCs")) # 配对AUCs
##    setosa/versicolor     setosa/virginica versicolor/virginica 
##            1.0000000            1.0000000            0.9627329

应用这种办法,狭义AUC为0.988 。生成的配对AUC的解释也类似。 

摘要

对于多类别问题 。

  • 对于硬分类器,您能够应用(加权)准确性以及宏观或宏观均匀F1分数。
  • 对于软分类器,您能够确定全精度召回曲线,也能够应用Hand and Till中的AUC 。

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

阿里云限时活动-1核2G-1M带宽-40-100G ,特惠价87.12元/年(原价1234.2元/年,可以直接买3年),速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

You may also like...

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据