Task3 XGB算法梳理

文章目录

    • Task3 XGB算法梳理
      • 1. 算法原理
      • 2. 损失函数
      • 3. 分裂结点算法
      • 4. 正则化
      • 5. 对缺失值处理
      • 6. 优缺点
      • 7. 应用场景
      • 8. sklearn参数
      • 9.xgboost与传统GBDT的区别与联系

Task3 XGB算法梳理

XGBoost——机器学习(理论+图解+安装方法+python代码)

1. 算法原理

机器学习–boosting家族之XGBoost算法
xgboost原理分析以及实践
  XGBoost全名叫(eXtreme Gradient Boosting)极端梯度提升,经常被用在一些比赛中,其效果显著。它是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包。XGBoost 所应用的算法就是 GBDT(gradient boosting decision tree)的改进,既可以用于分类也可以用于回归问题中。

1.在损失函数的基础上加入了正则项。
2.对目标函数进行二阶泰勒展开。
3.利用推导得到的表达式作为分裂准确,来构建每一颗树。

  • xgboost核心部分的算法流程图如下

Task3 XGB算法梳理_第1张图片

2. 损失函数

传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。

3. 分裂结点算法

分裂节点算法

4. 正则化

5. 对缺失值处理

xgboost模型却能够处理缺失值,模型允许缺失值存在。

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

6. 优缺点

XGB算法梳理

  • 优点(快速高效可容错)

    • 支持线性分类器
      (相当于引入L1 L2正则惩罚项的LR和线性回归,目标函数公式=误差平方和+正则项,似LR)
    • 代价函数用了二阶Talor展开,引入一阶导和二阶导,提高模型拟和的速度
      (损失函数:一个样本的误差;代价函数:整个训练集上所有样本误差的平均;目标函数:代价函数 + 正则化项)
    • 可以给缺失值自动划分方向;
    • 同RF,支持样本(行)随机抽取,也支持特征(列)随机抽取,降低运算,防过拟合;
    • 代价函数引入正则化项,控制模型(树)复杂度,
    • 正则化项包含全部叶子节点个数,每个叶子节点得分的L2模的平方和(代表叶子节点权重的影响)
    • 从贝叶斯(先验累积思想)方差角度考虑,正则降低了模型的方差,防过拟和;
    • 每次迭代后为叶子分配结合学习速率,减低每棵树权重,减少每棵树影响,灵活调整后面的学习空间;
    • 支持并行,不是树并行,是把特征值先预排序,存起来,可以重复并行使用计算分裂点;
    • 分裂依据分开后与未分前的差值增益,不用每个节点排序算增益,减少计算量,可以并行计算;
    • 可以引入阈值限制树分裂,控制树的规模。
    • xgBoosting在传统Boosting的基础上,利用cpu的多线程,引入正则化项,加入剪纸,控制了模型的复杂度
    • 当样本存在缺失值是,xgBoosting能自动学习分裂方向
    • xgBoosting在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间;
  • 缺点

    • xgBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时
    • xgBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;

7. 应用场景

常见分类问题、回归问题均可使用
Kaggle竞赛

8. sklearn参数

【集成学习】sklearn中xgboost模块的XGBClassifier函数

model = XGBClassifier(
	learning_rate=0.1,		   # 学习率
	n_estimators=1000,         # 树的个数--1000棵树建立xgboost
	max_depth=6,               # 树的深度
	min_child_weight = 1,      # 叶子节点最小权重
	gamma=0.,                  # 惩罚项中叶子结点个数前的参数
	subsample=0.8,             # 随机选择80%样本建立决策树
	colsample_btree=0.8,       # 随机选择80%特征建立决策树
	objective='multi:softmax', # 指定损失函数
	scale_pos_weight=1,        # 解决样本个数不平衡的问题
	random_state=0             # 随机数
	)

9.xgboost与传统GBDT的区别与联系

xgboost原理分析以及实践

  • 区别
    1.xgboost和GBDT的一个区别在于目标函数上。
    在xgboost中,损失函数+正则项。 GBDT中,只有损失函数。
    2.xgboost中利用二阶导数的信息,而GBDT只利用了一阶导数。
    3.xgboost在建树的时候利用的准则来源于目标函数推导,而GBDT建树利用的是启发式准则。
    (这一点,我个人认为是xgboost牛B的所在,也是为啥要费劲二阶泰勒展开)
    4.xgboost中可以自动处理空缺值,自动学习空缺值的分裂方向,GBDT(sklearn版本)不允许包含空缺值。

  • 联系
    1.xgboost和GBDT的学习过程都是一样的,都是基于Boosting的思想,先学习前n-1个学习器,然后基于前n-1个学习器学习第n个学习器。(Boosting)
    2.建树过程都利用了损失函数的导数信息(Gradient),只是大家利用的方式不一样而已。
    3.都使用了学习率来进行Shrinkage,从前面我们能看到不管是GBDT还是xgboost,我们都会利用学习率对拟合结果做缩减以减少过拟合的风险。

你可能感兴趣的:(集成学习,机器学习)