xgboost算法_机器学习算法总结——XGBoost

1. 算法原理

XGBoost的基学习器除了可以是CART回归树,还可以是线性模型。下面以CART回归树 为例讨论。

模型的损失函数(一般形式):

。XGBoost在损失函数的基础上添加了正则项,则目标函数为:

  1. 目标函数的优化过程通过泰勒展开近似,以第
    步优化为例。
    泰勒公式二阶展开:

    看成
    看成

​ 其中,

​ 由于在第

是常数,所以(1)可以写成

2. 将决策树的参数代入目标函数

:每个样本在哪个叶节点上(树的结构)
:每个样本的预测值

决策树的复杂度:

个叶节点的样本集合:

则(2)可以写成:

3. 目标函数最优值
如果树的结构是固定的,即已经知道了每个叶节点有哪些样本,那么

是常数,但是
(叶节点的预测值)不确定。

令目标函数一阶导为0,得到:

​ 此时,目标函数的值为:

4.
求单棵树的最优结构(贪心策略)
(1)从深度为0的树开始,对每个叶节点枚举所有的可用特征
(2)针对每个特征,把属于该节点的训练样本根据该特征值升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的最大收益(采用最佳分裂点时的收益,收益指的分裂前后目标函数的差值)
(3)选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,把该节点生长出左右两个新的叶节点,并为每个新节点关联对应的样本集
(4)回到第1步,递归执行到满足特定条件为止

2. XGBoost过拟合的解决办法

  • 目标函数中的正则项
  • 权值收缩,类似于控制学习速率(shrinkage为每棵树设置了一个weight,这样更容易避免过拟合)
  • 列子采样

3. 决策树节点划分算法(Approximate Algorithm)

最基本的算法是精确贪心算法(Exact Greedy Algorithm):首先根据特征值对样本进行排序,然后枚举连续特征的所有可能分割。,以选择最佳分裂点。

Approximate Algorithm:对连续型特征进行离散化。

2235646c296c9f7e94160bb5984fb4ad.png

算法根据特征分布的分位数找到候选的特征分裂点集合,然后将特征分到不同的桶中,对每个桶内的样本统计值

进行累加统计,最后寻找最佳分裂点。

XGBoost中采用的基于分位数来获得分裂点,要获得分位数,需要对数据进行排序,但是当数据量特别大的情况下,排序非常消耗内存和时间。此时可以使用ε-approximate 分位数算法,对于权重一致的情况,可以使用quantile sketch算法来进行排序。但是在XGBoost中,每个点的权重是不一致的,权重系数是二阶导数

。因此,论文中提出了基于权重的quantile sketch算法,也就是weighted quantile sketch。

4. 稀疏数据(缺失值)的处理

02d25195bac464a7de06c6f8cead8d6b.png

XGBoost会把缺失值分到默认的方向,先把缺失的放到右边,也就是假设缺失的是大于划分点的值,然后在放到左边,然后找出这两种情况哪种最优。

5. XGBoost优缺点

优点:

  • 在实现上,可并行化(提出了稀疏感知算法,sparsity-aware)计算,加快训练速度
  • 引入了损失函数的二阶导,增加了精度,并且方便自定义损失函数
  • 不仅支持CART作为基学习器,还支持线性模型。使用线性模型的xgboost相当于带l1和l2正则的逻辑回归(分类问题)或者线性回归(回归问题)。
  • 在目标函数中加入了正则项,控制了模型的复杂度,有助于防止过拟合。
  • 在进行完一次迭代后,会将叶子节点的权重乘上一个缩减系数(shrinkage),以增加模型的泛化性能。
  • 支持列采样,可以降低过拟合,同时减少计算
  • 可以处理缺失值

缺点:

  • 时间开销较大(训练之前对数据进行排序并分桶)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值