目录
5. Bagging 和 随机森林 RandomForest
集成学习
集成学习,是指构建并结合多个学习器来完成学习任务。
集成学习中可以只包含同类型的个体学习器(基学习器)或者不同类型的个体学习器。
要实现好的集成效果,个体学习器应该“好而不同”,个体学习器要有一定的“准确性”,且学习器间有 “差异性”。
目前集成方法大致分为两大类:
- 个体学习器间存在强依赖关系,必须串行生成的序列化方法。Boosting(例如Adaboost、GBDT、Xgboost)
- 个体学习器间不存在强依赖关系,可同时生成的并行化方法。Bagging 随机森林
1. Adaboost
Adaboost步骤如下:
1) 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
2) 在每轮迭代中
- 通过当前权值分布得到基分类器。
- 计算当前基分类器的分类误差率。
- 更新权值分布,提高错误分类样本的权值,降低正确分类样本的权值。
3) 组合基分类器,误差率小的基分类器权值高,误差率大的基分类器权值低。
2. 提升树(boosting tree)
提升树是以分类树或回归树作为基学习器的提升方法。
分类问题的提升树是AdaBoost算法的特殊情况。
前向分步算法的第 步,前一轮学到的模型是
回归问题的提升树只需要拟合残差。(对决策树的参数Θ的确定采用经验风险最小化来确定)
3. 梯度提升决策树(GBDT)
损失函数的负梯度在当前模型的值,作为回归问题残差的近似,去拟合回归树。
GBDT的正则化方法:
- 步长 步长和最大迭代次数一起决定算法的拟合效果
- 子采样比例 [0.5 0.8]之间
- 对弱学习器CART回归树进行正则化剪枝。
GBDT 调参:GBDT调参
GBDT是一个Boosting的模型,通过组合多个弱模型逐步拟合残差得到一个强模型。树模型具有天然的优势,能够很好的挖掘组合高阶统计特征,兼具较优的可解释性。GBDT的主要缺陷是依赖连续型的统计特征,对于高维度稀疏特征、时间序列特征不能很好的处理。
GBDT构造新特征的方法可以使特征工程自动化。
4. Xgboost
xgboost如何分裂,分裂时的依据,如何控制它是否分裂的,xgboost和GBDT区别
xgboost防止过拟合的方法,xgboost过拟合怎么办
Xgboost 与 GBDT 的不同之处
一是算法本身的优化:在算法的基学习器模型选择上,对比GBDT只支持决策树,还可以直接很多其他的弱学习器。(XGBoost的基学习器 可以是CART(这个时候就是GBDT)也可以是线性分类器)在算法的损失函数上,除了本身的损失,还加上了正则化部分。在算法的优化方式上,GBDT的损失函数只对误差部分做负梯度(一阶泰勒)展开,而XGBoost损失函数对误差部分做二阶泰勒展开,更加准确。算法本身的优化是我们后面讨论的重点。
二是算法运行效率的优化:对每个弱学习器,比如决策树建立的过程做并行选择,找到合适的子树分裂特征和特征值。在并行选择之前,先对所有的特征的值进行排序分组,方便前面说的并行选择。对分组的特征,选择合适的分组大小,使用CPU缓存进行读取加速。将各个分组保存到多个硬盘以提高IO速度。
注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完成才能进行下一次迭代的(第t次迭代的代价函数里面包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行排序,然后保存block结构,后面的迭代中重复的使用这个结构,大大减小计算量。这个block结构也使得并行称为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
三是算法健壮性的优化:对于缺失值的特征,通过枚举所有缺失值在当前节点是进入左子树还是右子树来决定缺失值的处理方式。算法本身加入了L1和L2正则化项,可以防止过拟合,泛化能力更强。
缺失值处理:
- 在寻找split point(在节点分裂决策树)的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。
- 在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。
-
如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。
XGBoost 一次求解出决策树最优的所有J个叶子节点区域和每个叶子节点区域的最优解
XGBoost调参
1) n_estimators; 决策树基学习器的个数,先固定learning rate 0.1
2) max_depth 树结构的深度(这个参数的取值最好在3-10之间) 和 min_child_weight 最小的子节点权重阈值,如果某个树节点的权重小于这个阈值,则不会再分裂子树,;
3) gamma; XGBoost的决策树分裂所带来的损失减小阈值。(起始值也可以选其它比较小的值,在0.1到0.2之间就可以)
4) subsample 和 colsample_bytree、colsample_bylevel、colsample_bynode; 子采样参数,这三个参数都是用于特征采样的,选择多少特征去分裂子树(典型值的范围在0.5-0.9之间。)
5) reg_alpha 和 reg_lambda; XGBoost的正则化参数。
6) learning_rate; 调完其他所有参数后,最后再来调learning_rate和n_estimators。
注意:
1. max_leaf_nodes
- 树上最大的节点或叶子的数量。
- 可以替代max_depth的作用。如果定义了这个参数,GBM会忽略max_depth参数。
2. min_child_weight = 1
- 在这里选了一个比较小的值,因为这是一个极不平衡的分类问题。因此,某些叶子节点下的值会比较小。
参考链接:
XGBoost判断特征重要度的指标:
weight - 该特征在所有树中被用作分割样本的特征的次数。
gain - 在所有树中的平均增益。
cover - 在树中使用该特征时的平均覆盖范围。
5. Bagging 和 随机森林 RandomForest
集成中的个体学习器应尽可能相互独立,基学习器有尽可能大的差异。
使用有交叠的采样子集。(数据集中重复采样)
对于并行训练出来的基学习器,对于分类任务使用简单的投票法,回归任务使用简单平均法。
又放回的采样。
随机森林,以决策树为基学习器构建Bagging集成的基础上,引入了随机属性选择。RF中,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
1) 首先对n_estimators进行网格搜索. 最大基学习器的个数
2) 对决策树最大深度max_depth和内部节点再划分所需最小样本数min_samples_split进行网格搜索。
3) 对于内部节点再划分所需最小样本数min_samples_split,我们暂时不能一起定下来,因为这个还和决策树其他的参数存在关联。下面我们再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参。
4) 最大特征数max_features
6. GBDT 和 RandomForest的区别
1)随机森林采用的bagging思想,而GBDT采用的boosting思想。(这两种方法都是Bootstrap思想的应用,Bootstrap是一种有放回的抽样方法思想。虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练样例赋相等的权重1/n,然后用该算法对训练集训练t轮,每次训练后,对训练失败的样例赋以较大的权重),因此Boosting的分类精度要优于Bagging。)Bagging的训练集的选择是随机的,各训练集之间相互独立,弱分类器可并行,而Boosting的训练集的选择与前一轮的学习结果有关,是串行的。
2)组成随机森林的树可以是分类树,也可以是回归树;而GBDT只能由回归树组成。
3)组成随机森林的树可以并行生成;而GBDT只能是串行生成。
4)对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来。
5)随机森林对异常值不敏感;GBDT对异常值非常敏感。
6)随机森林对训练集一视同仁;GBDT是基于权值的弱分类器的集成。
7)随机森林是通过减少模型方差提高性能;GBDT是通过减少模型偏差提高性能。
7. xgboost,RF,LR优缺点场景
Xgboost:
优缺点:1)在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
2)xgboost考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper提到50倍。
3)特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行。
4)按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。
5)xgboost 还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。
适用场景:分类回归问题都可以。
Rf:
优点:
1)表现性能好,与其他算法相比有着很大优势。
2)随机森林能处理很高维度的数据(也就是很多特征的数据),并且不用做特征选择。
3)在训练完之后,随机森林能给出哪些特征比较重要。
4)训练速度快,容易做成并行化方法(训练时,树与树之间是相互独立的)。
5)在训练过程中,能够检测到feature之间的影响。
6)对于不平衡数据集来说,随机森林可以平衡误差。当存在分类不平衡的情况时,随机森林能提供平衡数据集误差的有效方法。
7)如果有很大一部分的特征遗失,用RF算法仍然可以维持准确度。
8)随机森林算法有很强的抗干扰能力(具体体现在6,7点)。所以当数据存在大量的数据缺失,用RF也是不错的。
9)随机森林抗过拟合能力比较强(虽然理论上说随机森林不会产生过拟合现象,但是在现实中噪声是不能忽略的,增加树虽然能够减小过拟合,但没有办法完全消除过拟合,无论怎么增加树都不行,再说树的数目也不可能无限增加的)。10)随机森林能够解决分类与回归两种类型的问题,并在这两方面都有相当好的估计表现。(虽然RF能做回归问题,但通常都用RF来解决分类问题)。11)在创建随机森林时候,对generlization error(泛化误差)使用的是无偏估计模型,泛化能力强。
缺点:1)随机森林在解决回归问题时,并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。(PS:随机森林已经被证明在某些噪音较大的分类或者回归问题上回过拟合)。2)对于许多统计建模者来说,随机森林给人的感觉就像一个黑盒子,你无法控制模型内部的运行。只能在不同的参数和随机种子之间进行尝试。3)可能有很多相似的决策树,掩盖了真实的结果。4)对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)。5)执行数据虽然比boosting等快(随机森林属于bagging),但比单只决策树慢多了。
适用场景:数据维度相对低(几十维),同时对准确性有较高要求时。因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。
Blending
Blending第一层将训练集需要划分为训练集(train_set)和验证集(val_set)。第一层中可以选择多个模型,这些模型可以是同质的也可以是异质的。然后分别使用训练集对这些模型训练,将训练好的模型对验证集进行验证得到预测特征。这些预测特征将作为第二层的训练集。
Blending在测试过程中,也分为两层。在第一层中,使用训练好的模型对测试数据进行预测,得到测试集的预测特征;在第二层中使用训练好的单层感知机对预测特征进行预测,得到最终的预测结果。
总结:用不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。实现简单,但对训练数据利用少了。
Stacking
参考链接:Kaggle机器学习之模型融合(stacking)心得
整个过程很像 交叉验证。首先将训练数据分为 5 份,接下来一共 5 个迭代,每次迭代时,将 4 份数据作为训练集对每个基学习器进行训练,然后在剩下一份验证集上进行预测。同时也要将其在测试数据上的预测保存下来。这样,每个 Base Model 在每次迭代时会对训练数据的其中 1 份做出预测,对测试数据的全部做出预测。5 个迭代都完成以后我们就获得了一个 #训练数据行数 x #Base Model 数量 的矩阵,这个矩阵接下来就作为第二层的 Model 的训练数据。当第二层的 Model 训练完以后,将之前保存的 Base Model 对测试数据的预测(因为每个 Base Model 被训练了 5 次,对测试数据的全体做了 5 次预测,所以对这 5 次求一个平均值,从而得到一个形状与第二层训练数据相同的矩阵)拿出来让它进行预测,就得到最后的输出。