1、RF与GBDT之间的区别
相同点
- 都是由多棵树组成
- 最终的结果都是由对棵树一起决定
不同点
- 组成随机森林的数可是分类树也可以是回归树,而GBDT只由回归树组成
- 组成随机森林的数可是并行生成,而GBDT只能是串行生成
- 随机森林的结果是多棵树表决决定,而GBDT则是多棵树累加之和
- 随机森林对异常值不敏感,而GBDT对异常值比较敏感
- 随机森林是通过减少模型的方差来提高性能,而GBDT是减少模型的偏差来提高性能
- 随机森林不需要进行数据预处理、归一化,而GBDT需要进行特征归一化
2、分类树与回归树的区别
- 分类树使用信息增益或者增益比率来划分节点;每个节点样本的类别情侣投票决定测试样本的类别
- 回归树使用最小化均方差划分节点;每个节点样本的均值作为测试样本的回归预测值
3、GBDT的核心
- GBDT的核心就在于每一棵树都建立在之前所学的所有树的绝了和残差,这个残差就是一个加预测值后能的真实值的累加量
4、XGBOOST和GBDT的区别
- 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的.
- 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。为什么xgboost要用泰勒展开,优势在哪里?xgboost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。
- Xgboost在代价函数里加入了正则项,用于控制模型的复杂度,降低了过拟合的可能性。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。
- Xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
问题整理
1、
GBDT怎样设置单棵树的停止生长条件?
- 节点分裂时的最小样本数
- 树的最大深度
- 最多叶子结点数
- Loss满足约束条件
2、
GBDT如何评估特征的权重大小?
- 通过计算每个特征在训练集下的信息增益,最后计算每个特征信息增益与所有特征信息增益之和的比例为权重值。
- 借鉴投票机制。用相同的GBDT参数对w每个特征训练出一个模型,然后在该模型下计算每个特征正确分类的个数,最后计算每个特征正确分类的个数与所有正确分类个数之和的比例为权重值。
3、GBDT当增加样本数量时,训练时长是线性增加吗?
- NO,因为生成单颗决策树时,对于 损失函数极小值与样本数量N不是线性相关
4、当增加树的颗数时,训练时长是线性增加吗?
- NO,因为每个数的生成时间复杂度O(N)不同
5、当增加一个棵树叶子节点数目时,训练时长是线性增加吗?
- NO,叶子节点数和每棵树的生成的时间复杂度O(N)不成正比
6、每个节点上都保存什么信息?
- 中间节点保存某个特征的分割值,叶节点保存预测是某个类别的概率
7、如何防止过拟合?
- 增加样本,移除噪声
- 减少特征,保留一些重要的特征
- 对样本进行采样,就是在构建树的时候,不是把所有的样本都作为输入,而是选择一部分数据作为子集
- 对特征进行采样化,和对样本采样基本一致,就是在每次建树的时候只对部分的特征进行切分
8、GBDT中哪些部分可以并行?
- 计算每个样本的负梯度时
- 分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时
- 更新每个样本的负梯度时
- 最后预测的过程当中,每个样本将之前的所有树的结果累加的时候
9、树生成畸形树,会带来哪些危害,如何预防?
- 在生成树的过程中,加入树不平衡的约束条件。这种约束条件可以是用户自定义的。例如对样本集中分到某个节点,而另一个节点的样本很少的情况进行惩罚