R数据分析:多分类问题预测模型的ROC做法及解释

B站影视 2025-01-07 20:28 2

摘要:有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用roc曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评估指标。那么肯定是统一成ROC了,刚好借这个机会给大家讲讲R

有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用roc曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评估指标。那么肯定是统一成ROC了,刚好借这个机会给大家讲讲ROC在多分类问题情形下的具体使用和做法。

ROC 曲线(Receiver Operating Characteristic Curve):展示分类模型的真阳性率(TPR) 和 假阳性率(FPR)的关系。

真阳性率 (TPR):模型正确分类正样本的比例。假阳性率 (FPR):模型错误地把负样本判为正样本的比例。

其中的逻辑就是分类问题是要看概率阈值进行类别划分的,取不同的概率阈值,真阳性和假阳性率是不一样的。ROC曲线就是在所有可能的阈值下,绘制 TPR(纵轴) 对 FPR(横轴)的曲线。

而AUC(Area Under the Curve)就是ROC 曲线下的面积,反映模型的整体分类能力。AUC = 1,说明模型完美分类;AUC = 0.5,相当于随机猜测。

但是在多分类问题中,模型输出的不是“正/负”,而是多个类别(如 A、B、C)。与二分类不同,多分类任务中有多个类别,ROC 就无法直接绘制了。这个时候就需要变一下,我们常用两种方法将多分类任务转化为多个二分类问题:

One-vs-Rest (OvR):针对每个类别,将其视为“正类”,其他类别视为“负类”,分别绘制 ROC 曲线。One-vs-One (OvO):对每两个类别分别计算 ROC 曲线。

举个例子: 假设我们有 3 个类别:苹果(A)香蕉(B)橙子(C)

OvR 方法:针对“苹果 vs. 非苹果”、“香蕉 vs. 非香蕉”、“橙子 vs. 非橙子”,分别绘制 ROC。OvO 方法:只考虑两两类别,如“苹果 vs. 香蕉”、“苹果 vs. 橙子”、“香蕉 vs. 橙子”。

我们具体来看一下两种方法。

每个类别都当作“正类”,其余类别当作“负类”,逐一绘制 ROC 曲线。比如结局有 3 个类别:苹果(A)香蕉(B)橙子(C)

步骤:

对类别 A:正类:样本 1 和 4;负类:样本 2 和 3。根据模型给类别 A 的预测概率,计算 TPR 和 FPR,绘制 ROC 曲线。对类别 B:正类:样本 2;负类:样本 1、3、4。同样绘制 ROC 曲线。对类别 C:正类:样本 3;负类:样本 1、2、4。继续绘制 ROC 曲线。

两两类别比较,计算两者的 ROC 曲线。

类别 A 和 B:只比较这两个类别,绘制 ROC。类别 A 和 C:只比较 A 和 C。类别 B 和 C:只比较 B 和 C。

这样可以分别绘制多条 ROC 曲线。我们还是以水果的例子说明,比如整体模型输出如下:

那么只保留类别 A 和 B 的样本就是:模型对样本的预测概率:

A 的概率:0.8(样本 1),0.6(样本 4)。B 的概率:0.7(样本 2)

同理可以得到只保留类别 A 和 C 的样本和只保留类别 B 和 C 的样本,那么每一组比较分为正负后都可以得到ROC曲线。这个特定的ROC曲线说明模型在特定类别中的分类能力。

OvR 的意义:ROC 曲线告诉我们模型能否有效区分某个类别和其他类别。例如:类别 A 的 ROC 曲线越靠近左上角,说明模型越擅长把“苹果”与其他类别区分开。OvO 的意义:ROC 曲线告诉我们模型在两个类别间的区分能力。例如:类别 A 和 B 的 ROC 曲线好,说明模型能很好地区分“苹果”和“香蕉”。

这么多的ROC就对应这么多的AUC,那么有没有一个整体的AUC指标来评估模型的整体的表现呢?有的,整体表现可以用宏平均和微平均 AUC来表示宏平均 AUC:对每个类别的 AUC 求平均,反映模型对所有类别的平均分类能力。微平均 AUC:基于所有样本的预测结果计算 AUC,体现整体分类能力。

The Receiver Operating Characteristic (ROC) curve is a fundamental tool for evaluating the performance of classification models. While traditionally used in binary classification problems, its application to multiclass problems introduces additional complexity, requiring speCific adaptations such as One-vs-Rest (OvR) and One-vs-One (OvO) approaches.

宏平均 AUC

计算步骤

针对每个类别 Ci:将 Ci 视为正类,其他类别视为负类(One-vs-Rest 方法)。计算该类别的 ROC 曲线和 AUC 值。将所有类别的 AUC 值取平均:

假设 OvR 方法的结果如下图:

那么整体 AUC(宏平均) = (0.95 + 0.85 + 0.90) / 3 = 0.90。

微平均 AUC

微平均是从样本角度计算 ROC 和 AUC,将所有类别的预测结果合并为一个整体,计算模型对所有样本的总体表现。

计算步骤

将所有类别的预测和真实标签整合为二分类问题。把样本“属于某类别的所有正例”和“所有负例”看作整体。根据总体的真阳性(TP)、假阳性(FP)、真阴性(TN)、假阴性(FN)计算 ROC 曲线和 AUC。

假设模型的预测结果如下:

总体正例(正确预测类别为 A、B、C)个数为3(A 的 1,B 的 1,C 的 1)总体负例(错误预测类别)个数为2(A 的 1,C 的 1)

结合这些整体数据计算 AUC就是微平均 AUC。在多分类问题中一般报告微平均 AUC (Micro-averaged AUC)。

假设我现在有数据如下

其中group为一个三分类结局,我对其建立一个决策树模型,并用模型对原数据进行预测得到预测每一类的预测概率,那么我们作ROC的原始数据就有了,代码如下:

tree_model % filter(group1=='train'), method = "class")# 预测概率tree_probs % filter(group1=='train'), type = "prob")

这一步对不同的模型做法不同,但是目的只要得到模型对结局的预测概率就好,你做随机森林你就用训练好的随机森林模型得到预测概率,无论什么模型得到预测概率就行。

得到预测概率之后就可以作ROC了,代码如下:

# 获取实际类别actual % filter(group1=='train') %>% pull(group)# 计算每个类别的 ROC 曲线roc_list

上面的代码中时候了roc函数和auc函数得到得到结局每一类的对应值,重点是要看懂循环。运行代码后即可在ggplot中画图了,到了ggplot中灵活性就太大了,比如我画了个如下的图:

参考代码给大家放上,大家可以调整试试:

ggplot(data = roc_data, aes(x = FPR, y = TPR, color = Class)) +geom_line(size = 1) +geom_abline(linetype = "dashed", color = "black") +labs(title = "ROC Curves for Decision Tree Model", x = "False Positive Rate", y = "True Positive Rate") +theme_minimal(base_size = 14) +scale_color_manual(values = c("red", "blue", "orange", "purple")) +theme(panel.grid.major = element_blank, # 去掉主网格线panel.background = element_rect(fill = "white"), # 白色背景plot.background = element_rect(fill = "white", color = "black"), # 边框axis.line = element_line(color = "black"), # 坐标轴线legend.position = c(0.75, 0.075), # 图例位置:底部legend.title = element_blank, # 去掉图例标题legend.text = element_text(size = 10), # 图例字体大小plot.title = element_text(hjust = 0.5), # 标题居中axis.title = element_text(size = 12) , # 坐标轴标题字体大小) +guides(color = guide_legend(nrow = 2, byrow = TRUE)) # 图例两行显示

以上就是实操部分。

总结

多分类任务的 ROC 曲线虽然复杂,但通过 OvR 或 OvO 方法,可以将其转化为多个二分类问题进行分析。通过观察每个类别的 ROC 曲线和 AUC 值,可以深入了解模型在不同类别上的表现,并优化关键类别的分类效果。今天从给大家写了多分类问题的ROC曲线,希望这个大白话的解释能够帮助你理解。感谢大家耐心看完,自己的文章都写的很细,重要代码都在原文中,希望大家都可以自己做一做。如果对您有用请先记得收藏,再点赞分享。也欢迎大家的意见和建议,大家想了解什么统计方法都可以在文章下留言,说不定我看见了就会给你写教程哦,有疑问欢迎私信,有合作意向请直接滴滴我。

如果你是一个大学本科生或研究生,如果你正在因为你的统计作业、数据分析、模型构建,科研统计设计等发愁,如果你在使用SPSS, R,Mplus中遇到任何问题,都可以联系我。因为我可以给您提供最好的,最详细和耐心的数据分析服务。

如果你对Z检验,t检验,方差分析,多元方差分析,回归,卡方检验,相关,多水平模型,结构方程模型,中介调节,量表信效度等等统计技巧有任何问题,请私信我,获取详细和耐心的指导。

如果你或你的团队需要专业的科研数据清洗,建模服务,教学培训需求等等。请联系我。

If you are a student and you are worried about you statistical #Assignments, #Data #Analysis, #Thesis, #Reports, #Composing, #Quizzes, Exams.. And if you are facing problem in #SPSS, #R-Programming, #Excel, Mplus, then contact me. Because I could provide you the best services for your Data Analysis.

Are you confused with statistical Techniques like z-test, t-test, ANOVA, MANOVA, Regression, Logistic Regression, Chi-Square, Correlation, Association, SEM, multilevel model, mediation and moderation etc. for your Data Analysis...??

Then Contact Me. I will solve your Problem...

If You or Your Research Team Need Professional Scientific Data Cleaning, Model Building Services or Statistical Consulting... Please Contact Me.

往期精彩

R机器学习:神经网络算法的理解与实操,实例解析

R数据分析:工具变量回归的做法和解释,实例解析

R机器学习:决策树算法的理解与实操

R数据分析:临床研究样本量计算、结果解读与实操

R数据分析:网状meta分析的理解与实操

R数据分析:非劣效性研究设计的统计处理方法,原理和实例

R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析

R数据分析:净重新分类(NRI)和综合判别改善(IDI)指数的理解

R数据分析:反事实框架和因果中介的理论理解

R数据分析:广义估计方程式GEE的做法和解释

R数据分析:潜类别轨迹模型LCTM的做法,实例解析

R数据分析:潜变量与降维方法(主成分分析与因子分析)

R数据分析:如何给结构方程画路径图,tidySEM包详解

R数据分析:生存分析与有竞争事件的生存分析的做法和解释

R机器学习:朴素贝叶斯与支持向量机的原理与实现

R数据分析:混合效应模型的可视化解释,再不懂就真没办法

R数据分析:tableone包的详细使用介绍

R数据分析:如何用lavaan包做结构方程模型,实例解析

R机器学习:分类算法之K最邻进算法(KNN)的原理与实现

来源:Codewar

相关推荐