Kaggle中的大杀器,XGboost算法

Hi,大家好,我是晨曦
今天这期推文也是来自于一个小伙伴的约稿,这位小伙伴最近被老板建模的要求所push,所以来找到晨曦询问了一些内容
A同学:曦曦,我只会R语言,有没有一种看上去很高大上的模型而且可以只基于R,而且还要性能优秀,最最重点的是我可以学会
晨曦:那么XGboost应该可以满足你的要求
作为机器学习领域的爱好者,越学习越发现,一个工具的局限性在一开始就已经注定,尽管我们现在拥有mlr3包和tidymodels包这两个划时代的体系,但是作为R语言的爱好者也不得不承认在某一方面,从深度学习来讲,还是Python更加的方便,因为不管是keras包还是新出现的tyorch包,前者依旧是基于python,只不过换了一个前端,而后者虽然完全基于R语言,但是代码却没有那么的简单,下面是晨曦的粗浅理解,绝非引战,欢迎各位小伙伴在评论区留言
在R语言进行统计以及除了神经网络以外的机器学习还有生信分析是完全没有问题的,Python在深度学习和单细胞高阶分析中有着一定的优势
那么接下来我们就来看一下可以被称为R语言中模型构建的伪天花板,集成学习的一大代表——XGboost算法
背景知识
其实如果说要理解XGboost的整个来龙去脉,晨曦建议各位小伙伴去阅读陈天奇老师的原始文献,但是我们作为使用者,往往并不需要太多复杂的数学知识,所以这里晨曦将用自己的理解为各位小伙伴串讲XGboost
问题1:什么是集成学习?
所谓的集成学习其实是为了解决一个问题,就是单独学习器并不能很好的去完成我们的任务,举个例子,决策树算法基于贪婪原则容易过拟合,我们通过集成学习中的bagging技术就可以构建随机森林,其基学习器依旧是一个个决策树,目前来说集成学习包括三大技术:bagging、boosting以及stacking,bagging技术中最具代表的就是随机森林,而boosting中具有代表的就是XGboost,简单理解就是通过汇集多个同质弱学习器达到增强模型性能减少偏差的作用
问题2:XGboost是什么?
XGBoost的基础是梯度提升算法。梯度提升(Gradient boosting)是构建预测模型的最强大技术之一,它是集成算法中提升(Boosting)的代表算法。集成算法通过在数据上构建多个弱 评估器,汇总所有弱评估器的建模结果,以获取比单个模型更好的回归或分类表现。弱评估器被定义为是表现至少比随机猜测更好的模型,即预测准确率不低于50%的任意模型
接下来,我们再来多说一些XGboost的推导,当然因为晨曦本人的数学基础并不是十分的扎实,所以这里仅仅从临床工作者的角度出发,理解占大多数,推导很少,不感兴趣的小伙伴可以直接跳到代码实战部分
在训练XGboost模型之前我们需要有一个目标函数,也就是说有一个初始的模型基础,我们可以简单把目标函数定义为:
这个数学公式有两部分组成,第一部分为损失函数,其目的是为了防止模型欠拟合(评估预测值和实际值之间的情况),第二部分为正则化函数,其目的是为了防止模型过拟合对损失函数的参数进行惩罚,防止模型过拟合
目标函数可以解释为对新一轮模型和上一轮模型的预测的“残差”进行学习的过程,那么实际上我们的优化目标就是找到最优的f(x)使得目标函数最小
后续就可以通过一系列数学计算得到这个最小的目标函数,完成整个模型的构建,但是对于我们使用来说,其实只需要了解XGboost的使用条件、超参数配置、以及一些浅浅的理论即可
代码实战
library(tidyverse)library(mlr3)#https://mlr3book.mlr-org.com/basics.html#taskslibrary(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. 想白嫖单细胞生信文章?这五大源头数据库,是你发文章的源泉!高频预警!你一定要收藏!
2. 盘活国自然的新思路!你研究的热点真的是热点吗?大数据帮你定位!
3. 好家伙!90%以上审稿人都会问到的问题,今天帮你解决!就是这么齐齐整整!
4. 没想到!生信分组还有这个大坑!你被坑过吗?!
5. 关于富集分析这件事,我有话想说。。。
6. 好御好高级!CNS级别美图是如何炼成的?看这篇就懂了!
7. 化繁为简!一文帮你彻底搞懂机器学习!想发高分文章,这篇是基础!
8. 你不知道的机器学习算法!关键时候能救命!
9. 致命!芯片&测序的联合到底能不能联合分析?审稿人最爱用这刁难你!
10. 躲不过的树!80%的生信SCI中都见过它!你真的搞懂了吗?
11. Python or R? 哪个更适用于生信发文章?深入浅出给你讲透!
12. 生信和抖音是一样的算法原理?不仅让你成瘾,也能发高分文章!
13. 跟3-5分SCI相比,CNS里的生信玩的可太花了!其实简单的离谱!
14. 揭秘!小鼠和人的免疫浸润分析有何区别?看这篇就够了!
15. 临床预测模型中的宠儿!最常见的机器学习 算法,没有之一!直接拿来用 !
16. 临床预测模型评价,不只有ROC,这个指标你遗漏了吗?
17. 肺肿瘤机器学习模板奉上!还不赶快产出2022年的你的第一篇SCI?!
晨曦单细胞文献阅读系列传送门

1. 非肿瘤单细胞分析模板已到位!眼馋单细胞的小伙伴快来看!手把手教你产出第一篇单细胞SCI!

晨曦单细胞笔记系列传送门
晨曦从零开始学画图系列传送门
1. 看完这篇,彻底掌握生信画图精髓!超级实用,我不许你不知道!
2. 想让SCI看上去更高逼格?这些绘图技巧你一定要知道!
3. 3min掌握SCI配色神技,学会你就是组会汇报上最靓的仔!
晨曦单细胞数据库系列传送门

END

撰文丨晨   曦
排版丨四金兄
主编丨小雪球
欢迎大家关注解螺旋生信频道-挑圈联靠公号~
继续阅读
阅读原文