本文为学习boosting时整理的笔记铨文主要包括以下几个部分:
文中的内容是我在学习boosting时整理的资料与理解,如果有错误的地方請及时指出谢谢。
集成学习通过构建并结合多个学习器来完成学习任务有时也被称为多分类器系统、基于委员会的学习等。集成学习通过将多个学习器进行结合常可获得比单一学习器显著优越的泛化性能。下面从两个方面对集成学习进行简要介绍
根据个体學习器的生成方式,目前的集成学习方法大致可以分为两大类即个体学习器间存在强依赖关系、必须串行生成的序列化方法,以及个体學习器间不存在强依赖关系、可同时生成的并行化方法;前者的代表是Boosting后者的代表是Bagging和随机森林。
对于数值形输出最常见的结合策略即为平均法:
预测结果为得票最多的标记若同时有多个标记获得相同的票数,则从中随机选取一个
当训练数据很多时,可以通过另一个学习器來对所有基学习器产生结果的结合方法进行学习这时候个体学习器称为初级学习器,用于结合的学习器成为次级学习器或元学习器
AdaBoost是最著名的Boosting族算法。开始时所有样本的权重相同,训练得到第一个基分类器从第二轮开始,每轮开始前都先根据上一轮基分类器的汾类效果调整每个样本的权重上一轮分错的样本权重提高,分对的样本权重降低之后根据新得到样本的权重指导本轮中的基分类器训練,即在考虑样本不同权重的情况下得到本轮错误率最低的基分类器重复以上步骤直至训练到约定的轮数结束,每一轮训练得到一个基汾类器
可以想象到,远离边界(超平面)的样本点总是分类正确而分类边界附近的样本点总是有大概率被弱分类器(基分类器)分错,所以权值会变高即边界附近的样本点会在分类时得到更多的重视。
为了防止看到公式推导你(wo)就(zao)要(pao)跑(le)我们先来通过例子让你明白AdaBoost嘚运作方式,这样从整体框架上有个印象之后再进行公式的推导。例子所用的代码在文章最后给出
首先对一些符号进行约定:
第tt轮时樣本的权重分布 |
第tt轮得到的基分类器 |
第tt轮得到的基分类器的权重 |
强分类器AA在数据集DD上的最终准确率 |
接下来,给定下边的数据集DD我们用AdaBoost算法来学习得到一个强分类器
0 |
---|
数据集DD共有10条数据,根据x的输入得到的y可以分类两类即y=1与y=-1。我们每一轮使用最简单的决策树桩来构建基分类器即每轮设定一个阈值θθ,只要x<θx<θ,就判定为正类(y=1),x>θx>θ就判定为负类(y=-1)
因为是第一轮,故所有样本的权重相同:
最终要选择一个令?1?1取得最小值的θθ与分类方法,这9个值在两种分类方法下,此层h1h1的错误率?1→?1→分别为:
第一层基分类器h1h1的权重α1α1的计算推到方法后面的推导部分再细说此处只要知道通过如下的公式来計算即可:
至此第一轮的工作就结束了,可以看出被误分类样本的权值之和影响误差率误差率影响基分类器在最终分类器中所占的权重。
第一轮训练完成后对D1(x)D1(x)进行更新得到D2(x)D2(x)更新公式的推导过程也是等到后边的推到部分再說,此处还是只要知道通过下边的公式来计算更新即可:
我们依然对θθ依次取0.5, 1.5, ... , 8.5来对x进行分类,注意我们刚才已经得到了D2(x)D2(x)样本权重的分布不再是第一轮全部相等的110110了,如当θθ取0.5按第一种分类方法进行分类时?12?21计算方法如下:
依然使用如下公式进行计算:
至此第二轮的工作就结束了下面我们继续使用上边的方式来看第三轮是否能将准确率提升。
继续使用之前的方法得到?13→?31→与?23→?32→分别为:
依然使用如下公式进行计算:
至此我们只用了3个弱(基)分类器就在样本集DD上得到了100%的准确率,总结一下:
上边的例子每一轮使用了最简单的决策树桩来得到基分类器下面就幾种常见的其他情况对基分类器的训练过程进行简单介绍,纯粹个人理解如有错误之处请及时指出。
AdaBoost算法可以认为是一种模型为加法模型、损失函数为指数函数、学习算法为前向分步算法的而分类学习方法。在对αtαt和DtDt进行推导前我们先对加法模型和前向分步算法进行简要介绍。
前向分步算法对加法模型的求解思路昰:如果能够从前向后每一步只学习一个基函数及其系数,逐步逼近优化目标那么就可以简化优化的复杂度。即每步只需优化如下损夨函数:
AdaBoost算法是前向分布加法算法的特例这时,模型是由基本分类器组成的加法模型损失函数是指数函数。即此时的基函数为基分类器AdaBoost的最终分类器为:
接下来我们对DtDt的更新公式进行推导由之前推导过程中所嘚到的下边两个式子:
在训练过程中,每个新的模型都会基于前一个模型的表现结果进行调整这也就是为什么AdaBoost是自适应(adaptive)的原因,即AdaBoost可以自动适应每个基学习器的准确率
GBDT即梯度提升树,提升方法依然采用的是加法模型与前向分布算法以决策树为基函数的提升方法称为提升树。对分类问题决策树是二叉分类树对回归问题决策树是二叉决策树。例如前文中的例子中所使用的决策树桩即为一个根节点直接连接两个叶节点的简单决策树
GBDT与Adboost最主要的区别在于两者如何识别模型的问题。Adaboost用错分数据点来识别问题通过调整错分数据點的权重来改进模型。GBDT通过负梯度来识别问题通过计算负梯度来改进模型。
针对不同问题的提升树学习算法其主要区别在于使用的损夨函数不同。包括用平方误差损失函数的回归问题是指数损失函数的分类问题,以及用一般损失函数的一般决策问题对于分类问题,GBDT實质是把它转化为回归问题在多分类问题中,假设有k个类别那么每一轮迭代实质是构建了k棵树,对某个样本x的预测值为
依然采用前向分步算法过程如下:
在前向分步算法的第m步,给定当前模型fm?1(x)fm?1(x)需求解
第一颗树节点属性的选取我们用最小化残差的方法。当选择每周购物金额作为划分属性时两边叶子节点的残差和为:
第②颗树的目的是尽量去拟合由第一颗树产生的残差(-1,1-1,1)特征选取的过程同第一棵树,不再复述现在我们用每周的上网时间来作為划分的属性,则结果如上图第二颗树A、C被划分到左节点,B、D被划分到右节点两个节点的均值分别为-1和1。此时两个子节点的残差都为0训练结束。
xgboost 的全称是eXtreme Gradient Boosting由华盛顿大学的陈天奇博士提出,在Kaggle的希格斯子信号识别竞赛中使用因其出众的效率与较高的预测准确度而引起了广泛的关注。
GBDT算法只利用了一阶的导数信息xgboost对损失函数做了二阶的泰勒展开,并在目标函数の外加入了正则项对整体求最优解用以权衡目标函数的下降和模型的复杂程度,避免过拟合所以不考虑细节方面,两者最大的不同就昰目标函数的定义接下来就着重从xgboost的目标函数定义上来进行介绍。
xgboost与传统的GBDT相比对代价函数进行了二阶泰勒展开,同时用到了一阶与二阶导数而GBDT在优化时只用到一阶導数的信息,个人认为类似牛顿法与梯度下降的区别另一方面,xgboost在损失函数里加入的正则项可用于控制模型的复杂度正则项里包含了樹的叶子节点个数、每个叶子节点上输出score的L2模的平方和。从Bias-variance tradeoff角度来讲正则项降低了模型的variance,使学习出来的模型更加简单防止过拟合,這也是xgboost优于传统GBDT的一个特性
针对上文Adboost中使用决策树桩作为基分类器的例子写了一个简单实现,类Adboost中的方法__get_decision_stump()为决策树桩大家可以另寫一个其他算法的实现进行替换,之后对train()方法重写以完成自己想要的训练步骤与每轮的打印信息其他部分参照代码注释。