Spark GBDT vs Random Forests vs xgboost

版权声明:如需转载,请注明出处 https://blog.csdn.net/u010358304/article/details/81155869

参考spark API文档

算法层面比较: GBDT vs Random Forests (RF)

1) GBDT一次只训练一棵树,而RF一次可以并行地训练多棵树,所以GBDT的训练时间更长。所以,GBDT通常会使用更小的树,同时也减少训练一棵树的时间。

2)RF更不容易过拟合,训练更多的树能够降低RF过拟合的可能性,却增加GBDT过拟合的可能性。 (因为在统计学角度,RF通过训练更多的树降低方差,而GBDT通过训练更多的树来降低偏差.)

3) RF更易于调整,因为其性能随树的个数单调递增。而对于GBDT来说,当树的个数太大时,其性能可能会随着树的个数增加而降低。

随机森林

支持二分类,多分类,回归。训练的每棵树的分类结果都会有所不同,将所有树结合在一起可以降低方差,从而提高性能。

1.训练

每一次迭代中从原始数据集采样得到子数据集,在子数据集上应用决策树模型。对于不同的子数据集,使用不同的特征子集作为决策树上的分类节点。

2.预测

扫描二维码关注公众号,回复: 3047980 查看本文章

1)分类模型:多数投票制。每一棵树的预测结果代表对对应类的一个选票,最终将选票最多的类作为最终预测结果。

2)回归模型:平均。将每棵树的结果做平均得到最终预测结果。

3.提升模型性能常考虑的参数

1)numTrees: 增加树的数目能够降低模型的方差,提高在测试集上的性能,但是同时也会线性增加训练时间。

2)maxDepth:增加每棵树的深度能够增加树的可表示性,但也会增加训练时间并且可能会过拟合(增加了每棵树中的特征个数)。但是相比于单棵决策树,增加树的深度对于随机森林来说是可以接受的。

4.通常不需要调整但可以加快训练速度常考虑的参数

1)subSamplingRate:用于控制单棵树上的训练子集的大小,也就是子数据集的规模。通常推荐为默认值1.0,但是减小值可以加快训练。

2)featureSubsetStrategy: 在每棵树的节点上作为候选的特征集的大小。减小这个值可以减少最优分割节点的计算量,但如果值过小也会影响树的性能。这个参数和maxDepth是不同的概念,maxDepth调整的是每棵子树上使用的最大特征个数,而featureSubsetStrategy调整的是在每个节点上挑选分割节点的候选集的大小。

GBDT

支持二分类和回归,不支持多分类。迭代地训练一序列的树,在每一次迭代中,使用当前的集成模型来预测训练数据并且和其真实类标进行对比,之后会提升那些训练结果不是很好的样本(分类错误,或者回归值与真实值相差较大)的权重,从而用于下一次迭代。每个样本的re-label机制都是通过损失函数决定的,每次迭代的目标就是降低损失函数值。

1.损失函数转自spark官方文档

损失函数只能用于分类或者回归中的一种,不能同时适用。

优化方式使用了一阶求导。

2.提升模型性能常考虑的参数

1) loss: 损失函数

2) numIterations: 树的个数,每增加一次迭代即增加一棵树。增加树的个数能够增加模型的表示性,提高训练集上的预测准确性,但如果个数太大会造成过拟合,影响测试集上的效果。

3)learningRate:不太需要调整这个值。但如果模型表现不是很稳定时,降低learningRate能够让模型表现更稳定。

3. validation while training

树的个数增加可能引起过拟合,因此需要在training的时候进行验证,使用runWithValidation。

4. 防止过拟合能够设置的参数

1) 上文提到的numIterations:树的个数过多会造成过拟合;

2)maxDepth:控制每棵树的最大深度

3)min_samples_split:每个叶子节点上的最少节点数,以保证样本没有被过度分割,即过拟合。

xgboost

损失函数使用了泰勒展开式二阶求导,学习速度更快,这是其优于GBDT的方面。

猜你喜欢

转载自blog.csdn.net/u010358304/article/details/81155869