分享

XGBoost模型参数释义

 Memo_Cleon 2024-04-16 发布于上海

公司在招聘面试候选人时,面试的人一般是HR、小组主管和部门经理,过程可以分为两种形式。

第一种形式是三位面试官分别单独面试候选人,问的问题可能相同也可能不同,面试官会根据候选人的表现分别给出结论,最后综合三位的结论来决定录用与否。这就是Bagging
BaggingBootstrap AGGragatING缩写而来,是并行式集成学习方法的著名代表。它基于自助抽样法(bootstrap sampling)来获得多个采样集,每个采样集独立地训练出一个基学习器,然后对所有基学习器的预测结果进行投票或者平均来获得最终的结果。Bagging的典型代表是Random Forests
第二种形式是群面。HR、小组主管和部门经理同时参加了面试,HR先问了几个问题,小组主管根据候选人对HR的回应问了另外一些问题,最后部门经理在小组主管问题的基础上问了其他一些问题。最后综合三位面试官对候选人的打分决定录取或不录取。这就是Boosting
Boosting是一种可将弱学习器提升为强学习器的串行集成学习算法。“[周志华,机器学习]先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器。如此重复进行,直至基学习器数目达到事先指定的值,最终将这些基学习器进行加权结合”。Boosting的典型代表有AdaBoostGBDT系列(XGBoostLightGBMCatBoost)。GBDT梯度提升决策树(Gradient Boosting Decision TreeGBDT也叫MARTMultiple Additive Regression Tree,如果是回归任务则被称为梯度提升回归树(Gradient Boosting Regression Tree。不同的Boosting算法调整分布的方法是不同的,比如AdaBoost算法,在每一轮迭代中都会更新样本的权重,将学错样本的权重调高,而在GBDT中则是更新回归目标,将新一轮迭代模型的损失函数的负梯度作为新一轮的标签训练出一个新的弱分类器,最终实现模型的更新当损失函数为平方损失函数的时候,当前模型损失函数的负梯度值刚好等于残差,此时每一轮建立的新的基学习器都在减少残差。梯度是一种数学概念(一个矢量,其方向上的方向导数最大,其大小正好是此最大方向导数),一个函数的梯度方向是函数上升最快的方向,负梯度方向是函数下降最快的方向。
与并行的Bagging的不同在于,Boosting一个接一个的来训练基学习器(串行),每一个基学习器都是在修正前面学习器偏差的基础上给出决策,后一个模型参数设置需要前一轮模型预测结果。Bagging采用的是有回放的Bootstrap自主抽样来从原始数据集中选出每一轮迭代的训练集,不同的训练集之间是相对独立的,而Boosting每一轮的训练集并没有发生变化,只是训练集中每个个案在不同的基学习器中的权重在更新。Bagging的训练集中,每个样本的权重是相同的,每个基学习器在最终决策中权重也是一样的,但Boosting的训练集中每个样本的权重不同(偏差越大权重越大),而且可以让每个基学习器在最终决策中权重也不一样(分类误差越小权重越大)。
XGBoost模型(XGBoosteXtreme Gradient Boosting)是基于boosting框架的一种提升树模型。直接跳过GBDT来理解XGBoost确实不是一件容易的事情,此次笔记通过释义xgboost::xgb.train函数的各种参数来理解XGBoost模型的算法。其后用一个示例来实操演示一下过程。
xgboost::xgb.train提供了三种基学习器:树提升器、线性提升器和基于深度神经网络的dropout 技术的提升树模型。其中树模型是最为常用的基学习器。
树模型结构的基本概念:

节、节点(Node):树模型中满足某个标准的一个个案的群体;

分枝(Split):种树时依据某种原则选择分类属性和拆分点将样本分为不同亚群;

边(Edge):父结点指向子结点的连线;

根节点(Root Node):树的起始点(包括所有个案),根节点没有父节点;

叶节点(Leaf Node:树的终止节点,叶节点没有子节点;

节点的度(Degree):结点的子结点个数,二叉树的度最大为2

节点的层(Level):根结点的层为1  ,根结点的子结点的层为 2……

节点的高度(Height):离该结点最远的叶结点到该结点所经过的边的数量;

节点的深度(Depth):根结点到该结点所经过的边的数量;

树的深度Depth:等于树的高度,根结点到离根结点最远的叶结点所经过的边的数量

机器学习的最基本术语:

在传统的医学统计中,样本(Samp1e)指的是从总体(Population)中随机抽取的部分观察单位(Observed unit),这里的观察单位是统计研究的基本单位,即个体/个案(IndividualCase)。但在机器学习领域,样本(Samp1e)或示例 (Instance)描述的却是个体。另外传统医学统计中的自变量(Independent variable ,也称解释变量、预测变量)在机器学习领域称为属性(Attribute)或特征Feature),而传统医学统计中的因变量(Dependent variable应变量、被解释变量、响应/反应变量、结局变量)在机器学习领域则称为标签(label)。

XGBoost模型理论介绍及介绍PPT来自xgboost算法的发明者陈天奇

Tianqi Chen,Carlos Guestrin.XGBoost: A Scalable Tree Boosting.System. https://github.com/dmlc/xgboost.

Tianqi Chen.Introduction to Boosted Trees.

Tianqi Chen’s PPT2014 from http://www./

如网络受限,可从留言中提供的地址下载。

eXtreme Gradient Boosting Training函数(xgboost包):

xgb.train(params=list(),data,nrounds,watchlist=list(),obj=NULL,feval=NULL,verbose=1,print_every_n=1L,early_stopping_rounds=NULL,maximize=NULL,save_period=NULL,save_name="xgboost.model",xgb_model=NULL,callbacks=list(),...)

xgboost(data=NULL,label=NULL,missing=NA,weight=NULL,params=list(),nrounds,verbose=1,print_every_n=1L,early_stopping_rounds=NULL,maximize=NULL,save_period=NULL,save_name="xgboost.model",xgb_model=NULL,callbacks=list(),...)

注:参数中的下划线“_”也可以使用点“.”来替换。xgb.train是一个用于训练XGBoost模型的高级函数,xgboost函数则是xgb.train的一个更简单的包装器。

函数的各项参数释义:

params:参数列表。主要包括三类:通用参数(General Parameters)、提升器参数(Booster Parameters)和任务参数(Task Parameters)。通用参数主要选择基学习器类型,如树模型还是线性模型;提升器参数针对选择的基学习器进行的设置;学习任务参数主要是指定训练模型的损失函数,使用验证集做模型评估时指定评价指标等。参数详情介绍可参考xgboost包帮助文件XGBoost文件[https://xgboost./en/latest/parameter.html]

[1]通用参数

  • booster选择基学习器,gbtree(默认,树提升器。详细介绍见2.1)、gblinear(线性提升器。详细介绍见2.3)、dart(基于深度神经网络的dropout 技术的提升树。详细介绍见2.2);

  • device:指定运行设备CPUcpu,默认)还是GPUcuda),这个参数应该是为建立需要复杂运算的大模型准备的,只是建立一个小临床模型其实默认就好;
  • verbosityXGBoost打印运行信息的详细程度。0不打印、1打印warning级别的信息、2打印info级别的信息、3打印debug级别的信息。默认是1
  • validate_parameters:设置为true时,XGBoost将对输入参数进行验证,以检查是否使用了参数,如存在未知参数时会发出警告;
  • nthread指定XGBoost运行时的并行线程的数量,默认为最大可用线程数;
  • disable_default_eval_metric是否禁用模型默认的评价指标,1或者true表示禁用,默认false

[2]提升器参数

2.1 gbtree参数
提升树集成模型与回归树:
注:XGBoost集成模型由K个可加性函数组成。上述表达式中的y^i表示的是整个集成模型对某个个案i的估计值。这里的可加函数就是基学习器,XGBoost的基学习器常用树模型,也可以是线性模型。当采用树模型时,XGBoost是基于回归树的集成算法,单棵树是回归树而不是分类树。回归树跟决策树具有相同的决策规则,不同的是回归树的每个叶节点输出是一个分值(Score),而不是一个标签(label,结局)。从这个角度理解,回归树就是一个将属性映射到叶节点Score值的函数,其参数有两部分,一部分是叶节点索引函数q(结构部分),其作用是将属性映射到具体的某个叶节点上,即预测结果应该属于哪一个叶节点;第二部分是该叶节点的输出权重值w(权重部分),即前面说的Socre值,输出权重值是一个长度为T的的一维向量(T是树叶节点的的数目)。回归树通过这个预测分值实现回归、分类、排序等目的,实现什么样的目的取决于如何定义目标函数。

Additive Training (Boosting)

注:y^(t)i表示第t轮迭代后的集成模型对个体i的估计值,并不是第t树单独的预测结果。一个由K棵树组成的XGBoost集成模型,经过了K轮提升迭代。每次迭代过程中都会新生成一棵树加入到当前模型中,更新已有的模型(即所谓的Additive training或者叫Boosting)。经过t轮迭代的模型(当前模型)预测结果=前面经过t-1轮迭代的模型预测结果+t棵提升树的输出结果。“前面经过t-1轮迭代的模型”是已经优化好的确定模型,“t棵提升树的输出结果”是第t棵树的叶节点输出值。每轮迭代的结果是对集成模型的一次提升,t颗树只是当前模型的一个“子模型”,其构造就是为了减少前t-1轮迭代后仍可能存在的误差。每棵树(每个函数)贡献的只是一个增量,最终模型等于每次迭代增量的累加和。

目标函数与模型复杂度:

注:XGBoost目标函数也就是整个模型的损失函数,由两部分组成:第一部分是传统损失函数,即训练误差,衡量模型对数据的拟合程度,鼓励低偏差(Bias);第二部分是正则化项,惩罚复杂的模型鼓励简单的模型,降低方差(Variance),从而控制模型的复杂程度防止过拟合。

每一轮迭代的任务就是寻找一个使目标函数降低最大的函数ft(xi)[注:函数ft(xi)就是第t棵提升树]。由于在构造第t颗树的时候,前t-1轮迭代的模型都已经是确定好的,不管它们的复杂度是多少都已经是一个常数了,所以上述公式中的常数项(constant)是面经过t-1轮迭代的集成模型的复杂度(或者说t-1颗树的复杂度的累加和)。公式经泰勒二阶展开并进行一些列的变简化(模型的尽头是数学@_@,这里面的数学已经超出了笔者能讲明白的理解范围了),结果如下:

其中gihi分别为损失函数在yi(t-1)处的梯度(损失函数的一阶导数)Hessian矩阵(损失函数的二阶导数)。梯度是一种数学概念(一个矢量,其方向上的方向导数最大,其大小正好是此最大方向导数),一个函数的梯度方向是函数上升最快的方向,负梯度方向是函数下降最快的方。

树的复杂度定义:γ*叶节点数+1/2*α*L1范数+1/2*λ*L2范数2

叶节点数量越多,意味着树的分裂次数越多,树的深度越大,树越复杂。树的复杂度可以用树的深度、内部节点个数、叶子节点个数(T)、叶节点输出分值(W)等来衡量。在基学习器是CART决策树时,XGBoost复杂度可以分拆成叶节点的个数T叶节点的输出权重值w两部分。其中叶节点数量被赋予了一个权重γ(这个权重实际上是节点的拆分点的拆分阈值,见后面介绍),而叶节点的权重值则是进行了正则化。

以仅对权重进行L2正则化为例,复杂度可以简化为:

结合前面对回归树的函数定义,目标函数可以演化成(权重L2正则化):

在树结构q(x)确定后, 这一轮的目标函数其实就可以确定了下来。因为据此可以获得使前这一轮(第t轮)目标函数最小的叶结点j的最优权重值w*,以及目标函数的最小值(最优值):

其实这就是一个一元二次方程,求w等于多少时Obj最小,最小值是多少。最优权重值w*可通过损失函数的梯度和Hessian矩阵获得。目标函数的最优值也被称为结构分数structure score),表示在指定一个树的结构的时,当前这一轮的目标函数最多减少值。其值越小,结构越好。神奇之处在于最优目标函数(结构分数)竟然与权重没有一毛钱的关系。

那如何确定树的结构呢?这就是:

树的生长与剪枝:

树的生长最主要就是确定最佳的分裂属性和拆分,理论上这需要枚举所有特性上的所有可能的拆分点(精确贪婪算法),想想这种计算量都恐怖,所以还会常用一些其他的近似算法,比如先将数据分箱。

分类变量建议先进行独热编码(one-hot encoding)进行编码。

分裂后的增益Gain=分裂后-分裂前的结构分数,分裂后的结构分数等于左子树的结构分数和右子树的结构分数之和。Gain值越大,说明分裂后能使目标函数减少越多,就越好:

新的分裂不一定会使得情况变得更好,为优化这个目标(对树进行剪枝),引入了新叶子的惩罚项γ。新的分裂是否合理可以看这个分裂能否降低足够多的损失函数(结构分数)。“足够多”是多少呢?这就是γ,你可以把它理解为叶节点是否应该进一步拆分的阈值,当新的分裂带来的损失函数的减少(增益)小于这个γ值的时候就不进行分裂操作。在树的复杂度定义里,它是叶节点数量的一个权重(见前面复杂度定义),经过数学上的变换,它被赋予了新的含义:拆分阈值。最佳的γ值也就是使损失函数减少最大时的最佳分割。

提升树算法要点:

公式中的ε(上图中使用了ε的变体)是迭代提升的步长(step-size)或收缩率(shrinkage),相当于GBDT中的学习率。在Rxgboost函数中由参数eta来指定,通常设置为0.1左右,在R中则是默认0.3。这是一个收缩参数,可以理解为当前树(第t棵树)叶节点输出值的贡献率,收缩率的加入减少了每提升棵树的影响,为后面的树留下了更多的预测空间,使得提升过程更加保守稳健从而能防止模型过拟合。η值越小意味着模型需要更多的迭代次数,但需要计算量越大收敛越慢。通俗一些讲,为了避免步子过大扯着蛋(每次迈一大步很快逼近结果的方式容易过拟合),每次只迈一小步(也就是每轮的迭代中给每棵树的输出结果上乘上一个收缩率η),因为每棵树的结果都不值得你掏心掏肺的完全信任,他们只能代表真理的一部分,不过我们可以多学几棵来弥补这种不足。
  • eta步长、收缩率,相当于GBDT中的学习率,取值[0,1],默认值0.3eta是一个收缩参数,相当于在进行第t轮迭代时给当前树(第t棵树,ft(xi))叶节点输出值赋予了一个权重[参见前面gbtree介绍中的[Additive Training (Boosting)][提升树算法要点]部分]。收缩率的加入减少了每棵树的影响,使提升过程更加保守稳定从而能防止模型过拟合。η值越小意味着模型的提升轮数,但需要计算量越大;

  • gamma损失函数最小减少值。树的叶节点如果进一步分裂所要求的损失函数最小减少值,是目标函数中衡量基学习器复杂度那一部分的函数中的一个超参数,取值[0,∞),默认值0对应gbtree介绍中[树的复杂度定义:γ*叶节点数+1/2*α*L1范数+1/2*λ*L2范数2]里复杂度中的γ,本是模型复杂度参数中叶节点数量的权重,经一些列数学变化后其被赋予了新的意义:叶节点分裂的拆分阈值[注:参加gbtree介绍中[树的生长于剪枝]],新的分裂带来的损失函数的减少(增益)小于这个γ值的时候就不进行分裂操作。值越大,算法越保守,树越简单;
  • max_depth树的最大深度,取值[0,∞),默认60表示深度没有限制。值越大,树越复杂,越容易出现过拟合。tree_method设置为exact时要求非0值;
  • min_child_weight子节点的权重阈值,即节点上个案权重(Hessian矩阵)的最小值和[注:参见gbtree介绍,min_child_weight对应的是Hj值,等于h(i)的和,h(i)为个案的权重(叶节点中的样本二阶导数)]。取值[0,∞),默认为1表示叶节点上需要的最小样本量。值越大,越不容易形成叶节点,算法越保守,树越简单。如果树分枝步骤导致一个叶节点的个案权重之和小于该值,那么构建过程将放弃进一步的分枝。在线性回归任务(gblinear)中,该参数对应每个节点包含的最小样本量,而在gbtreedart中,该参数就是叶节点包含样本所有的二阶偏导数之和。该参数是预剪枝参数之一,可避免过拟合;
  • max_delta_step限制每棵树叶节点输出值的最大步长,取值[0,∞),默认0。取值为0意味着没有约束;取值为正,则它会让算法更加保守。通常不需要设置这个参数。当采用logistic回归分析类别非常不均衡的样本时该参数可能会有用。将其设置为1-10可能有助于控制更新;
  • subsample数据的采样比例,抽到的样本用于训练模型(相当于按行进行随机抽样比例)。子采样在每次提升迭代中都会进行一次。防止模型过拟合的方法之一,但该值过小可能会导致欠拟合。在使用参数eta和增加nrounds值时建议使用该参数。取值(0,1],默认值为1表示所有样本都用来建模,设置为0.5意味着XGBoost在种树之前会随机抽取一半的数据来训练树模型;
  • sampling_method:从数据集中抽取建模样本的方法。默认uniform每个个案会被等概率抽取,通常设置subsample>=0.5以获得良好结果;gradient_based需要tree_method 设置为 histdevice cuda才可用,每条数据被抽中的概率与梯度的正则化绝对值有关,该方法即使subsample低至0.1也不会损失模型精度;
  • 列抽样:colsample_bytree指定构造每棵树时列的随机采样率,每构建一棵树前都要抽取1次,树所有节点的分裂特征都从这些抽取到的特征(每列对应一个特征)中选择。取值(0,1],默认值为1表示树节点从所有的特征中进行选择。除了为整棵树随机选择建模特征,还可以为树模型选择每一级别的分裂特征,该层的节点分枝时使用这些特征,对应参数是colsample_bylevel,该参数指定的是每一层级分裂特征的采样比例,树每达到一个新的深度级别就会进行一次子这样的列采样,选择的列(特征)是从为当前树选择的列集中进行随机采样。另外,还可以在树模型的每个节点拆分前进行随机列抽样,从中最优的分裂特征,对应参数colsample_bynode,该参数是每个节点进行分裂时的特征采样率,每次进行拆分时,都会进行一次这样的列采样。列是从为当前层级选择的列集中进行子采样的, tree methodexact时不支持该参数。这三个参数的作用是相乘累积的;[注:列抽样是随机森林中的技术,目的是选择全部特征的一部分作为节点分裂属性的待选集合,可以防止模型的过拟合]
  • lambdaL2正则化的加权参数[注:参见gbtree介绍中[树的复杂度定义]的注释,Lambda对应复杂度中的的λ值]。取值[0,∞),默认值为1,值越大模型越保守;
  • alphaL1正则化的加权参数[注:参见gbtree介绍中[树的复杂度定义]的注释,alpha对应复杂度中的的α值]。取值[0,∞),默认值为0,值越大模型越保守。当α=0、λ=1时,相当于进行L2正则化;当λ=0、α=1时,相当于进行L1正则化;
  • tree_methodXGBoost模型中构建提升树的算法。具体指的是树在分枝时,对连续变量(分裂特征)选择最佳拆分点的算法。auto(同hist,默认值),exact(精确的贪心算法,枚举所有特征上所有可能得拆分点进行计算),approx(近似算法,使用分位数草图和梯度直方图的近似贪婪算法),hist(更快的直方图优化近似贪婪算法);
  • scale_pos_weight:控制阴性和阳性样本的权重,在类别不平衡时使用,一个可以考虑的典型值是阴性样本总数 / 阳性样本总数;
  • updater:用逗号分隔的字符串来定义要运行的树updater的序列,提供了一种构建和修改树的模块化方式,可以理解为函数中有一些内置的建树策略插件。这是一个高级参数,通常根据其他一些参数自动设置。可用选项有grow_colmakergrow_histmakergrow_quantile_histmakergrow_gpu_histgrow_gpu_approxsyncrefreshprune。详情可参见XGBoost文件;
  • refresh_leafupdaterrefresh的一个参数[注:updater指定为refresh表示基于当前数据刷新树的统计信息和/或叶节点的值,注意不是执行数据行的随机子采样]。默认为1表示将更新叶节点值和节点的统计信息,0仅更新节点的统计信息;
  • process_type:指定要执行的树提升过程类型(创建树、提升树)。默认创建新树的正常提升过程(default),update则表示从现有模型开始仅更新其树。每次提升迭代中从初始模型中提取一棵树,为该树运行updater参数指定的序列,并将修改后的树添加到新模型中。新模型将具有相同或更少数量的树,这取决于执行的提升迭代次数。可用的内置插件有refresh prune,当 process_type=update时不能使用创建新树的updaters
  • grow_policy:指定增加新节点的方式,仅当tree_method设置为histapprox时可用。默认是depthwise,最靠近根节点处进行拆分[注:一个属性对树的性能度量改进越大越靠近根节点]lossguide在损失函数变化最大的节点上进行拆分;
  • max_leaves:树的叶节点的最多数量,tree_methodexact时可用。默认为0表示没有限制;
  • max_bin:连续变量分拆成离散分箱的最大数量,默认256,仅当tree_method设置为histapprox时可用[注:贪心算法会枚举所有的特征以及其拆分点然后选择最佳的那个,当数据比较多时这种方法的计算量是非常惊人的。在近似算法中,选定部分候选拆分点来进行枚举并确定最佳拆分点,此时候选拆分点的选择成为关键。选取候选拆分点的首要任务是将样本分成几块(称为分箱)]
  • num_parallel_tree实验性参数,在每轮迭代期间构建的并行树的数量。此选项用于支持增强随机森林,默认值为1。其值>1意味着基学习器不再是一棵树而是随机森林。有助于通过XGBoost测试随机森林(相应参数设置为:colsample_bytree<1, subsample < 1 and round=1);
  • monotone_constraints:变量单调性约束。一个由10-1组成的数值向量,长度等于训练数据中的特征数量。1是增加,-1是减少,0没有约束。详情可参见XGBoost文件;
  • interaction_constraints:用特征索引的嵌套向量列表来指定允许交互作用的特征。每个内部列表是允许相互作用的特征的一组索引,如[[0, 1], [2, 3, 4]]表示列索引为01的特征存在交互,列索引为234的特征存在交互作用。需要注意,特征索引值应该从0开始(0标记第一列),不考虑交互项就不要指定指定改参数
  • multi_strategy:多分类结局数据目前支持Python,此处不介绍。

2.2 gblinear参数

  • lambdaL2正则化的加权参数,默认值为0,值越大模型越保守;
  • alphaL1正则化的加权参数,默认值为0,值越大模型越保守;

  • updater:拟合线性模型的算法。默认是shotgun基于shotgun算法的平行坐标下降算法coord_descent表示采用普通坐标下降算法

  • feature_selector:特征选择和排序方法。可选项有cyclicshufflerandomgreedythrifty

  • top_k:当feature_selector设置为greedythrifty时,最多选用的特征数量,默认0表示选用所有的特征。

2.3 dart参数

DARTDropouts Multiple Additive Regression TreesDropout加性回归树模型)。

XGBoost结合了大量的回归树和较小的学习率,这种情况下,相比后期添加的树,早期添加的树更为重要。为解决过拟合问题,使得最终的集成模型中各个树的贡献更加平均一些,DART构建新树时删除了一些不重要的普通树。DART利用了深度神经网络中Dropout(随机失活正则化)技巧,当计算下一棵树要拟合的负梯度时,只考虑现有集成树的一个随机子集(when computing the gradient that the next tree will fit, only a random subset of the existing ensemble is considered),或者说从现有的集成树中随机丢弃一部分树,仅用剩余的一部分树来计算下一棵树的标签(负梯度)。当将新树添加到集成模型中时,模型结果会超调,因此DART还要执行一个归一化步骤。

新构建的树以及丢弃的树都是为了减小当前模型与最佳预测器之间的差距。这里其实不太容易理解。Dropout这个动作每次迭代都会重新进行一次,这一轮迭代中没有使用的树在下一次迭代中可能又会被选中,当然也可能不会被选中。每一轮迭代中为计算下一棵树的标签而随机丢弃的树跟新生成的树一样,其生成都是采用Dropout技术来生成的,也都将是最终集成模型的一部分。经过m轮的迭代,集成模型对个体i进行预测时,仍然要使用m棵树来进行,包括构建第m棵树时随机选择的树、随机丢弃的树和第m棵树。

采用了Dropout技术的Boosting模型,假设第m轮训练中有K棵树被丢弃,则第m棵树要拟合的标签仅利用了m-1-K棵树(而不是m-1)来获得的,即第m颗树的构造减少的是m-1-K棵树的集成模型预测仍可能存在的误差。很显然,相比m-1棵树的模型(普通的Boosting模型),m-1-K棵树的模型对结局的解释更小一些,所以第m棵树的标签值更大一些。作为可加性模型,经过m轮迭代的集成模型有m棵树,包括被丢弃的K棵树、被选中用于计算第m树标签的m-1-K棵树以及第m棵树,这个包含了m棵树的集成模型对结果的预测很明显是偏大的,这可能就是文献上说的同时引入新树和丢弃的树会导致模型结果的超调(introducing both the new tree and the dropped trees will result in the model overshooting the target),所以when adding the new tree to the ensemble where DART performs a normalization step。怎么归一化呢?其实就是引入收缩因子,这就称作为归一化:

上述模型释义:假设第m轮训练中,有K棵树被丢弃,表示随机选择的用来估计第m棵树标签的那些树的集成模型的预测结果,表示被丢弃树的集成模型的预测结果(被丢弃树的叶节点输出值的加和),表示新树的叶节点输出值,η是学习率(见gbtree参数),b为新树与丢弃树的权重之比,α为修正因子

目标函数如下:

DART也可以看做是一种正则化,它是通过丢弃树的数量来控制正则化的大小。特别情况下,如果不丢弃树则DARTXGBoost没有什么不同,如果丢弃所有的树,DART与随机森林就没有区别了。

  • dart继承自gbtree提升器,因此支持 gbtree 的所有参数,比如 etagammamax_depth 。额外的参数如下:

  • sample_type:采样算法的类型。uniform(默认)随机丢弃,即等概率选择要删除的树;weighted按权重比例选择要丢弃的树;
  • normalize_type:归一化算法的类型。tree(默认)新树的权重与每棵丢弃的树的权重相同,则α=K/(K+η)forest新树的权重与丢弃树(森林)的权重之和相同,则α=1/(1+η)
  • rate_drop:丢弃率,当前要丢弃的树占当前所有树的比例。取值范围[0,1]默认为0
  • one_drop:设置为true表示dropout期间,至少有一树总是被丢弃。默认为0
  • skip_drop:不执行dropout的概率,取值范围[0,1],默认为0。如果跳过了dropout,则新树将和xgboost 相同的方式加入到模型中。

[3]任务参数

  • objective指定学习任务和相应的目标函数[注:此处的目标函数显然指定的是目标函数中的传统损失函数部分],格式是学习任务:目标函数,学习任务主要有回归、分类、排序和生存分析,每类学习任务可能会有不同的算法,每种算法对应的目标函数又不相同。比如reg:squarederror表示执行回归任务,使用平方损失作为损失函数;而binary:logistic表示执行二分类任务,加法模型的输出的是概率(通过sigmoid函数转换而来) 然后使用交叉熵作为损失函数,但默认的验证集评价指标是负对数似然。其他众多的内置学习任务:目标函数可参见xgboost包帮助文件XGBoost文件。除了这些内置的目标函数,也可以将通过参数obj将自定义的函数传递给该参数;
  • base_score所有个案的初始预测得分,用于设定一个初始的、全局偏差,默认值0.5

  • eval_metric验证数据的评估指标,可以使用多个指标[注:帮助文件上的解释是“evaluation metrics for validation data”,这里的验证数据指的是用于评估模型性能的数据集,数据集由watchlist指定。这个指标不会影响到模型的训练,它只是模型训练完成之后用来评估模型效果的一个指标]。默认值会根据目标函数会自动分配(如回归默认rmse,分类默认logloss,排序默认平均精度均值(mAP)),也可以通过参数feval自定义一个函数传递给它。众多评估指标可参见xgboost包帮助文件XGBoost文件

  • seed随机种子。R中如果不设置并不是默认为0,而是通过R自己的RNG engine来获取;

  • seed_per_iteration:通过迭代器编号确定种子PRNG。默认为false

data训练集。xgb.train需要是xgb.DMatrix对象。xgboost可以是xgb.DMatrix对象,也可以是matrix, dgCMatrix或本地数据文件;
nrounds提升轮次(迭代次数)的最大次数,也就是训练期间生成基学习器的数量;
watchlist用于评估模型性能的DMatrix数据集列表。模型在每一次迭代都会计算这些数据集的评估指标,评估指标由参数eval_metricfeval来指定。该部分的输出储存在结果对象中的evaluation_log字段中。[注:watchlistxgb.train函数的参数,在xgboost函数中也设置此参数结果会报错(Error in check.custom.obj() : Setting objectives in 'params' and 'obj' at the same time is not allowed];
obj:自定义目标函数;
feval:自定义评估函数;
verbose:显示模型性能的一些信息,0不显示,1显示模型性能信息,2额外一些信息;
print_every_nverbose>0时,每n次迭代打印1次模型迭代过程的性能信息。默认值为1表示打印所有消息;
early_stopping_rounds:指定模型性能无改善的迭代次数,达到这个标准则模型将停止训练;如设置为NULL则不触发早期停止功能;
maximize:性能度量的值是否越大越好[注:有些评估指标值越小模型性能越好,比如均方误差;而有些则越大越好比如AUC]。设置为TURE则表示该值(验证得分)越大模型性能越好。如果设置了fevalearly_stopping_rounds,则该参数必须设置;
save_period:每几次迭代就自动保存1次模型,0表示最后保存;
save_name:周期性自动保存的模型文件名称或路径;
xgb_model:先前建立的用来继续训练的模型。xgb.Booster对象或者其原始数据,或先前保存的模型名称;
callbacks:在提升过程中执行各种任务的回调函数列表。有些回调函数是根据参数值自动创建的,用户也可以提供现有的或他们自己的回调方法以定制训练过程;
label:指定结局变量。数据是本地文件或xgb.DMatrix对象时无需提供;
missing:缺失值的指示符,默认NA有时会用0或者极值来表示。该参数仅用于稠密矩阵算法;
weight:指定一个向量作为每条记录的权重。
分类变量的参数max_cat_to_onehot(是都对小于指定阈值的变量采用独热编码)和max_cat_threshold(每次拆分考虑的最大类别数)目前支持Python

END

@_@

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多