算法层面比较: GBDT vs Random Forests (RF)
1) GBDT一次只训练一棵树,而RF一次可以并行地训练多棵树,所以GBDT的训练时间更长。所以,GBDT通常会使用更小的树,同时也减少训练一棵树的时间。
2)RF更不容易过拟合,训练更多的树能够降低RF过拟合的可能性,却增加GBDT过拟合的可能性。 (因为在统计学角度,RF通过训练更多的树降低方差,而GBDT通过训练更多的树来降低偏差.)
3) RF更易于调整,因为其性能随树的个数单调递增。而对于GBDT来说,当树的个数太大时,其性能可能会随着树的个数增加而降低。
随机森林
支持二分类,多分类,回归。训练的每棵树的分类结果都会有所不同,将所有树结合在一起可以降低方差,从而提高性能。
1.训练
每一次迭代中从原始数据集采样得到子数据集,在子数据集上应用决策树模型。对于不同的子数据集,使用不同的特征子集作为决策树上的分类节点。
2.预测
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的方面。