机器学习(4):集成算法(Bagging、Boosting、Stacking)
目录
集成算法有3个流派:Bagging(代表随机森林)、Boosting(代表AdaBoost,Xgboost)、Stacking模型
Bagging:训练多个分类器取平均(并行)
Boosting:从弱学习器开始加强,通过加权来进行训练(串行)
Stacking:聚合多个分类或回归模型(分阶段)
一、Bagging模型:随机森林
1.1 bagging的原理
Bagging的弱学习器之间的确没有boosting那样的联系。它的特点在“随机采样”。
随机采样(bootsrap)就是从我们的训练集里面采集固定个数的样本,但是每采集一个样本后,都将样本放回。也就是说,之前采集到的样本在放回后有可能继续被采集到。
bagging对于弱学习器没有限制,这和Adaboost一样。但是最常用的一般也是决策树和神经网络。
bagging的集合策略也比较简单,对于分类问题,通常使用简单投票法,得到最多票数的类别或者类别之一为最终的模型输出。对于回归问题,通常使用简单平均法,对T个弱学习器得到的回归结果进行算术平均得到最终的模型输出。
由于Bagging算法每次都进行采样来训练模型,因此泛化能力很强,对于降低模型的方差很有作用。当然对于训练集的拟合程度就会差一些,也就是模型的偏倚会大一些。
1.2 随机森林算法 Random Forest
用一句话总结就是:随机采样构建不同的树,结果取平均
随机森林的主要优点有:
1) 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。
2) 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。
3) 在训练后,可以给出各个特征对于输出的重要性
4) 由于采用了随机采样,训练出的模型的方差小,泛化能力强。
5) 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。
6) 对部分特征缺失不敏感。
随机森林的主要缺点有:
1)在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
2) 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。
树模型:
理论上越多的树效果会越好,但实际上基本超过一定数量就差不多上下浮动了
1.3 随机森林的推广:极限随机数 extra trees
计算分割点方法中的随机性进一步增强。 在随机森林中,使用的特征是候选特征的随机子集;不同于寻找最具有区分度的阈值, 这里的阈值是针对每个候选特征随机生成的,并且选择这些随机生成的阈值中的最佳者作为分割规则。 这种做法通常能够减少一点模型的方差,代价则是略微地增大偏差
extra trees是RF的一个变种, 原理几乎和RF一模一样,仅有区别有:
1) 对于每个决策树的训练集,RF采用的是随机采样bootstrap来选择采样集作为每个决策树的训练集,而extra trees一般不采用随机采样,即每个决策树采用原始训练集。
2) 在选定了划分特征后,RF的决策树会基于基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是extra trees比较的激进,他会随机的选择一个特征值来划分决策树。
从第二点可以看出,由于随机选择了特征值的划分点位,而不是最优点位,这样会导致生成的决策树的规模一般会大于RF所生成的决策树。也就是说,模型的方差相对于RF进一步减少,但是偏倚相对于RF进一步增大。在某些时候,extra trees的泛化能力比RF更好。
二、Boosting模型:Adaboost、XGBoost
2.1 Boosting模型
Boosting(提升)是一族可将弱学习器提升为强学习器的算法。提升算法基于这样一种思想:对于一个复杂的任务,将多个专家的判断总和得出的结果要比任何一个专家单独的判断好。这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器表现对训练样本分布进行调整,是的先前基学习器做错的样本在后续收到更多关注(赋予做错的样本更大的权值),然后基于调整后的样本分布来训练下一个基学习器,一直反复进行,直到达到指定值。
Boosting方法通过分步迭代(stage-wise)的方式来构建模型,在迭代的每一步构建的弱学习器都是为了弥补已有模型的不足。(个体学习器之间存在强依赖关系。)
2.2 AdaBoost算法
AdaBoost算法是提升算法中最具代表性的。其中AdaBoost是Adaptive Boosting的缩写, 正如上面所说的,在AdaBoost算法中会提高前一轮分类器分类错误的样本的权值,而降低那些被分类正确样本的权值。对于弱分类器的组合,AdaBoost算法采取加权多数表决的方法。具体的说就是加大分类误差率小的弱分类器的权值,使其在表决中起到较大的作用;减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
感性认识AdaBoost算法:
1. 算法开始前,需要将每个样本的权重初始化为1/m,这样一开始每个样本都是等概率的分布,每个分类器都会公正对待。
2. 开始迭代后,需要计算每个弱分类器的分类错误的误差,误差等于各个分错样本的权重和,这里就体现了样本权重的作用。如果一个分类器正确分类了一个权重大的样本,那么这个分类器的误差就会小,否则就会大。这样就对分类错误的样本更大的关注。
3. 获取最优分类器后,需要计算这个分类器的权重,然后再更新各个样本的权重,然后再归一化。
4. 算法迭代的次数一般不超过弱分类器的个数,如果弱分类器的个数非常之多,那么可以权衡自己性价比来折中选择。
5. 迭代完成后,最后的分类器是由迭代过程中选择的弱分类器线性加权得到的。
理性认识AdaBoost算法:
三、Stacking模型
作为一个在kaggle比赛中高分选手常用的技术,SG在部分情况下,甚至可以让错误率相比当前最好的方法进一步降低30%之多。
以下图为例:
- ① 将训练集分为几个部分,分别用于让几个基分类器(Base-leaner)进行学习和拟合(也可以让基分类器所有训练集)
- ② 将3个基分类器预测得到的结果作为下一层分类器(Meta-learner)的输入
- ③ 将下一层分类器得到的结果作为最终的预测结果
这个模型的特点就是通过使用第一阶段(level 0)的预测作为下一层预测的特征,比起相互独立的预测模型能够有更强的非线性表述能力,降低泛化误差。
特点:
堆叠:很暴力,拿来一堆直接上(各种分类器都来了)集成算法
可以堆叠各种各样的分类器(KNN,SVM,RF等等)
分阶段:第一阶段得出各自结果,第二阶段再用前一阶段结果训