R语言中的多类别问题的绩效衡量:F1-score 和广义AUC

news2024/11/24 6:34:38

最近我们被客户要求撰写关于分类的研究报告,包括一些图形和统计输出。对于分类问题,通常根据与分类器关联的混淆矩阵来定义分类器性能。根据混淆矩阵 ,可以计算灵敏度(召回率),特异性和精度。 

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

非得分分类器的数据

为了展示多类别设置中非得分分类器的性能指标,让我们考虑观察到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类810
其他类280

基于此矩阵,特异性将为 (  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 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于javaweb物业管理系统的设计与实现/小区物业管理系统

摘 要 随着世界经济快速的发展&#xff0c;全国各地的城市规模不断扩大&#xff0c;住进城市的人口日益增多&#xff0c;房地产行业在现代社会的发展中有着重要的作用&#xff0c;有越来越多的人居住在小区里。 因此&#xff0c;一套高效并且无差错的物业管理系统软件在现代社会…

基于Android的校园一卡通App平台

演示视频信息&#xff1a; A6604基于Android的校园一卡通一、研究背景、目的及意义 &#xff08;一&#xff09;研究背景 二十一世纪是信息化的时代&#xff0c;信息化建设成为我们的首要任务。当前我国大力发展信息产业&#xff0c;在全国范围内各行各业开始实施信息化…

为什么要上机械制造业ERP系统?对企业有什么帮助?

在日益竞争激烈的市场背景下&#xff0c;机械制造企业提供的产品需要具有更短的交货期、更高的质量、更好的服务。而机械行业由于其工艺复杂的生产特点&#xff0c;工艺及在制品管理困难&#xff0c;单纯的靠手工记账处理&#xff0c;已经难以满足现代企业科学管理的需要。只有…

艾美捷IFN-gamma体内抗体参数及应用

艾美捷IFN-gamma体内抗体背景&#xff1a; 干扰素γ&#xff08;IFN-γ&#xff09;或II型干扰素是一种二聚可溶性细胞因子&#xff0c;是II型干扰素的唯1成员。它是一种细胞因子&#xff0c;对抵抗病毒和细胞内细菌感染的先天性和适应性免疫以及肿瘤控制至关重要。IFNG主要由…

TensorFlow平台应用

目录 一&#xff1a;TensorFlow简介 二&#xff1a;TensorFlow工作形式 三&#xff1a;图/Session 四&#xff1a;安装tensorflow 五&#xff1a;张量 六&#xff1a;变量/常量 七&#xff1a;创建数据流图、会话 八&#xff1a;张量经典创建方法 九&#xff1a;变量赋…

[Java EE初阶]Thread 类的基本用法

本就无大事,庸人觅闲愁. 文章目录1. 线程创建2. 线程中断2.1 通知终止后立即终止2.2 通知终止,通知之后线程继续执行2.3 通知终止后,添加操作后终止3. 线程等待4. 线程休眠5. 获取线程实例1. 线程创建 创建线程有五个方法 详情见我的另一个文章 https://editor.csdn.net/md/?…

【K8S系列】第十二讲:Service进阶

目录 ​编辑 序言 1.Service介绍 1.1 什么是Service 1.2 Service 类型 1.2.1 NodePort 1.2.2 LoadBalancer 1.2.3 ExternalName 1.2.4 ClusterIP 2.yaml名词解释 3.投票 序言 当发现自己的才华撑不起野心时&#xff0c;就安静下来学习吧 三言两语&#xff0c;不如细…

Unity 灯光

初始化时&#xff0c;系统默认会给一个灯光&#xff0c;类型为定向光。 定向光意为&#xff0c;从无穷远处照射过来的平行光&#xff0c;因此每个图形的阴影的方向一致 灯光的系统参数 阴影类型&#xff1a;①无阴影 ②硬阴影 ③软阴影 &#xff08;注意&#xff09;阴影类型最…

力扣(LeetCode)164. 最大间距(C++)

桶排序(划分区间) 一次遍历找到区间内最大值 MaxMaxMax &#xff0c;最小值 MinMinMin 。区间 (Min,Max](Min,Max](Min,Max] 左开右闭&#xff0c;划分为 n−1n-1n−1 个长度为 lenlenlen 的区间 &#xff0c;划分的区间左开右闭&#xff0c;所以每个子区间有 len−1len-1len−…

SpringCloud学习笔记

SpringCloud学习笔记成熟分布式微服务架构包含技术模块SpringCloud与SpringBoot版本选择SpringCloud各技术模块的技术选择SpringCloud实现订单-支付微服务创建父工程(管理子工程即各个微服务)父工程的build.gradle配置父工程的settings.gradle配置创建支付子工程(payment_nativ…

物联网开发笔记(64)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程&#xff1a;控件显示。 二、环境 ESP32 ILI9341 3.2寸TFT-LCD触摸屏 Thonny IDE 几根杜邦线 接线方法&#xff1a;见前面文章。 三、滑杆代码 import lvgl as lv i…

北京理工大学汇编语言复习重点

汇编是半开卷&#xff0c;可以带纸质资料。理论上&#xff0c;学好了以后&#xff0c;带本书进去就ok了&#xff0c;但是这次是线上&#xff0c;我还没书&#xff0c;就对着考试重点整理一点资料用于打印吧。 因为是线上&#xff0c;所以第4章基本不考框架了&#xff0c;浮点操…

工业4.0,科技引发产业革命,MES系统是数字化工厂的核心

当前&#xff0c;把握工业4.0时代信息技术引发的产业革命风口期&#xff0c;促进产业数字化转型升级&#xff0c;构建产业竞争新格局&#xff0c;实现弯道超车是难得一遇的大好时机&#xff0c;是局势所趋。在这样的大环境下&#xff0c;顺应全世界产业革命趋势&#xff0c;将数…

python的安装

python可以在所有操作系统上运行&#xff0c;但不同操作系统的安装方法有所不同 以&#xff1a;Mac OS X 和 Windows为例 为了安装 Python 并能正常使用&#xff0c;请根据你的操作系统安装提示&#xff0c;按照相应的步骤来操作。 我们还将进行一系列的测试&#xff0c;确保一…

SpringBoot实战(十)集成多数据源dynamic-datasource

目录1.Maven依赖2. DS注解3.普通Hihari连接池3.1 yml配置4.Druid连接池4.1 Druid依赖4.2 yml配置4.3 排除原生的Druid配置5. UserController6. UserServiceImpl7.测试7.1 新增数据7.2 查询数据7.3 测试结果8.源码地址&#xff1a;dynamic-datasource-spring-boot-starter 是一个…

【大数据入门核心技术-Kafka】(四)Kafka常用shell命令

目录 一、准备工作 1、Zookeeper集群安装 2、Kafka集群安装 二、常用Shell命令 1、创建Topic 2、查看创建的Topic 3、查看某一个Topic的详细信息 4、修改Topic 5、删除Topic 6、生产者发布消息命令 7、消费者接受消息命令 8、查看kafka节点数目 9、查看kafka进程 一…

再学C语言8:数据类型(6)——float和其他类型

一、_Bool类型 _Bool类型由C99引入 _Bool类型用于表示布尔值&#xff1a;逻辑值true&#xff08;真&#xff09;和false&#xff08;假&#xff09; C用值1表示true&#xff0c;用值0表示false&#xff0c;所以_Bool类型本质上也是一种整数类型 二、float、double和long do…

查找排序编程题——二分查找+冒泡排序‍♀️

目录 7-1 二分查找 输入格式: 输出格式: 输入样例: AC&#xff1a; 7-2 冒泡法排序 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; AC&#xff1a; 附&#xff1a; 分享&#x1f31e; &#xff1a; 前途与玫瑰 来日与方…

尝试使用LTTng+TraceCompass分析一下进程周期偏移

准备工作 我先是在板子里通过LTTng Stream的方式将log保存在了上位机里。 然后在上位机中打开TraceCompass分析log。 导出整理log数据 然后我在events表格中搜索我的进程名&#xff0c;发现主要是sched_switch sched_waking sched_wakeup这三类。 然后我又搜索了一下&#x…

10个最好的WordPress RSS插件比较(2022)

您是否正在为您的网站寻找最好的 WordPress RSS 提要插件&#xff1f; RSS 提要插件可以轻松地自动从其他网站提取内容并将其显示在您的网站上。它们还可用于提高参与度、增加流量和增加页面浏览量。 在本文中&#xff0c;我们将分享我们挑选的可在您的网站上使用的最佳 Word…