临床预测模型的天花板来了!看上去高大上,今天拆开揉碎手把手教你!
Kaggle中的大杀器,XGboost算法
Hi,大家好,我是晨曦今天这期推文也是来自于一个小伙伴的约稿,这位小伙伴最近被老板建模的要求所push,所以来找到晨曦询问了一些内容
A同学:曦曦,我只会R语言,有没有一种看上去很高大上的模型而且可以只基于R,而且还要性能优秀,最最重点的是我可以学会
晨曦:那么XGboost应该可以满足你的要求
作为机器学习领域的爱好者,越学习越发现,一个工具的局限性在一开始就已经注定,尽管我们现在拥有mlr3包和tidymodels包这两个划时代的体系,但是作为R语言的爱好者也不得不承认在某一方面,从深度学习来讲,还是Python更加的方便,因为不管是keras包还是新出现的tyorch包,前者依旧是基于python,只不过换了一个前端,而后者虽然完全基于R语言,但是代码却没有那么的简单,下面是晨曦的粗浅理解,绝非引战,欢迎各位小伙伴在评论区留言
在R语言进行统计以及除了神经网络以外的机器学习还有生信分析是完全没有问题的,Python在深度学习和单细胞高阶分析中有着一定的优势
那么接下来我们就来看一下可以被称为R语言中模型构建的伪天花板,集成学习的一大代表——XGboost算法
其实如果说要理解XGboost的整个来龙去脉,晨曦建议各位小伙伴去阅读陈天奇老师的原始文献,但是我们作为使用者,往往并不需要太多复杂的数学知识,所以这里晨曦将用自己的理解为各位小伙伴串讲XGboost
所谓的集成学习其实是为了解决一个问题,就是单独学习器并不能很好的去完成我们的任务,举个例子,决策树算法基于贪婪原则容易过拟合,我们通过集成学习中的bagging技术就可以构建随机森林,其基学习器依旧是一个个决策树,目前来说集成学习包括三大技术:bagging、boosting以及stacking,bagging技术中最具代表的就是随机森林,而boosting中具有代表的就是XGboost,简单理解就是通过汇集多个同质弱学习器达到增强模型性能减少偏差的作用
XGBoost的基础是梯度提升算法。梯度提升(Gradient boosting)是构建预测模型的最强大技术之一,它是集成算法中提升(Boosting)的代表算法。集成算法通过在数据上构建多个弱 评估器,汇总所有弱评估器的建模结果,以获取比单个模型更好的回归或分类表现。弱评估器被定义为是表现至少比随机猜测更好的模型,即预测准确率不低于50%的任意模型
接下来,我们再来多说一些XGboost的推导,当然因为晨曦本人的数学基础并不是十分的扎实,所以这里仅仅从临床工作者的角度出发,理解占大多数,推导很少,不感兴趣的小伙伴可以直接跳到代码实战部分
在训练XGboost模型之前我们需要有一个目标函数,也就是说有一个初始的模型基础,我们可以简单把目标函数定义为:
这个数学公式有两部分组成,第一部分为损失函数,其目的是为了防止模型欠拟合(评估预测值和实际值之间的情况),第二部分为正则化函数,其目的是为了防止模型过拟合(对损失函数的参数进行惩罚,防止模型过拟合)
目标函数可以解释为对新一轮模型和上一轮模型的预测的“残差”进行学习的过程,那么实际上我们的优化目标就是找到最优的f(x)使得目标函数最小
后续就可以通过一系列数学计算得到这个最小的目标函数,完成整个模型的构建,但是对于我们使用来说,其实只需要了解XGboost的使用条件、超参数配置、以及一些浅浅的理论即可
library(tidyverse)
library(mlr3)
#https://mlr3book.mlr-org.com/basics.html#tasks
library(tidymodels)
library(ggplot2)
library("mlr3verse")
library(kknn)
library(paradox)#定义超参数的搜索空间
library(mlr3tuning)#用于对超参数调优
library(ggplot2)
工欲善其事必先利其器
data(Zoo,package = "mlbench")#导入数据集
zooTib <- as_tibble(Zoo)#转换成tibble格式
zooXgb <- mutate_at(zooTib,.vars = vars(-type),.funs = as.numeric)
这里需要我们注意的是Xgboost算法需要预测变量为数值型变量,所以我们需要进行转化,但是对于离散型变量,如果盲目转换可能会出现问题,因为对于离散型变脸之间距离的定性是机器学习中很看重的一点,所以如果对于离散型变量可以采用独热编码的方式,而且机器学习可以很好的处理多重共线性的问题
zooTask <- as_task_classif(zooTib, target = "type")#创建任务
lrn <- lrn("classif.xgboost")#实际上XGboost也可以处理回归任务,只不过mlr3包另外设置了处理回归的XGboost函数
lrn$param_set#获取超参数列表
XGboost的超参数有很多,但是我们并不是需要全部掌握,而且调节超参数并没有一个统一的定性,凭借的更多的是经验而不是逻辑
#定义超参数搜索空间
search_space = ps(
eta = p_int(lower = 0, upper = 1),
gamma = p_int(lower = 0, upper = 5),
max_depth = p_int(lower = 1,upper = 5),
nrounds = p_int(lower = 800,upper = 800),
subsample = p_dbl(lower = 0.5,upper = 1),
eval_metric = p_fct(c("merror","mlogloss"))
)
#eta:学习率(介于0和1之间)数值越大模型学习的越慢,可以简单理解为步伐越短,通常来说较小的值更好,较大的值可能会错过数据之间的较好的参数关系
#max_depth:每个决策树可以生长的最大深度
#min_child_weight:划分节点之前所需的最小纯度(如果节点足够纯粹,不要再次划分)
#subsample:每个决策树随机抽样(不替换)的样本比例,设置为1表示使用训练集中的所有样本(简单来说就是让样本更具代表性)
#colsample_bytree:本质来说就是对每个弱学习器进行剪枝,其实就是为了防止过拟合。如果设置了最大深度,这个超参数可以不调节
#nrouds:模型中弱学习器的数量(一般来说不要设置很大,因为容易过拟合,经验来说300以下为佳)(但是通常来说弱学习器和性能呈现一个线性趋势,也就是说我们需要根据自己的计算机性能选择。在范围内越大越好)
#gamma则是节点分裂时损失函数减小的最小值,如果为1.0,表示损失函数至少下降1.0该节点才会进行分
#eval_metric用来指定模型的评估函数,二分类主要是error、AUC、logloss。多分类主要是merror和mlogloss
下面则是基于嵌套验证的思想获得模型的最真实评价以及通过得到at变量后拟合任务一步获得模型最佳超参数配置的模型
resampling <- rsmp("cv",folds = 10)#定义内部循环重抽样
measure <- msr("classif.acc")#定义模型评价指标
evals1000 = trm("evals", n_evals = 1000)#设定调优停止阈值
tuner = tnr("random_search")#设置调优算法
at = AutoTuner$new(lrn, resampling, measure, evals1000 , tuner, search_space)#打包调优需要的参数
outer_resampling = rsmp("cv", folds = 5)
ptm <- proc.time()
rr = resample(zooTask, at, outer_resampling, store_models = TRUE)
proc.time() - ptm
注意:我们这里把调优停止阈值设置在了1000,也就是说原则上模型会进行最多1000次迭代。
我们这里简单解释一下,迭代的含义其实就是模型获得最终评价则是算作1次迭代,那么假设我们进行10折交叉验证,就会生成10个模型然后汇总得到模型的最终评价算成1次迭代,如果基于嵌套验证的思想,内部10折交叉验证,则会生成10个模型,这10个模型汇总得到最终评价代表了这组超参数搭配对应的模型评价,外部5折则是把最佳超参数组合带到5个模型中汇总得到模型性能,那么这里一共就是生成了15个模型,也就是说15个模型算作一次迭代,也就是说1000次迭代其背后代表着最多15000个模型,运行时间就比较长,而且基于随机寻找超参数的策略,迭代次数越多越好,所以这里的设置我们可以设置一个比较大的数然后挂机让电脑跑即可。
rr$aggregate(msr("classif.acc"))#模型真正的性能评价指标
#因为嵌套验证并不是获得超参数的流程,而是为了获得在最佳超参数配置下模型最真实的性能,所以这里我们只需要模型的评价指标即可
#如果我们需要让最佳超参数建模获得详细信息则需要拟合任务来触发
at$train(zooTask)#拟合任务
at$learner$param_set$values#获取最佳超参数配置
at$learner#查看XGboost的学习器情况
at$learner$model#获得最佳超参数配置的XGboost模型,然后就可以进行后面的一系列标准操作,包括预测等等
#事实上来说作为黑盒模型,我们很难从XGboost中获得一些对我们有帮助的信息
这里我们需要注意,XGboost最后相对黑盒模型,本身并不具有太好的解释性,所以想要像线性回归那样进行解释并不是一个很好的想法,我们更关注模型的性能而非可解释性,那么这里又会引入一个问题,模型的可解释性究竟什么时候是必须的?
1.
在进行基于重要决策的时候,模型的可解释性可以帮助我们了解这个模型是否具有“偏见”
2. 机器学习模型只有在可以解释时才能进⾏调试和审核
3. 当然如果我们的模型没有重大的作用其实并不需要其具有可解释性
4. 当问题被研究得很深入时,就不需要解释性了
所以综上所示我们不光了解了XGboost的常规实现逻辑以及相关的代码操作,更重要的是在机器学习的性能和可解释性上我们应该懂得如何进行取舍,相对来说,机器学习算法除了单纯的树模型以外,其解释性都不是特别优秀,但是在牺牲解释性的前提下获得了相对卓越的性能,这也是一种平衡的操作
那么,本期推文到这里就结束了,基于R来说XGboost可以说是构建模型中比较高级的操作了,各位小伙伴可以学习起来运用在自己的课题设计中,相信会给各位小伙伴带来一定的帮助
我是晨曦,我们下期再见~
参考教程
1.XGboost超参数解析:(23条消息) 数据挖掘小白系列!XGBOOST参数超详解!参数选择,顺序,值一网打尽!一天天的就知道学习的博客-CSDN博客xgboost超参数
2.XGboost论文翻译:(23条消息) XGBoost原论文阅读翻译了不起的赵队的博客-CSDN博客xgboost论文翻译
3.深入理解XGBOOST高效机器学习算法与进阶
晨曦的空间转录组笔记系列传送门
晨曦单细胞文献阅读系列传送门
1. 非肿瘤单细胞分析模板已到位!眼馋单细胞的小伙伴快来看!手把手教你产出第一篇单细胞SCI!
晨曦单细胞笔记系列传送门
晨曦单细胞数据库系列传送门
—
END—
撰文丨晨 曦
排版丨四金兄
主编丨小雪球
欢迎大家关注解螺旋生信频道-挑圈联靠公号~
关键词
数据
就是
生信
代码
决策树
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。