算法原理
XGB(extreme gradient boosting)是GBDT的一种工业实现,也是通过不断增加新树,拟合伪残差去降低损失函数。其拟合过程是使用的损失函数的二阶泰勒展开,这是和GBDT的一个区别。
损失函数
分裂结点算法
- 精确的贪心法
枚举,时间开销大 - 近似的贪心
正则化
叶子节点数和叶节点权重
对缺失值处理
XGB中允许缺失值存在。在找分裂点时,不遍历迭代缺失样本,减少计算,分配样本时,缺失的样本同时分到左右子树,计算哪边的增益大就自动分到哪边去。但在测试时如果遇到缺失值,会分到右子树。
优缺点
优点(快速高效可容错)
- 支持线性分类器(相当于引入L1 L2正则惩罚项的LR和线性回归,目标函数公式=误差平方和+正则项,似LR)
- 代价函数用了二阶Talor展开,引入一阶导和二阶导,提高模型拟和的速度(损失函数:一个样本的误差;代价函数:整个训练集上所有样本误差的平均;目标函数:代价函数 + 正则化项)
- 可以给缺失值自动划分方向;
- 同RF,支持样本(行)随机抽取,也支持特征(列)随机抽取,降低运算,防过拟合;
- 代价函数引入正则化项,控制模型(树)复杂度,
正则化项包含全部叶子节点个数,每个叶子节点得分的L2模的平方和(代表叶子节点权重的影响)
从贝叶斯(先验累积思想)方差角度考虑,正则降低了模型的方差,防过拟和; - 每次迭代后为叶子分配结合学习速率,减低每棵树权重,减少每棵树影响,灵活调整后面的学习空间;
- 支持并行,不是树并行,是把特征值先预排序,存起来,可以重复并行使用计算分裂点;
- 分裂依据分开后与未分前的差值增益,不用每个节点排序算增益,减少计算量,可以并行计算;
- 可以引入阈值限制树分裂,控制树的规模。
缺点:
- 容易过拟合;
- 调参困难。
应用场景
分类,回归
sklearn参数
- learning_rate:学习率
- n_estimators:多少棵树
- max_depth=5:树最大深度
- min_child_weight:最小权重系数
- gamma=0:惩罚系数(力度)
- lambda:正则化
- alpha:正则化
- subsample:随机选样本的比例
- colsample_bytree:随机选特征
- objective = 'binary:logistic':损失函数loss function,求这个函数的一阶二阶导
- scale_pos_weight:要不要指定一个均衡的树
- seed=7 #随机种子,每次复现都是一样的