这里写目录标题
1 随机森林:
- bagging算法,可并行
- 适用于高维特征的数据,特征少的时候不适用
- 随机性体现在两个方面:
1:每个节点都随机从M个特征中选择m个特征,m应远小于M
2:随机从样本中以有放回抽样的方式,抽样N次,形成训练集。未抽到的作为验证集。 - 每棵树都完整成长而不会剪枝。
- 对异常数据比较鲁棒
- 适用于分类,回归效果可能不好,因为他无法输出连续的数据。
- 减少的是模型的方差
2 GBDT
GBDT(Gradient Boosting Decision Tree),即梯度提升决策树。
- boosting 算法,学习前一轮的残差
- 每一轮训练一棵树,训练轮数=基模型个数
- 训练时串行,速度慢。
- 预测阶段的计算速度快,可并行。
- 在分布稠密的数据集上,泛化能力和表达能力都很好。
- 不适用于高维数据或者稀疏数据。
- 决策树可解释性好。
- 模型拟合效果好,减少的是偏差
- 因为会过拟合,所以对异常数据比较敏感
- 为防止过拟合,会控制控制树的深度
3 异同点
- 相同点:
- 都是集成算法
- 基模型都是树
- 不同点:
- 随机森林是bagging,可并行; GBDT是boosting,需串行
- 随机森林是投票,GBDT是累加
- 随机森林对异常值不敏感,GBDT对异常值比较敏感
- 随机森林减少模型方差,GBDT减少模型偏差
问题汇总:
GBDT减少偏差 vs 随机森林减少方差
GBDT
GBDT降低偏差的原理:
GBDT每一轮拟合的是前一轮的残差,所以可以更好的拟合原数据,有效减少偏差。
因为GBDT拟合效果好,为了防止过拟合,我们就选择深度较浅的树,选择更简单的分类器。
随机森林
随机森林降低方差的原理:
假设 X 1 , X 2 , . . . , X n X_1,X_2,...,X_n X1,X2,...,Xn独立同分布,均服从正太分布 N ( μ , σ ) N(\mu,\sigma) N(μ,σ),请问 X ‾ = X 1 + X 2 + . . . + X n n \overline{X}=\frac{X_1+X_2+...+X_n}{n} X=nX1+X2+...+Xn服从什么分布?
答: X ‾ \overline{X} X的分布为 N ( μ , σ / n ) N(\mu,\sigma/\sqrt{n}) N(μ,σ/n)。均值后,方差变小了,这就是随机森林减少方差的原理。
因为随机森林可以有效降低方差,所以我们希望每棵树的拟合效果强一些,预测的偏差小一些,所以我们会倾向于选择深度比较深的树。所以随机森林算法中,会让树完全生长。
特征归一化问题
参考资料
chentq说xgboost不需要做归一化:https://github.com/dmlc/xgboost/issues/357
xgboost不要做归一化的解释:https://stats.stackexchange.com/questions/353462/what-are-the-implications-of-scaling-the-features-to-xgboost
机器学习 需要和不需要做特征归一化的情况总结:https://blog.csdn.net/baoyan2015/article/details/111177161
randomforest不用做特征归一化
当需要计算距离的时候,或需要更新的梯度跟特征值有关系的时候需要做归一化。否则,就不用。比如KNN,SVM,神经网络模型就需要做归一化,而决策树,朴素贝叶斯就不用
randomforest的基模型是树,且树跟树之间是独立的。构造树时,特征分割点的选择,与特征值的大小无关,只跟特征的分布有关。所以不需要做归一化。
xgboost要不要归一化?
xgboost的基模型也是树,不过树之间不是独立的,当前树学习的是上一轮的残差。xgboost使用的是梯度提升方法。损失函数中增加了正则化项,即叶子节点权重的 L 2 L_2 L2范数和。
按理说,梯度更新时,会受叶子节点权重 尺度的影响,那么为什么xgboost不必做特征归一化呢?
原因是因为叶子节点权重就是梯度,预测值=所有对应叶子节点权重的和。叶子节点权重对梯度的影响就是y值大小对梯度的影响。跟特征值是否归一化无关。特征值大,y还是那样大,特征值小,y还是那样大。所以特征值不必做归一化。
当然,如果想做归一化也是可以的,理论上讲好像没太大区别。但是在实践上,好像归一化后效果会好一些。玄学??&#x