0408任务三高级算法梳理-XGB算法梳理

一、算法原理

xgboost的基础是梯度提升算法,提升法中最著名的算法包括Adaboost和梯度提升树,xgboost是由梯度提升树GBDT发展而来。梯度提升树可以有回归树和分类树,两者都是以CART树算法为主流,xgboost背后也是CART树,这意味着xgboost中所有树都是二叉树。
http://wepon.me/
上面链接是xgboost与gbdt有何不同?
XGB和GBDT核心区别:求预测值y^的方式不同。
GBDT中预测值是由所有弱分类器上的预测结果加权求和,其中每个样本上的预测结果是样本所在的叶子节点的均值。而XGB中的预测值是所有弱分类器上的叶子权重(预测分数)直接求和得到,计算叶子权重是一个复杂的过程。

xgboost算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。
在这里插入图片描述
如下图例子,训练出了2棵决策树,小孩的预测分数就是两棵树中小孩所落到的结点的分数相加。爷爷的预测分数同理。
在这里插入图片描述

二、损失函数

对于回归问题,常用损失函数是MSE:
在这里插入图片描述
对于分类问题,常用损失函数是对数损失函数:
在这里插入图片描述
在这里插入图片描述

三、分裂结点算法

https://blog.csdn.net/wangrongrongwq/article/details/86755915
https://zhuanlan.zhihu.com/p/58221959
3.1 精确的贪心法,枚举所有分割点。当数据量十分庞大,以致于不能全部放入内存时,Exact Greedy 算法就会很慢。
3.2 针对精确贪心法的不足,引入了近似的算法。简单来说,就是根据特征k的分布来确定l个候选切分点Sk={sk1,sk2,…,skl},然后根据这些候选切分点把相应的样本放入对应的桶中,对每个桶中的G,H进行累加。最后在候选切分点集合上贪心查找。
3.3 加权分位法
3.4 稀疏自适应分割策略

四、正则化

4.1 xgboost在目标函数中使用了正则化惩罚项。gama越大,越希望获得结构简单的树,因为此时对较多叶子节点的树的惩罚越大;lambda越大也是越希望获得结构简单的树。
在这里插入图片描述
4.2 同任务二中的GBDT一样,xgboost也可以加入步长(有的也叫收缩率),可防止过拟合。
在这里插入图片描述
4.3 行、列抽样
xgboost借鉴RF使用列抽样(在每一次分裂中使用特征抽样)
此外,还有行抽样(样本抽样)

五、对缺失值处理

通常情况下,人为处理缺失值的时候大多会选用中位数、均值或二者的融合来对数值型特征进行填补,使用出现次数多的类别来填补缺失的类别特征。
在xgboost模型中允许缺失值存在。
原始论文中关于缺失值的处理将其看与稀疏矩阵的处理看作一样。在寻找split point的时候,不会对该特征为missing的样本进行遍历统计**,只对该列特征值为non-missing的样本上对应的特征值进行遍历**,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性****,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。

六、优缺点

https://www.cnblogs.com/Sugar-Chl/p/10168838.html
优点:
(1)xgBoosting支持线性分类器,相当于引入L1和L2正则化项的逻辑回归(分类问题)和线性回归(回归问题);
(2)xgBoosting对代价函数做了二阶Talor展开,引入了一阶导数和二阶导数;
(3)当样本存在缺失值是,xgBoosting能自动学习分裂方向;
(4)xgBoosting借鉴RF的做法,支持列抽样,这样不仅能防止过拟合,还能降低计算;
(5)xgBoosting的代价函数引入正则化项,控制了模型的复杂度,正则化项包含全部叶子节点的个数,每个叶子节点输出的score的L2模的平方和。从贝叶斯方差角度考虑,正则项降低了模型的方差,防止模型过拟合;
(6)xgBoosting在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间;
(7)xgBoosting工具支持并行,但并不是tree粒度上的,而是特征粒度,决策树最耗时的步骤是对特征的值排序,xgBoosting在迭代之前,先进行预排序,存为block结构,每次迭代,重复使用该结构,降低了模型的计算;block结构也为模型提供了并行可能,在进行结点的分裂时,计算每个特征的增益,选增益最大的特征进行下一步分裂,那么各个特征的增益可以开多线程进行;
(8)可并行的近似直方图算法,树结点在进行分裂时,需要计算每个节点的增益,若数据量较大,对所有节点的特征进行排序,遍历的得到最优分割点,这种贪心法异常耗时,这时引进近似直方图算法,用于生成高效的分割点,即用分裂后的某种值减去分裂前的某种值,获得增益,为了限制树的增长,引入阈值,当增益大于阈值时,进行分裂;
缺点:
(1)xgBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时,LightGBM方法采用histogram算法,占用的内存低,数据分割的复杂度更低;
(2)xgBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;LightGBM采用深度优化,leaf-wise生长策略,每次从当前叶子中选择增益最大的结点进行分裂,循环迭代,但会生长出更深的决策树,产生过拟合,因此引入了一个阈值进行限制,防止过拟合.

七、sklearn参数

https://www.cnblogs.com/Sugar-Chl/p/10168838.html

  1. eta [默认 0.3]
    和 GBM 中的 learning rate 参数类似。 通过减少每一步的权重,可以提高模型的稳定性。 典型值为 0.01-0.2。

  2. min_child_weight [默认 1]
    决定最小叶子节点样本权重和。和 GBM 的 min_child_leaf 参数类似,但不完全一样。XGBoost 的这个参数是最小样本权重的和,而 GBM 参数是最小样本总数。这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。但是如果这个值过高,会导致欠拟合。这个参数需要使用 CV 来调整。

  3. max_depth [默认 6]
    和 GBM 中的参数相同,这个值为树的最大深度。这个值也是用来避免过拟合的。max_depth 越大,模型会学到更具体更局部的样本。需要使用 CV 函数来进行调优。 典型值:3-10

  4. max_leaf_nodes
    树上最大的节点或叶子的数量。 可以替代 max_depth 的作用。因为如果生成的是二叉树,一个深度为 n 的树最多生成 n2 个叶子。 如果定义了这个参数,GBM 会忽略 max_depth 参数。

  5. gamma [默认 0]
    在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma 指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。

6、max_delta_step[默认 0]
这参数限制每棵树权重改变的最大步长。如果这个参数的值为 0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。 通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的。 这个参数一般用不到,但是你可以挖掘出来它更多的用处。

  1. subsample [默认 1]
    和 GBM 中的 subsample 参数一模一样。这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-1

  2. colsample_bytree [默认 1]
    和 GBM 里面的 max_features 参数类似。用来控制每棵随机采样的列数的占比 (每一列是一个特征)。 典型值:0.5-1

  3. colsample_bylevel [默认 1]
    用来控制树的每一级的每一次分裂,对列数的采样的占比。 我个人一般不太用这个参数,因为 subsample 参数和 colsample_bytree 参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。

  4. lambda [默认 1]
    权重的 L2 正则化项。(和 Ridge regression 类似)。 这个参数是用来控制 XGBoost 的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。

  5. alpha [默认 1]
    权重的 L1 正则化项。(和 Lasso regression 类似)。 可以应用在很高维度的情况下,使得算法的速度更快。

  6. scale_pos_weight [默认 1]
    在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。

学习目标参数
这个参数用来控制理想的优化目标和每一步结果的度量方法。

  1. objective [默认 reg:linear]
    这个参数定义需要被最小化的损失函数。最常用的值有:
    binary:logistic 二分类的逻辑回归,返回预测的概率 (不是类别)。 multi:softmax 使用 softmax 的多分类器,返回预测的类别 (不是概率)。
    在这种情况下,你还需要多设一个参数:num_class(类别数目)。 multi:softprob 和 multi:softmax 参数一样,但是返回的是每个数据属于各个类别的概率。

  2. eval_metric [默认值取决于 objective 参数的取值]
    对于有效数据的度量方法。对于回归问题,默认值是 rmse,对于分类问题,默认值是 error。 典型值有:
    rmse 均方根误差、mae 平均绝对误差、logloss 负对数似然函数值、error 二分类错误率 (阈值为 0.5)、merror 多分类错误率、mlogloss 多分类 logloss 损失函数、auc 曲线下面积

  3. seed [默认 0]
    随机数的种子设置它可以复现随机数据的结果,也可以用于调整参数。

八、应用场景

分类、回归

九、Xgboost的安装

https://blog.csdn.net/dongyanwen6036/article/details/78860915

  • 方法一:以管理员的身份C:\windows\system32\cmd,右键以管理员身份打开)的打开cmd。输入pip install xgboost.
  • 方法二:以上博客提到方法。进入网址https://www.lfd.uci.edu/~gohlke/pythonlibs/
    找到xgboost(和电脑和python版本相对应。如何查找自己的python版本,打开cmd,输入python即可)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值