pg赏金女王单机版试玩平台 XGBoost、LightGBM的详细对比介绍
本文按这些方法出现的顺序对其进行描述。
GBDT
梯度boosting树是在boosting树的基础上发展起来的一种具有更广泛应用的方法。在处理回归问题时,Boosting Tree可以看作是梯度Boosting Tree的特例(是分类问题时的特例吗?)。因为建树的每一步中的boosted tree都是为了在上一步得到的训练集上拟合模型的残差。后面我们会介绍,这个残差正是损失函数的梯度,对应GBDT每一步要拟合的对象。
大意
梯度下降是在目标函数所在的函数空间中进行的,即以要得到的函数模型为参数。在每一步中,都会拟合目标函数相对于上一步获得的模型的梯度,从而使参数向最小化目标函数的方向移动。更新。
对于某些特征,每次迭代得到的决策树模型必须乘以一个缩减系数,从而减少每棵树的作用,增加可学习的空间。每次迭代都适合一阶梯度。 XGBoost
XGBoost 是 GBDT 的变体。最大的区别在于xgboost对目标函数进行二阶泰勒展开,求出下一步要拟合的树的叶子节点权重(需要先确定树的结构),然后计算基于损失函数的树权重。找到每个分裂节点的损失减少的大小,以便可以根据分裂损失选择合适的属性进行分裂。
这种使用二阶展开的损失函数公式与节点分裂的过程密切相关。首先遍历所有节点的所有属性进行分裂。假设选择a属性的一个值作为分裂节点。根据泰勒展开得到的公式,可以计算出树结构每个叶子节点的权重,从而计算损失减少的程度。因此,通过综合各种属性,选择减少损失最多的特征作为当前节点的分裂属性。依此类推,直至满足终止条件。
除了类似于GBDT的缩减系数之外,xgboost的一些特征还对每棵树的叶子节点的数量和权重进行惩罚,以避免过拟合。与随机森林类似,XGBoost 在构建树的过程中随机对待每棵树。选择一些属性作为分割属性。
分裂算法有两种pg娱乐电子游戏,一种是精确分裂,一种是近似分裂算法。精确分裂算法将每个属性的每个值作为遍历的阈值,使用的决策树是CART。近似分裂算法将每个属性的所有值划分为多个桶,并以每个桶之间的值作为划分阈值。 xgboost提出了一种特殊的分桶策略。一般的分桶策略是每个样本的权重相同,但是xgboost让每个样本的权重为损失函数在该样本点的二阶导数(泰勒展开式不应该是损失函数的展开式吗关于模型(为什么有样本点二阶导数这样的说法?因为模型对所有样本点都是通用的,可以通过将样本代入二阶导数公式得到)。
xgboost 添加了对稀疏数据的支持。计算分割收入时,仅使用那些没有缺失值的样本。但是,在推理过程中pg赏金大对决试玩版,即树的结构确定后,需要将样本映射到叶子节点时,需要对包含缺失值的样本进行划分,xgboost假设该样本属于左子树,并且分别右子树,比较两者的分裂增益,选择增益较大的一侧作为样本的分裂方向。
xgboost 支持实现中的并行化。这里的并行并不是像rf这样的树之间的并行。和boosting方法一样,xgboost在树的粒度上是串行的,但是在构建树的过程中,即分裂节点时支持并行化,比如计算多个属性的多个值作为分裂特征及其值同时,再选择收益最大的特征及其值来分裂节点。
xgboost在实现的时候,需要将所有的数据导入到内存中pg棋牌,并做一次预排序(精确算法),这样在选择分裂节点的时候可以更快。
缺点:逐层树构造方法对当前层的所有叶节点一视同仁。分裂一些叶子节点的好处很小,对结果没有影响,但仍然需要分裂,增加了计算成本。预排序方法消耗大量空间。它不仅需要保存特征值,还需要保存特征的排序索引。同时,也消耗了大量的时间。遍历每个分割点时必须计算分割增益(不过这个缺点可以通过近似算法克服。) lightGBM
关于lightGBM的论文还没有发布。从网上的一些资料,我们可以得出与xgboost的以下区别:
xgboost 使用 level-wise 分割策略,而 lightGBM 使用 leaf-wise 策略。不同之处在于xgboost不加区别地分割每一层中的所有节点。有些节点的增益可能很小,对结果影响不大,但xgboost也被拆分了,带来了必要的开销。 leaf-wise的方法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,并递归地进行。很明显,leaf-wise的这种方法很容易过拟合,因为很容易陷入到比较高的深度,所以需要限制最大深度,以避免过拟合。
lightgbm使用基于直方图的决策树算法,与xgboost中的精确算法不同。直方图算法在内存和计算成本方面具有相当大的优势。
-.内存优势:显然,直方图算法的内存消耗是(#data* #features * 1Bytes)(因为对特征分桶后只保存了特征离散化后的值),而xgboost的exact算法的内存消耗是:(2 * #data * #features* 4Bytes),因为xgboost需要同时保存原始特征值和该值的顺序索引。这些值需要32位浮点数来保存。
-.计算优势。预排序算法在选择分割特征时需要遍历所有样本的特征值来计算分割收益,时间为(#data),而直方图算法只需要遍历桶,时间为( #垃圾桶 )
直方图差异加速度
-.父节点的直方图减去兄弟节点的直方图就可以得到子节点的直方图,从而加快计算速度。
lightgbm支持直接输入分类特征
-.在分割离散特征时,将每个值视为一个桶,分割时的增益计算为“是否属于某个类别”的增益。类似于one-hot编码。
但实际上,xgboost的近似直方图算法也和lightgbm的直方图算法类似。为什么xgboost的近似直方图算法还是比lightgbm慢很多?
-. xgboost 在每一层动态构建直方图。因为xgboost的直方图算法并不是针对特定的特征,而是所有的特征共享一个直方图(每个样本的权重是二阶导数),所以每个层的直方图都要重新构建,而lightgbm对于每个特征都有一个直方图,所以构建一次直方图就足够了。
-. lightgbm做了缓存优化吗?
lightgbm 的哪些方面是并行化的?
-.特征并行
一般的特征并行就是对数据进行垂直分区(垂直分区数据,即拆分属性),然后将拆分后的数据分散到各个worker上。每个worker计算自己拥有的数据的最佳分割点,然后汇总得到全局结果。最佳分裂点。但lightgbm表示这种方式通信开销比较大。 lightgbm的做法是每个worker拥有所有数据,然后进行划分? (我不明白,既然每个worker都有所有的数据,那么总结有什么意义呢?这个并行性体现在哪里??)
-.数据并行
传统的数据并行对数据集进行划分,也称为并行分区(水平分区数据)。分发到每个worker后,worker将获得的数据制作直方图,并对每个worker的直方图进行汇总,得到全局直方图。 Lightgbm还声称这个操作的通信开销比较大。 Lightgbm的做法是使用“Reduce Scatter”机制。它并没有总结所有的直方图,只是总结了不同worker的不同特征的直方图(原理?)。在这个总结的直方图上进行分割并最终同步。
我要评论