XGBoost
XGBoost(Extreme Gradient Boosting)全名叫极端梯度提升树,XGBoost是集成学习方法的王牌,在Kaggle数据挖掘比赛中,大部分获胜者用了XGBoost。XGBoost在绝大多数的回归和分类问题上表现的十分顶尖
最优模型的构建方法
我们在前面已经知道,构建最优模型的一般方法是最小化训练数据的损失函数。
我们用字母 L表示损失,如下式
其中,F是假设空间假设空间是在已知属性和属性可能取值的情况下,对所有可能满足目标的情况的一种毫无遗漏的假设集合。式(1.1)称为经验风险最小化,训练得到的模型复杂度较高。当训练数据较小时,模型很容易出现过拟合问题。
因此,为了降低模型的复杂度,常采用下式:
其中J(f)为模型的复杂度,式(2.1)称为
结构风险最小化
,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测
应用:
- 决策树的生成和剪枝分别对应了经验风险最小化和结构风险最小化,
- XGBoost的决策树生成是结构风险最小化的结果
XGBoost的目标函数推导
目标函数确定
目标函数,即损失函数,通过最小化损失函数来构建最优模型。
由前面可知, 损失函数应加上表示模型复杂度的正则项,且XGBoost对应的模型包含了多个CART树,因此,模型的目标函数为:
(3.1)式是正则化的损失函数;中
yi
是模型的实际输出结果,yhati
是模型的输出结果;等式右边第一部分是模型的训练误差,第二部分是正则化项,这里的正则化项是K棵树
的正则化项相加而来的。
CART树
上图为第K棵CART树,确定一棵CART树需要确定两部分,第一部分就是树的结构,这个结构将输入样本映射到一个确定的叶子节点上,记为f_k(x) 第二部分就是各个叶子节点的值,q(x)表示输出的叶子节点序号, w_q(x)表示对应叶子节点序号的值。由定义得:
树的复杂度定义
-
定义每课树的复杂度
假设我们要预测一家人对电子游戏的喜好程度,考虑到年轻和年老相比,年轻更可能喜欢电子游戏,以及男性和女性相比,男性更喜欢电子游戏,故先根据年龄大小区分小孩和大人,然后再通过性别区分开是男是女,逐一给各人在电子游戏喜好程度上打分,如下图所示:
就这样,训练出了2棵树tree1和tree2,类似之前gbdt的原理,两棵树的结论累加起来便是最终的结论,所以: - 小男孩的预测分数就是两棵树中小孩所落到的结点的分数相加:2 + 0.9 = 2.9。
- 爷爷的预测分数同理:-1 + (-0.9)= -1.9。
具体如下图所示
如下例树的复杂度表示:
目标函数推导
根据(3.1)式,共进行t次迭代的学习模型的目标函数为:
由前向分布算法可知,前t-1棵树的结构为常数
我们知道,泰勒公式的二阶导近似表示:
XGBoost的回归树构建方法
计算分裂节点
在实际训练过程中,当建立第 t 棵树时,XGBoost采用贪心法进行树结点的分裂:
从树深为0时开始:对树中的每个叶子结点尝试进行分裂;每次分裂后,原来的一个叶子结点继续分裂为左右两个子叶子结点,原叶子结点中的样本集将根据该结点的判断规则分散到左右两个叶子结点中;新分裂一个结点后,我们需要检测这次分裂是否会给损失函数带来增益,增益的定义如下:
如果增益Gain>0,即分裂为两个叶子节点后,目标函数下降了,那么我们会考虑此次分裂的结果。
那么一直这样分裂,什么时候才会停止呢
停止分裂条件判断
情况一:上节推导得到的打分函数是衡量树结构好坏的标准,因此,可用打分函数来选择最佳切分点。首先确定样本特征的所有切分点,对每一个确定的切分点进行切分,切分好坏的标准如下:
Gain表示单节点obj与切分后的两个节点的树obj之差,遍历所有特征的切分点,找到最大Gain的切分点即是最佳分裂点,根据这种方法继续切分节点,得到CART树。若 值设置的过大,则Gain为负,表示不切分该节点,因为切分后的树结构变差了。 值越大,表示对切分后obj下降幅度要求越严,这个值可以在XGBoost中设定。
情况二:当树达到最大深度时,停止建树,因为树的深度太深容易出现过拟合,这里需要设置一个超参数max_depth。
情况三:当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值,也会放弃此次分裂。这涉及到一个超参数:最小样本权重和,是指如果一个叶子节点包含的样本数量太少也会放弃分裂,防止树分的太细,这也是过拟合的一种措施。
XGBoost与GDBT的区别
- 区别一:
- XGBoost生成CART树考虑了树的复杂度,
- GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。
- 区别二:
- XGBoost是拟合上一轮损失函数的二阶导展开
- GDBT是拟合上一轮损失函数的一阶导展开
- 因此,XGBoost的准确性更高,且满足相同的训练效果,需要的迭代次数更少。
- 区别三:
- XGBoost与GDBT都是逐次迭代来提高模型性能,但是XGBoost在选取最佳切分点时可以开启多线程进行,大大提高了运行速度。
API
1 . xgboost的安装:
官网链接:https://xgboost.readthedocs.io/en/latest/
pip3 install xgboost
2 . xgboost参数介绍
xgboost虽然被称为kaggle比赛神奇,但是,我们要想训练出不错的模型,必须要给参数传递合适的值。
xgboost中封装了很多参数,主要由三种类型构成:通用参数(general parameters),Booster 参数(booster parameters)和学习目标参数(task parameters)
- 通用参数:主要是宏观函数控制;
- Booster参数:取决于选择的Booster类型,用于控制每一步的booster(tree, regressiong);
- 学习目标参数:控制训练目标的表现。
2.1 通用参数(general parameters)
- booster [缺省值=gbtree]
- 决定使用哪个booster,可以是gbtree,gblinear或者dart。gbtree和dart使用基于树的模型(dart 主要多了 Dropout),而gblinear 使用线性函数.
- silent [缺省值=0]设置为0打印运行信息;设置为1静默模式,不打印
- nthread [缺省值=设置为最大可能的线程数 并行运行xgboost的线程数,输入的参数应该<=系统的CPU核心数,若是没有设置算法会检测将其设置为CPU的全部核心数
下面的两个参数不需要设置,使用默认的就好了
- num_pbuffer [xgboost自动设置,不需要用户设置]预测结果缓存大小,通常设置为训练实例的个数。该缓存用于保存最后boosting操作的预测结果。
- num_feature [xgboost自动设置,不需要用户设置]在boosting中使用特征的维度,设置为特征的最大维度
2.2 Booster 参数(booster parameters)
Parameters for Tree Booster
eta [缺省值=0.3,别名:learning_rate] 更新中减少的步长来防止过拟合。在每次boosting之后,可以直接获得新的特征权值,这样可以使得boosting更加鲁棒。范围: [0,1]
gamma [缺省值=0,别名: min_split_loss](分裂最小loss)在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。范围: [0,∞]
max_depth [缺省值=6] 这个值为树的最大深度。 这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。设置为0代表没有限制 ,范围: [0,∞]
min_child_weight [缺省值=1]决定最小叶子节点样本权重和。XGBoost的这个参数是最小样本权重的和.当它的值较大时,可以避免模型学习到局部的特殊样本。 但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。范围: [0,∞]
subsample [缺省值=1]这个参数控制对于每棵树,随机采样的比例。减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。典型值:0.5-1,0.5代表平均采样,防止过拟合.范围: (0,1]
colsample_bytree [缺省值=1] 用来控制每棵随机采样的列数的占比(每一列是一个特征)。典型值:0.5-1范围: (0,1]
colsample_bylevel [缺省值=1] 用来控制树的每一级的每一次分裂,对列数的采样的占比。
我个人一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。范围: (0,1]lambda [缺省值=1,别名: reg_lambda]权重的L2正则化项(和Ridge regression类似)。
这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数
在减少过拟合上还是可以挖掘出更多用处的。.alpha [缺省值=0,别名: reg_alpha]权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。
scale_pos_weight[缺省值=1] 在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。通常可以将其设置为负 样本的数目与正样本数目的比值。
Parameters for Linear Booster
linear booster一般很少用到。
lambda [缺省值=0,别称: reg_lambda]
L2正则化惩罚系数,增加该值会使得模型更加保守。alpha [缺省值=0,别称: reg_alpha]
L1正则化惩罚系数,增加该值会使得模型更加保守。lambda_bias [缺省值=0,别称: reg_lambda_bias]
偏置上的L2正则化(没有在L1上加偏置,因为并不重要)
学习目标参数(task parameters)
objective [缺省值=reg:linear]
“reg:linear” – 线性回归
“reg:logistic” – 逻辑回归
“binary:logistic” – 二分类逻辑回归,输出为概率
“multi:softmax” – 使用softmax的多分类器,返回预测的类别(不是概率)。在这种情况下,你还需要多设一个参数:num_class(类别数目)
“multi:softprob” – 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。eval_metric [缺省值=通过目标函数选择]
可供选择的如下所示:
“rmse”: 均方根误差
“mae”: 平均绝对值误差
“logloss”: 负对数似然函数值
“error”: 二分类错误率。
其值通过错误分类数目与全部分类数目比值得到。对于预测,预测值大于0.5被认为是正类,其它归为负类。
“error@t”: 不同的划分阈值可以通过 ‘t’进行设置
“merror”: 多分类错误率,计算公式为(wrong cases)/(all cases)
“mlogloss”: 多分类log损失
“auc”: 曲线下的面积seed [缺省值=0]
随机数的种子 ,设置它可以复现随机数据的结果,也可以用于调整参数