集成学习在机器学习算法中具有较高的准去率,不足之处就是模型的训练过程可能比较复杂,效率不是很高。其核心思想就是如何训练处多个弱分类器以及如何将这些弱分类器进行组合。主要分类如下:
Bagging:训练多个分类器取平均。如随机森林
Boosting:从弱学习器开始加强,通过加权来进行训练。Adaboost、GBDT、XGBOOST
Stacking:聚合多个分类或回归模型(可以分阶段来做)
1. Bagging
全称:bootstrap aggregating。
bagging 采用的是随机有放回的选择训练数据然后构造分类器,最后组合。因为 bagging 方法可以减小过拟合,所以通常在强分类器和复杂模型上使用时表现的很好(例如,完全决策树,fully developed decision trees),相比之下 boosting 方法则在弱模型上表现更好(例如,浅层决策树,shallow decision trees)。
预测
对于数值类的回归预测问题,通常使用的结合策略是平均法,也就是说,对于若干和弱学习器的输出进行平均得到最终的预测输出。
对于分类问题的预测,我们通常使用的是投票法。最简单的投票法是相对多数投票法,也就是我们常说的少数服从多数。稍微复杂的投票法是绝对多数投票法,也就是我们常说的要票过半数。更加复杂的是加权投票法,和加权平均法一样,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。
随机森林
随机森林是 bagging 算法最典型的例子,其实质是对决策树算法的一种改进,将多个决策树合并在一起,每棵树的建立依赖于独立抽取的样本。
随机森林大致过程如下:
- 从样本集中有放回随机采样选出n个样本;
- 从所有特征中随机选择k个特征,对选出的样本利用这些特征建立决策树(一般是CART,也可是别的或混合);
- 重复以上两步m次,即生成m棵决策树,形成随机森林;
- 对于新数据,经过每棵树决策,最后投票确认分到哪一类。
优点:
- 每棵树都选择部分样本及部分特征,一定程度避免过拟合;
- 每棵树随机选择样本并随机选择特征,使得具有很好的抗噪能力,性能稳定;
- 能处理很高维度的数据,并且不用做特征选择;
- 适合并行计算;
- 实现比较简单;
缺点:
- 参数较复杂;
- 模型训练和预测都比较慢;
- 可解析性较差
2. Boosting
Boosting 方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。他是一种框架算法,主要是通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。
2.1 Adaboost
Adaboost是boosting中较为代表的算法,基本思想是通过训练数据的分布构造一个分类器,然后通过误差率求出这个若弱分类器的权重,通过更新训练数据的分布,迭代进行,直到达到迭代次数或者损失函数小于某一阈值。
算法步骤如下:
- 初始化 D1(i)=1/m,其中D1(i)表示第一层迭代时每个样本的权重;
- 根据Dt进行训练出第t个弱分类器
- 根据第t个弱分类器的错误率计算出该分类器的在整个分类器中的权重αt;
- 更新每个训练样本的权重Dt, 使那些分类错误的样本的权重变高,而分类正确的样本权重变低,进行下一个弱分类器;
- 最后形成总的分类器就是每个弱分类器及其权重乘积的加和。
优点:
- adaboost是一种有很高精度的分类器
- 可以使用各种方法构建子分类器,adaboost算法提供的是框架
- 当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单
- 简单,不用做特征筛选
- 不用担心过拟合
2.2 GBDT
Adaboost,是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。
在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft−1(x), 损失函数是L(y,ft−1(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失损失L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。
GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
优点
- 可以灵活处理各种类型的数据,包括连续值和离散值。
- 在相对少的调参时间情况下,预测的准备率也可以比较高。这个是相对SVM来说的。
- 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
缺点
- 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
2.3 Xgboost
xgboost是 boosting Tree 的一个很牛的实现,它在最近Kaggle比赛中大放异彩。它有以下几个优良的特性:
- 显示的把树模型复杂度作为正则项加到优化目标中。
- 公式推导中用到了二阶导数,用了二阶泰勒展开。(GBDT用牛顿法貌似也是二阶信息)
- 实现了分裂点寻找近似算法。
- 利用了特征的稀疏性。
- 数据事先排序并且以block形式存储,有利于并行计算。
- 基于分布式通信框架rabit,可以运行在MPI和yarn上。(最新已经不基于rabit了)
- 实现做了面向体系结构的优化,针对cache和内存做了性能优化。
在项目实测中使用发现,Xgboost的训练速度要远远快于传统的GBDT实现,10倍量级。
由于篇幅太长,关于boosting的详细算法以后分章叙述
3. Stacking
将训练好的所有基模型对整个训练集进行预测,第j个基模型对第i个训练样本的预测值将作为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进行训练。
参考: