各种集成方法比较
1. AdaBoost和RF
- AdaBoost改变了训练数据的权值,即样本的概率分布,减少上一轮被正确分类的样本权值,提高被错误分类的样本权值,而随机森林在训练每棵树的时候,随机挑选部分训练集进行训练。
- 在对新数据进行预测时,AdaBoost中所有树加权投票进行预测,每棵树的权重和错误率有关,而随机森林对所有树的结果按照少数服从多数的原则进行预测。
2. AdaBoost和GBDT
- AdaBoost通过调整错分的数据点的权重来改进模型
- GBDT是从负梯度的方向去拟合改进模型
3. RF和GBDT
- Random Forest 是bootstrap(bagging)的方法的tree based ensemble: 即有放回的对训练数据采样,分别训练decision tree, 最后用简单的投票方式作为最终结果。
- GBDT 是 boosting 的代表,每次训练都是使用所有数据,但是认为最终结果是多颗树的叠加,训练完一棵树以后,将结果的残差作为下一棵树的训练目标。在这个过程中还使用了梯度近似残差的方法。
3.1. GBDT和RF的相同点
- 都是由多棵树组成
- 最终的结果都是由多棵树一起决定
3.2. GBDT和RF的不同点
- 组成RF的树可以是分类树,也可以是回归树;而GBDT只由回归树组成;
- 组成RF的树可以并行生成;而GBDT只能是串行生成;
- 对于最终的输出结果而言,RF采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来;
- RF对异常值不敏感,GBDT对异常值非常敏感;
- RF对训练集一视同仁,GBDT是基于权值的弱分类器的集成;
- RF是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能。
- RF每次训练集的样本权重是数据集中样本的比例权重,Adaboost是根据上一轮训练误差来更新样本权重,GBDT计算的是残差,要求残差最小化而非误差
- RF的子采样是有放回的抽样,GBDT的子采样是无放回的抽样,是否放回主要针对的是每次抽取的一个样本;如果每棵树抽样的整体都是100个样本,抽样80个,随机森林抽样是放回的,最极端的80个可能全部都重复,即一个样本;无放回抽样主要是样本不会重复,GBDT的每棵树都会用80个不同的样本来训练
3.4. 为什么GBDT的树深度较RF通常都比较浅
- 对于机器学习来说,泛化误差可以理解为两部分,分别是偏差(bias)和方差(variance);偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。
- 当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小;但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大,所以模型过于复杂的时候会导致过拟合。
- 对于RF来说由于并行训练很多不同的分类器的目的就是降低这个方差(variance)。所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树
- 对于GBDT来说由于利用的是残差逼近的方式,即在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择 variance 更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。
4. XGBOOST和GDBT
将树模型的复杂度加入到正则项中,来避免过拟合,因此泛化性能会优于GBDT。
GDBT在函数空间中利用梯度下降法进行优化,XGB在函数空间中使用了牛顿法进行优化。GDBT在优化中使用了一阶导,而XGB对损失函数进行了二阶泰勒展开,用到了一阶和二阶导, 可以加快优化速度。
XGB除了支持CART作为基分类器之外,还支持线性分类器,在使用线性分类器的时候可以使用L1(alpha),L2正则化(lambda)。
列抽样:XGBoost借鉴了随机森林的做法,支持列抽样(特征子采样),不仅防止过拟合,还能减少计算。
-
在寻找最佳分割点时,考虑到传统的贪心算法效率较低,实现了一种近似贪心算法,用来加速和减小内存消耗,首先根据特征分布的百分位数(percentiles)提出候选分裂点。然后,该算法将连续特征映射到由这些候选点分割的桶中,然后仅仅将桶边界上的特征的值作为分裂点的候选,从而获取计算性能的提升。分桶有两种模式:
-
全局模式:在算法开始时,对每个维度分桶一次,后续的分裂都依赖于该分桶并不再更新。
- 优点:只需要计算一次,不需要重复计算。
- 缺点:在经过多次分裂之后,叶结点的样本有可能在很多全局桶中是空的。
-
局部模式:除了在算法开始时进行分桶,每次拆分之后再重新分桶。
- 优点:每次分桶都能保证各桶中的样本数量都是均匀的。
- 缺点:计算量较大。
-
XGBoost支持并行处理,XGBoost的并行不是在模型上的并行,而是在特征上的并行,将特征列排序后以block的形式存储在内存中,在后面的迭代中重复使用这个结构。这个block也使得并行化成为了可能,其次在进行节点分裂时,计算每个特征的增益,最终选择增益最大的那个特征去做分割,那么各个特征的增益计算就可以开多线程进行。
-
对缺失值的处理:对于特征的值有缺失的样本,XGBoost可以自动学习出它的分裂方向。
- 在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。
4.1. XGBoost相关知识
4.2. XGBoost中gamma参数的含义
- 分裂节点时,损失函数减小值只有大于等于gamma节点才分裂,gamma值越大,算法越保守,越不容易过拟合,但性能就不一定能保证,需要平衡。