承接:样本分布不平衡,机器学习准确率高又有什么用?

对于不平衡数据集,AUC值是分类器效果评估的常用标准。但如果在解释时不仔细,它也会有一些误导。以Davis and Goadrich (2006)中的模型为例。如图所示,左侧展示的是两个模型的ROC曲线,右侧展示的是precision-recall曲线 (PRC)。

Precision值和Recall值是既矛盾又统一的两个指标,为了提高Precision值,分类器需要尽量在“更有把握”时才把样本预测为正样本,但此时往往会因为过于保守而漏掉很多“没有把握”的正样本,导致Recall值降低。

RPC的横轴是召回率,纵轴是精准率。对于一个分类模型来说,其PRC线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精准率。整条PRC曲线是通过将阈值从高到低移动而生成的。

上图是PRC曲线样例图,其中实线代表模型A的PRC曲线,虚线代表模型B的PRC曲线。原点附近代表当阈值最大时模型的精准率和召回率 (阈值越大,鉴定出的样品越真,能鉴定出的样品越少)。

模型1 (Curve 1)的AUC值为0.813, 模型2 (Curve 2)的AUC值为0.875, 从AUC值角度看模型2更优一点。但是右侧的precision-recall曲线却给出完全不同的结论。模型1 (precision-recall Curve 1)下的面积为0.513,模型2 (precision-recall Curve 2)下的面积为0.038。模型1在较低的假阳性率(FPR<0.2)时有较高的真阳性率。

我们再看另一个关于ROC曲线误导性的例子 Fawcett (2005). 这里有两套数据集:一套为平衡数据集(两类分组为1:1关系),一套为非平衡数据集(两类分组为10:1关系)。每套数据集分别构建2个模型并绘制ROC曲线,从Fig \ref(fig:rocprbalanceimbalance) a,c 可以看出,数据集是否平衡对ROC曲线的影响很小。只是在两个模型之间有一些差别,实线代表的模型在假阳性率较低时 (FPR<0.1)真阳性率低于虚线代表的模型。但precision-recall curve (PRC)曲线却差别很大。对于平衡数据集,两个模型的召回率 (recall)和精准率precision都比较好。对于非平衡数据集,虚线代表的分类模型在较低的召回率时就有较高的精准率。

因此,Saito and Rehmsmeier (2015)推荐在处理非平衡数据集时使用PRC曲线,它所反映的信息比ROC曲线更明确。

我们对前面5个模型计算下AUPRC,与AUC结果基本吻合,up效果最好,其次是weighted, smote, downoriginal。值得差距稍微拉大了一些。

library("PRROC")
calc_auprc <- function(model, data){index_class2 <- data$Class == minorityClassindex_class1 <- data$Class == majorityClasspredictions <- predict(model, data, type = "prob")pr.curve(predictions[[minorityClass]][index_class2],predictions[[minorityClass]][index_class1],curve = TRUE)}# Get results for all 5 modelsmodel_list_pr <- model_list %>%map(calc_auprc, data = imbal_test)model_list_pr %>%map(function(the_mod) the_mod$auc.integral)

计算的AUPRC值如下(越大越好)

## $original
## [1] 0.5155589
##
## $weighted
## [1] 0.640687
##
## $down
## [1] 0.5302778
##
## $up
## [1] 0.6461067
##
## $SMOTE
## [1] 0.6162899

我们绘制PRC曲线观察各个模型的分类效果。基于选定的分类阈值,up samplingweighting有着最好的精准率和召回率 (单个分组的准确率)。而原始分类器则效果最差。

假如加权分类器在召回率 (recall)为75%时,精准率可以达到50% (下面曲线中略低于50%),则F1得分为0.6

原始分类器在召回率为75%时,精准率为25% (下面曲线略高于25%),则F1得分为0.38

也就是说,当构建好了这两个分类器,并设置一个分类阈值 (不同模型的阈值不同)后,都可以在样品少的分组中获得75%的召回率。但是对于加权模型,有50%的预测为属于样品少的分组的样品是预测对的。而对于原始模型,只有25%预测为属于样品少的分组的样品是预测对的。

# Plot the AUPRC curve for all 5 modelsresults_list_pr <- list(NA)
num_mod <- 1for(the_pr in model_list_pr){results_list_pr[[num_mod]] <- data_frame(recall = the_pr$curve[, 1],precision = the_pr$curve[, 2],model = names(model_list_pr)[num_mod])num_mod <- num_mod + 1}results_df_pr <- bind_rows(results_list_pr)results_df_pr$model <- factor(results_df_pr$model, levels=c("original", "down","SMOTE","up","weighted"))# Plot ROC curve for all 5 modelscustom_col <- c("#000000", "#009E73", "#0072B2", "#D55E00", "#CC79A7")ggplot(aes(x = recall,  y = precision, group = model), data = results_df_pr) +geom_line(aes(color = model), size = 1) +scale_color_manual(values = custom_col) +geom_abline(intercept =sum(imbal_test$Class == minorityClass)/nrow(imbal_test),slope = 0, color = "gray", size = 1)  +theme_bw(base_size = 18) + coord_fixed(1)

基于AUPRC进行调参,修改参数summaryFunction = prSummarymetric = "AUC"。参考https://topepo.github.io/caret/measuring-performance.html (或者看之前的推文)。

# Set up control function for training
ctrlprSummary <- trainControl(method = "repeatedcv",number = 10,repeats = 5,summaryFunction = prSummary,classProbs = TRUE)# Build a standard classifier using a gradient boosted machineset.seed(5627)
orig_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,metric = "AUC",trControl = ctrlprSummary)# Use the same seed to ensure same cross-validation splits
ctrlprSummary$seeds <- orig_fit$control$seeds# Build weighted modelweighted_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,weights = model_weights,metric = "AUC",trControl = ctrlprSummary)# Build down-sampled modelctrlprSummary$sampling <- "down"down_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,metric = "AUC",trControl = ctrlprSummary)# Build up-sampled modelctrlprSummary$sampling <- "up"up_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,metric = "AUC",trControl = ctrlprSummary)# Build smote model
ctrlprSummary$sampling <- "smote"smote_fit2 <- train(Class ~ .,data = imbal_train,method = "gbm",verbose = FALSE,metric = "AUC",trControl = ctrlprSummary)model_list2 <- list(original = orig_fit2,weighted = weighted_fit2,down = down_fit2,up = up_fit2,SMOTE = smote_fit2)

评估下基于prSummary调参后模型的性能,SMOTE处理后的模型效果有提升,其它模型相差不大。

model_list_pr2 <- model_list2 %>%map(calc_auprc, data = imbal_test)model_list_pr2 %>%map(function(the_mod) the_mod$auc.integral)

计算的AUPRC值如下(越大越好)

## $original
## [1] 0.5155589
##
## $weighted
## [1] 0.640687
##
## $down
## [1] 0.5302778
##
## $up
## [1] 0.6461067
##
## $SMOTE
## [1] 0.6341753

绘制PRC曲线

# Plot the AUPRC curve for all 5 modelsresults_list_pr <- list(NA)
num_mod <- 1for(the_pr in model_list_pr2){results_list_pr[[num_mod]] <- data_frame(recall = the_pr$curve[, 1],precision = the_pr$curve[, 2],model = names(model_list_pr)[num_mod])num_mod <- num_mod + 1}results_df_pr <- bind_rows(results_list_pr)results_df_pr$model <- factor(results_df_pr$model, levels=c("original", "down","SMOTE","up","weighted"))# Plot ROC curve for all 5 modelscustom_col <- c("#000000", "#009E73", "#0072B2", "#D55E00", "#CC79A7")ggplot(aes(x = recall,  y = precision, group = model), data = results_df_pr) +geom_line(aes(color = model), size = 1) +scale_color_manual(values = custom_col) +geom_abline(intercept =sum(imbal_test$Class == minorityClass)/nrow(imbal_test),slope = 0, color = "gray", size = 1)  +theme_bw(base_size = 18) + coord_fixed(1)

PRCAUPRC是处理非平衡数据集的有效衡量方式。基于AUC指标来看,权重和重采样技术只带来了微弱的性能提升。但是这个改善更多体现在可以在较低假阳性率基础上获得较高真阳性率,模型的性能更均匀提升。在处理非平衡样本学习问题时,除了尝试调整权重和重采样之外,也不能完全依赖AUC值,而是依靠PRC曲线联合判断,以期获得更好的效果。

References

http://pages.cs.wisc.edu/~jdavis/davisgoadrichcamera2.pdf

http://people.inf.elte.hu/kiss/11dwhdm/roc.pdf

http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0118432

https://dpmartin42.github.io/posts/r/imbalanced-classes-part-2

https://zhuanlan.zhihu.com/p/64963796

机器学习系列教程

从随机森林开始,一步步理解决策树、随机森林、ROC/AUC、数据集、交叉验证的概念和实践。

文字能说清的用文字、图片能展示的用、描述不清的用公式、公式还不清楚的写个简单代码,一步步理清各个环节和概念。

再到成熟代码应用、模型调参、模型比较、模型评估,学习整个机器学习需要用到的知识和技能。

  • 一图感受各种机器学习算法

  • 机器学习算法 - 随机森林之决策树初探(1)

  • 机器学习算法-随机森林之决策树R 代码从头暴力实现(2)

  • 机器学习算法-随机森林之决策树R 代码从头暴力实现(3)

  • 机器学习算法-随机森林之理论概述

  • 机器学习算法-随机森林初探(1)

  • 机器学习 - 随机森林手动10 折交叉验证

  • 机器学习 模型评估指标 - ROC曲线和AUC值

  • 机器学习 - 训练集、验证集、测试集

  • 一个函数统一238个机器学习R包,这也太赞了吧

  • 基于Caret和RandomForest包进行随机森林分析的一般步骤 (1)

  • Caret模型训练和调参更多参数解读(2)

  • 基于Caret进行随机森林随机调参的4种方式

  • 机器学习第17篇 - 特征变量筛选(1)

  • 机器学习第18篇 - Boruta特征变量筛选(2)

  • 机器学习第19篇 - 机器学习系列补充:数据集准备和更正YSX包

  • 机器学习第20篇 - 基于Boruta选择的特征变量构建随机森林

  • 机器学习第21篇 - 特征递归消除RFE算法 理论

  • 机器学习第22篇 - RFE筛选出的特征变量竟然是Boruta的4倍之多

  • 机器学习第23篇 - 更多特征变量却未能带来随机森林分类效果的提升

  • 机器学习相关书籍分享

  • UCI机器学习数据集

  • 送你一个在线机器学习网站,真香!

  • 多套用于机器学习的多种癌症表达数据集

  • 这个统一了238个机器学习模型R包的参考手册推荐给你

  • 莫烦Python机器学习

  • 机器学习与人工智能、深度学习有什么关系?终于有人讲明白了

  • 一套完整的基于随机森林的机器学习流程(特征选择、交叉验证、模型评估))

  • 随机森林预测发现这几个指标对公众号文章吸粉最重要

  • 样本分布不平衡,机器学习准确率高又有什么用?

  • 值得思考,机器学习模型做出的决策是你想要的吗?

  • 33万字!深度学习笔记在线版发布!

往期精品(点击图片直达文字对应教程)

机器学习

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

ROC和AUC也不是评估机器学习性能的金标准相关推荐

  1. 机器学习分类问题指标评估内容详解(准确率、精准率、召回率、F1、ROC、AUC等)

    文章目录 前言 一.混淆矩阵(confusion matrix) 二.准确率,精准率,召回率,F1分数 1. 准确率(Accuracy) 2. 精确率(Precision) 3. 召回率(Recall ...

  2. 机器学习 - 模型评估(TPR、FPR、K1、ROC、AUC、KS、GAIN、LIFT、GINI、KSI)

    以下内容多为个人理解,如有不当之处,欢迎指正! 1. 混淆矩阵 一个二分类模型,是对现实情况的一种预测.如病例(阴性/阳性.有病/没病).邮件(垃圾邮件/非垃圾邮件)等.以病例为例,对于一个患者,存在 ...

  3. 机器学习模型评估指标ROC、AUC详解

    我是小z ROC/AUC作为机器学习的评估指标非常重要,也是面试中经常出现的问题(80%都会问到).其实,理解它并不是非常难,但是好多朋友都遇到了一个相同的问题,那就是:每次看书的时候都很明白,但回过 ...

  4. 机器学习笔记 - IOU、mAP、ROC、AUC、准确率、召回率、F分数

    一.什么是交并比? 1.交并比(IOU)概述 交并比(Intersection over Union) 是一种评估指标,用于衡量目标检测器在特定数据集上的准确性.任何提供预测边界框作为输出的算法都可以 ...

  5. 【Pytorch-从一团乱麻到入门】:3、模型效果评估指标:ROC、AUC、precision、recall

    在构建模型中,我们经常会用到AUC.ROC等指标来进行模型效果评估 ROC全称是"受试者工作特征"(Receiver Operating Characteristic).ROC曲线 ...

  6. 机器学习:性能度量篇-Python利用鸢尾花数据绘制ROC和AUC曲线

    文章目录 前言 一.ROC与AUC 1.ROC 2.AUC 二.代码实现 总结 前言 内容接上一篇机器学习:性能度量篇-Python利用鸢尾花数据绘制P-R曲线_fanstuck的博客-CSDN博客_ ...

  7. R语言glm拟合logistic回归模型:模型评估(模型预测概率的分组密度图、混淆矩阵、准确率、精确度、召回率、ROC、AUC)、PRTPlot函数获取logistic模型最优阈值(改变阈值以优化)

    R语言glm拟合logistic回归模型:模型评估(模型预测概率的分组密度图.混淆矩阵.Accuray.Precision.Recall.ROC.AUC).PRTPlot函数可视化获取logistic ...

  8. 评估指标:ROC,AUC,Precision、Recall、F1-score

    一.ROC,AUC ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣 . ROC曲线一般的 ...

  9. 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC

    ROC 上回我们提到,ROC曲线就是不同的阈值下,以下两个变量的组合(如果对Sensitivity和Specificity两个术语没有概念,不妨返回,<分类模型的性能评估--以SAS Logis ...

最新文章

  1. 操作系统学习笔记 第一章:操作系统概述(王道考研)
  2. 肢解“文件夹图标”病毒,制作专杀工具——“郑大扫帚”
  3. Spring Boot 应用系列 5 -- Spring Boot 2 整合logback
  4. 《孙鑫老师谈如何学好编程》摘要
  5. 用 FastJSON 将 JSON 字符串转换为 Map
  6. 20170623_oracle_SQL
  7. DedeCMS 批量删除垃圾注册用户和垃圾文档
  8. uci数据集_有关葡萄酒质量的数据分析
  9. 一些有价值的工作建议
  10. 【Django 2021年最新版教程16】pycharm model模型修改之后如何同步更新到mysql数据库
  11. Git merge分支到master
  12. 从一个广告读懂华为云
  13. 7-10 黑洞数(20 分)
  14. wav音频文件头解析
  15. Markdown图片居中、文字居中
  16. KLayout学习记录(一)
  17. jpg照片怎么压缩?改变jpg文件大小?
  18. 广和通NL668的4G通讯随笔测试
  19. [k8s]gosu使用
  20. 日语的敬他语、自谦语和郑重语

热门文章

  1. 作者:洪文兴(1980-),男,厦门大学自动化系副教授,厦门信息产业与信息化研究院执行院长。...
  2. 作者:黄伟(1964-),男,博士,西安交通大学管理学院教授、博士生导师、院长...
  3. 【软件工程】软件复用
  4. 【算法分析与设计】习题分享
  5. 小A点菜(洛谷P1164题题解,Java语言描述)
  6. 【Windows】Windows10-Telnet的使用
  7. 全连接网络和卷积网络实践
  8. jQuery两把利器
  9. mysql8双机热备高可用配置
  10. 【Unity】UGUI无法修改字体大小