集成学习通过构建并结合多个学习器来完成学习任务。集成学习通过将多个学习器进行结合,常获得比单一学习器显著优越的泛化性能。
根据个体学习器的生成形式,目前的集成学习方法大致分成两类:个体学习器之间存在强依赖关系,必须串行生成的序列化方法。个体之间不存在强依赖关系,可以同时生成的并行化方法。前者的代表是Boosting,后者的代表是bagging和随机森林。
Boosting:
(1)初始化训练数据的权值分布。一般是等分布。
(2)
(a) 使用有权值的训练数据训练出一个基学习器.
(b) 计算其错误率(错误率跟权重结合在一块).
(c) 根据其错误率计算出其该基学习器的线性加权的权重。
(d) 同时改变其训练数据的样本权重,被误分类的数据权重得以加大。
(3) 重复(2),直到基学习器到达指定的数目。最终的学习器就是各个基学习器线性加权之和。
Adaboost核心思想:改变训练样本的权重,使得被误分类的样本得以得到重视。Adaboost算是boost算法的一个前向分布算法的一个个例。
Adaboost损失函数为:指数损失函数,只适用于二分类。
提升树是以决策树为基分类器的提升方法,通常使用CART树。针对不同问题的提升树学习算法,主要区别在于使用的损失函数不同。
1)分类问题:指数损失函数。可以使用CART分类树作为AdaBoost的基分类器,此时为分类提升树。
2)回归问题:平方误差损失函数。
3)决策问题:一般损失函数。
损失函数最小化方法
对于最开始提到的三种损失函数,其最小化方法各有不同。当损失函数为下面几种函数时,最小化损失函数的方法如下:
1)指数函数
当损失函数为指数函数时,比如AdaBoost算法的损失函数是指数函数,这时通过前向分步算法来解决。
前向分布算法在每轮迭代时,通过将上一轮所生成的模型所产生的损失函数最小化的方法来计算当前模型的参数。
2)平方误差损失函数
在回归树提升算法中,遍历当前输入样例的可能取值,将每种可能值计算一遍损失函数,最终选择损失函数最小的值。(很原始)
在计算平方损失误差时,可能出现残差项(y-fm-1(x)),此时可以通过如下方法来进行优化:每一轮迭代是为了减小上一步模型的残差,为了减少残差,每次在残差的负梯度方向建立一个新的模型,这样一步一步的使得残差越来越小。
3)一般损失函数
对于一般损失函数,可以通过梯度下降的方法来使得损失函数逐步减小,每次向损失函数的负梯度方向移动,直到损失函数值到达谷底。
Bagging与随机森林
(1)Bagging算法就是通过自助采样法(有放回的抽样),生成不同的训练数据集,每个训练集生成一个生成器,然后如果是分类问题,就利用投票法,如果是回归问题就使用平均法。
自助采样法给bagging带来的好处就是:由于每个学习器只是使用了%63.2的数据,剩下的约%36.8的样本可以用作验证集来对泛化性能进行“包外估计”。总结就是:Bagging通过样本的扰动来进行集成学习。
(2)随机森林(RF):
RF是bagging的一个变体,RF在以决策树为基学习器构建bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。传统决策树是在选择划分属性的时候是在当前结点的属性集合中(假设有d个属性)中选择一个最优属性,而在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择包含K个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数K控制了随机性的引入,若令K=d,那么与传统的决策树一样。一般情况下推荐K=logd;
随机森林实现简单,容易实现,计算开销小,性能强大。与bagging 仅仅通过样本的扰动(通过对初始训练集采集)不同,随机森林还加入了属性的扰动。
随机森林伪代码:
(1) 随机采样:
(a) 行采样。利用自主采样法进行行采样。
(b) 列采样。从M个属性中选取m个属性。
(2) 完全分裂
对采样后的数据采用完全分裂的方式建立出决策树。
完全分裂:决策树的某一个节点要么无法继续分裂,要么都指向同一个类。
1、 在构建决策树的过程中是不需要剪枝的。
2、 整个森林的树的数量和每棵树的特征需要人为进行设定。
3、 构建决策树的时候分裂节点的选择是依据最小基尼系数的。
随机森林优点:
(1) 适合做多分类,训练和预测速度快。
(2) 对训练数据容错能力强。是一种有效的估计缺失数据的一种方式,当数据集中存在大比例缺失数据时,仍然可以保持精度不变。
(3) 不容易产生过拟合。
(4) 容易实现
(5) 高维数据梳理能力强。
随机森林的训练效率常常优于Bagging,因为在个体决策树的构建过程中,bagging使用的是确定性决策树,在选择划分属性时要对节点的所有属性进行考虑。而随机森林使用的“随机型”,决策树只考虑一个属性子集。
集成学习带来的好处:
(1) 首先,从统计的方面来看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能。,此时如果使用单学习器可能因误选而导致泛化性能不佳,结合多个学习器可以减少这个风险。
(2) 从计算方面来讲,学习算法往往会陷入局部极小,有的局部极小点所对应的的泛化性能可能很糟糕。通过多次运行之后进行结合,可以降低陷入糟糕局部极小点的风险。
(3) 从表示的方面来看,某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间中,此时使用单学习器肯定无用,而通过结合多个学习器,由于相应的假设空间有所扩大,有可能学得更好的近似。
(3)学习法
当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器进行结合。Stacking是学习法的典型代表。
Stacking基本思想:先从初始数据集训练出初级学习器,然后生成一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当做样例输入特征,而初始样本的标记仍被当做样例标记。
1.划分训练数据集为两个不相交的集合。
2. 在第一个集合上训练多个学习器。
3. 在第二个集合上测试这几个学习器
4. 把第三步得到的预测结果作为输入,把正确的回应作为输出,训练一个高层学习器。