xgboost 一般多少棵树_机器学习之4——提升算法(Adaboost、xgboost、GBDT)

Boosting

Boosting算法是将“弱学习算法“提升为“强学习算法”的过程,主要思想是“三个臭皮匠顶个诸葛亮”。一般来说,找到弱学习算法要相对容易一些,然后通过反复学习得到一系列弱分类器,组合这些弱分类器得到一个强分类器。

Adaboost

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。初始训练集训练出一个基学习器,再根据基学习器表现对训练样本分布进行调整,先前基学习器做错的样本在后续会得到更多的关注(赋予错误样本更大的权值,基于调整之后的样本分布训练下一个基学习器,以此类推反复进行。)

对Adaboost算法的研究以及应用大多集中于分类问题,同时也出现了一些在回归问题上的应用。就其应用Adaboost系列主要解决了: 两类问题、多类单标签问题、多类多标签问题、大类单标签问题、回归问题。它用全部的训练样本进行学习。

具体步骤

  • 给定数据集
  • 初始化训练数据的权值分布
  • 对迭代数
    ,使用具有权值分布的
    训练数据集得到基本分类器
    ,计算
    在训练集上的分类误差率:
    ,计算
    系数:
    ,从式子中可看出误差越小的分类器在最终分类器的影响越大。更新训练集的权值分布:
    ,
    其中
    是规范化因子,
  • 构建基本分类器线性组合
    ,
    ,
    的符号决定分类,数值决定分类的置信度。

Adaboost的特点:不改变所给的训练数据,不断改变训练数据权值的分布,使得训练数据在基本分类器中其不同的作用。

Gradient Boosting Decision Tree(GBDT)

GBDT通过迭代多棵树,把所有树结论累加,每一棵树学的是之前所有树结论和的残差,这个残差是加预测值后能得到的真实值的累加量。

训练数据集

(1)初始化

,其中
为损失函数。

(2)第

次迭代时,对于每一个样本
,计算当前要拟合的残差

(3)利用回归树

的每一个叶节点,计算其输出值:

(4)更新

(5)更新

(6)得到最终提升回归树:

损失函数的选择

  • 分类问题:指数损失、对数损失。指数损失函数时,退化为Adaboost算法
  • 回归问题:均方差损失函数、绝对损失函数
  • huber损失和分位数损失,用于回归提升健壮性,减少异常点对损失函数影响。

XGBoost[1]

(纯转载,若侵权会删除)

许多树模型集成在一起,形成一个很强的分类器,而所用到的模型则是CART回归树模型。

CART回归树

假设树为二叉树,通过不断将特征进行分裂,比如当前树结点是基于第j个特征值进行分裂的,设该特征值小于s的样本划分为左子树,大于s的样本划分为右子树。

CART回归树实质上就是在该特征维度对样本空间进行划分,而这种空间划分的优化是一种NP难问题,因此使用启发式方法解决:典型CART树产生的目标函数:

当我们为了求解最优的切分特征和最优的切分点s,就转化为求解一个目标函数:

只要遍布所有特征的所有切分点,就能找到最优的切分特征和切分点,最终得到回归树。

XGBoost算法思想:该算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。

XGBoost目标函数定义:

目标函数由两部分构成,第一部分用来衡量预测分数和真实分数的差距,另一部分则是正则化项。正则化项同样包含两部分,T表示叶子结点的个数,w表示叶子节点的分数。γ可以控制叶子结点的个数,λ可以控制叶子节点的分数不会过大,防止过拟合。

正如上文所说,新生成的树是要拟合上次预测的残差的,即当生成t棵树后,预测分数可以写成:

同时,可以将目标函数改写成:

,很明显接下来就是要去找到一个
能够最小化目标函数。XGBoost的想法是利用在
处的泰勒展开:

其中

为一阶导数,
为二阶导数:

由于前t-1棵树的预测分数与y的残差对目标函数优化不影响,可以直接去掉,简化目标函数:

上式是将每个样本的损失函数值加起来,我们知道,每个样本都最终会落到一个叶子结点中,所以我们可以将所以同一个叶子结点的样本重组起来,过程如下图:

bbb3106c07dce46e7a138cbd82c45319.png

因此通过上式的改写,我们可以将目标函数改写成关于叶子结点分数w的一个一元二次函数,求解最优的w和目标函数值就变得很简单了,直接使用顶点公式即可。因此,最优的w和目标函数公式为:

分裂结点算法

在上面的推导中,我们知道了如果我们一棵树的结构确定了,如何求得每个叶子结点的分数。但我们还没介绍如何确定树结构,即每次特征分裂怎么寻找最佳特征,怎么寻找最佳分裂点。

正如上文说到,基于空间切分去构造一颗决策树是一个NP难问题,我们不可能去遍历所有树结构,因此,XGBoost使用了和CART回归树一样的想法,利用贪婪算法,遍历所有特征的所有特征划分点,不同的是使用上式目标函数值作为评价函数。具体做法就是分裂后的目标函数值比单子叶子节点的目标函数的增益,同时为了限制树生长过深,还加了个阈值,只有当增益大于该阈值才进行分裂。

同时可以设置树的最大深度、当样本权重和小于设定阈值时停止生长去防止过拟合。

Shrinkage and Column Subsampling

XGBoost还提出了两种防止过拟合的方法:Shrinkage and Column Subsampling。Shrinkage方法就是在每次迭代中对树的每个叶子结点的分数乘上一个缩减权重η,这可以使得每一棵树的影响力不会太大,留下更大的空间给后面生成的树去优化模型。Column Subsampling类似于随机森林中的选取部分特征进行建树。其可分为两种,一种是按层随机采样,在对同一层内每个结点分裂之前,先随机选择一部分特征,然后只需要遍历这部分的特征,来确定最优的分割点。另一种是随机选择特征,则建树前随机选择一部分特征然后分裂就只遍历这些特征。一般情况下前者效果更好。

针对稀疏数据的算法(缺失值处理)

当样本的第i个特征值缺失时,无法利用该特征进行划分时,XGBoost的想法是将该样本分别划分到左结点和右结点,然后计算其增益,哪个大就划分到哪边。

XGBoost的优点

之所以XGBoost可以成为机器学习的大杀器,广泛用于数据科学竞赛和工业界,是因为它有许多优点:

1.使用许多策略去防止过拟合,如:正则化项、Shrinkage and Column Subsampling等。

2. 目标函数优化利用了损失函数关于待求函数的二阶导数

3.支持并行化,这是XGBoost的闪光点,虽然树与树之间是串行关系,但是同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。训练速度快。

4.添加了对稀疏数据的处理。

5.交叉验证,early stop,当预测结果已经很好的时候可以提前停止建树,加快训练速度。

6.支持设置样本权重,该权重体现在一阶导数g和二阶导数h,通过调整权重可以去更加关注一些样本。

参考

  1. ^一文读懂学习大杀器XGBoost http://blog.itpub.net/31542119/viewspace-2199549/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值