网站首页 > 技术文章 正文
有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用ROC曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评估指标。那么肯定是统一成ROC了,刚好借这个机会给大家讲讲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,相当于随机猜测。
多分类 ROC 的挑战
但是在多分类问题中,模型输出的不是“正/负”,而是多个类别(如 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. 橙子”。
我们具体来看一下两种方法。
方法 1:One-vs-Rest (OvR)
每个类别都当作“正类”,其余类别当作“负类”,逐一绘制 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 曲线。
方法 2:Pairwise Comparison (OvO)
两两类别比较,计算两者的 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曲线说明模型在特定类别中的分类能力。
如何理解这些 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)。
代码实操:R 中实现多分类 ROC
假设我现在有数据如下
其中group为一个三分类结局,我对其建立一个决策树模型,并用模型对原数据进行预测得到预测每一类的预测概率,那么我们作ROC的原始数据就有了,代码如下:
tree_model <- rpart(group ~ HR + SPO2 + lungrales + Wheezing, data = data%>% filter(group1=='train'), method = "class")
# 预测概率
tree_probs <- predict(tree_model, newdata = data%>% filter(group1=='train'), type = "prob")
这一步对不同的模型做法不同,但是目的只要得到模型对结局的预测概率就好,你做随机森林你就用训练好的随机森林模型得到预测概率,无论什么模型得到预测概率就行。
得到预测概率之后就可以作ROC了,代码如下:
# 获取实际类别
actual <- data%>% filter(group1=='train') %>% pull(group)
# 计算每个类别的 ROC 曲线
roc_list <- list()
auc_list <- list()
for (i in 1:ncol(tree_probs)) {
roc_list[[i]] <- roc(as.numeric(actual == levels(actual)[i]),
tree_probs[, i])
auc_list[[i]] <- auc(roc_list[[i]])
}
# 计算微平均 ROC 曲线
all_probs <- as.vector(tree_probs)
all_labels <- as.vector(model.matrix(~ actual - 1))
micro_roc <- roc(all_labels, all_probs)
# 创建数据框,用于 ggplot 绘图
roc_data <- data.frame()
for (i in 1:length(roc_list)) {
roc_data <- rbind(roc_data,
data.frame(TPR = roc_list[[i]]$sensitivities,
FPR = 1 - roc_list[[i]]$specificities,
Class = paste0("Class ", i, " (AUC = ", round(auc_list[[i]], 2), ")")))
}
# 添加微平均 ROC 曲线
roc_data <- rbind(roc_data,
data.frame(TPR = micro_roc$sensitivities,
FPR = 1 - micro_roc$specificities,
Class = paste0("Micro-average (AUC = ", round(auc(micro_roc), 2), ")")))
上面的代码中时候了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)的原理与实现
猜你喜欢
- 2025-01-12 ??外媒模型预测:森林晋级欧冠概率高达40%,已经完全保级成功
- 2025-01-12 巴西智库用数学模型预测世界杯赛事比分
- 2025-01-12 时间序列演进也是种扩散过程?基于移动自回归的时序扩散预测模型
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)