文章目录
集成学习是通过构建并组合多个弱学习器来完成给定任务。当集成中只包含同种类型的个体学习器时说明这种集成是“同质”的,同质集成中的个体学习器叫做基学习器;当集成中包含多种不同的个体学习器时说明这种集成是“异质”的,对应的个体学习器叫做组件学习器
集成学习主要有两种:
- bagging:基学习器之间无强依赖关系,可同时生成的并行化方法,代表为随机森林
- boosting:基学习器之间存在强烈的依赖关系。必须串行生成,例如adaboost、GBDT、xgboost、lightbgm等
一、bagging
Bagging方法是基于自助采样法,即给定包含m个样本的数据集,先随机取出一个样本放入采样集中,再把该样本放回初始数据集,这样经过m次随机采样,我们得到含m个样本的采样集。这种方法理论上包含原始数据集的63.2%
通过以上操作可以采样出T个含m个样本的采样集,然后基于每个采样集训练一个基学习器,再将这些基学习器进行结合。当对预测输出进行结合时。分类任务常使用简单投票法,回归任务使用简单平均法。
Bagging算法的一些优点是
- 时间复杂度不高,比较高效
- 由于每个基学习器只使用了63.2%的样本,剩余的样本可以进行包外估计
- Bagging算法关注降低方差,因此它在不捡枝决策树、神经网络等易受样本扰动的学习器上效果更明显。
随机森林
随机森林就是以决策树为基学习器的bagging算法。在sklearn中,随机森林的调用是通过sklearn.ensemble.RandomForestClassifier
。
随机森林的随机性体现在两点:
- 通过自助采样法进行采样得到原有数据集的一个子集进行训练
- 每一次选择需要分叉的特征时,限定为在随机选择的特征的子集中寻找一个特征
随机森林的优点是消除了决策树过拟合的缺点并且减小了预测的方差。随机森林的起始性能往往相对较差,但随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。
二、boosting
Boosting是一种可以将弱学习器提升为强学习器的算法。算法原理是先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得之前基学习器做错的训练样本在后续获得更多关注,然后基于调整后的样本分部来训练下一个基学习器,如此反复直到训练T个基学习器并进行加权结合。
1.Adaboost
Adaboost的思想是将关注点放在被错误估计的样本上,减少上一轮正确分类样本的样本权值,提高被错误分类的样本权值。
Adaboost采用加权投票的方法,分类误差小的弱分类器权重大,分类误差大的弱分类器权重小。Adaboost的伪代码如下:
Adaboost的代码有多种推导方式,最容易理解的是加性模型,即基学习器的线性组合来最小化指数损失函数,指数损失函数如下:
Adaboost的原理解释如下:
- 首先初始化训练数据(每个样本)的权值分布。每一个训练样本,初始化时赋予同样的权值w=1/N。N为样本总数。对应伪代码第一行
- 进行多次迭代,m=1,2….M。m表示迭代次数。
- 对具有权重分布Dm的训练数据集进行学习,得到一个弱学习器Gm(x)
- 计算Gm(x)在训练数据上的分类误差率
- 计算Gm(x)在强分类器中的比重
- 更新训练数据集的权值分布,zm为归一化分子使概率分布和为1
- 得到最终的分类器
再详细的原理不祥述,贴一个写的很好的链接:Adaboost算法原理分析和实例+代码(简明易懂)
sklearn实现AdaBoost
sklearn.ensemble.AdaBoostClassifier(base_estimator=None, n_estimators=50,
learning_rate=1.0, algorithm='SAMME.R',
random_state=None)
2.GBDT
参考博客GBDT算法原理以及实例理解,GBDT基本原理及算法描述
GBDT 的全称是 Gradient Boosting Decision Tree,梯度提升树,是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。
GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类。
GBDT的思想使其具有天然优势可以发现多种有区分性的特征以及特征组合。业界中,Facebook使用其来自动发现有效的特征、特征组合,来作为LR模型中的特征,以提高CTR预估的准确性;GBDT在淘宝的搜索及预测业务上也发挥了重要作用。
想要理解GBDT的真正意义,那就必须理解GBDT中的Gradient Boosting 和Decision Tree 以及简化版的 BDT 算法
(1)Regression Decision Tree:回归树
首先,GBDT使用的决策树是CART回归树,无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树都是CART回归树。因为GBDT每次迭代要拟合的是梯度值,是连续值所以要用回归树。
回归树总体流程类似于分类树,区别在于,回归树的每一个节点都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化平方误差。
回归树算法如图(截图来自《统计学习方法》5.5.1 CART生成):
(2)Boosting Decision Tree:提升树算法
提升树是迭代多棵回归树来共同决策。当采用平方误差损失函数时,每一棵回归树学习的是之前所有树的结论和残差,拟合得到一个当前的残差回归树,残差的意义如公式:残差 = 真实值 - 预测值 。提升树即是整个迭代过程生成的回归树的累加。提升树算法如下图:
当损失函数是平方损失和指数损失函数时,梯度提升树每一步优化是很简单的,但是对于一般损失函数而言,往往每一步优化起来不那么容易,针对这一问题,Friedman提出了梯度提升树算法,这是利用最速下降的近似方法,其关键是利用损失函数的负梯度作为提升树算法中的残差的近似值。
第t轮的第i个样本的损失函数的负梯度为:
此时如果使用平方损失,则扶梯度可以表示为:
此时我们发现GBDT的负梯度就是残差,所以说对于回归问题,我们要拟合的就是残差。这样就引入了 GBDT 算法
(3)Gradient Boosting Decision Tree:梯度提升决策树
GBDT 的算法原理如下图:
具体解释如下:
- 初始化弱学习器,估计使损失函数极小化的常数值,它是只有一个根节点的树,即ganma是一个常数值。
- 对 m=1,2,…,M 有:
(a)对每个样本 i = 1 , 2 , . . . , N,计算负梯度,将它作为残差的估计,对于平方损失函数它就是通常所说的残差;而对于一般损失函数,它就是残差的近似值(伪残差)
(b)将上步得到的残差作为样本新的真实值,拟合一颗新的回归树,其对应的叶子节点区域为 Rjm ,j = 1,2 ,…J .其中 J为回归树t的叶子节点的个数。
(c)对叶子区域 j = 1,2,…J 利用线性搜索,估计叶节点区域的值,使损失函数最小化
(d)更新回归树 - 得到输出的最终模型 f(x)