源/机器的核心
本文将尽可能详细地介绍Boosting和AdaBoost的相关概念。
将涉及:
对 bagging(装袋法)的快速回顾bagging 的局限性Boosting 的概念细节boosting 的计算效率代码示例打包的局限性
接下来,我们不妨考虑一个二元分类问题。我们把一个观测值分为0或1。虽然这不是本文的目的,但为了清晰起见,让我们回顾一下Bagging的概念。
打包是指一种称为引导聚合的技术。其本质是选择t个bootstrap样本,在每个样本中安装一个分类器,然后并行训练模型。通常在随机森林中,决策树是并行训练的。然后,对所有分类器的结果进行平均,得到bagging分类器:
装袋分级机的配方
这个过程可以用以下方式来说明。让我们考虑三个分类器,它们生成一个分类结果,可能是对的,也可能是错的。如果我们画出三个分类器的结果,会有一些区域表明分类器的结果是错误的。在下图中,这些区域用红色表示:
打包场景示例
这个例子可以很好的说明,其中一个分类器的结果是错误的,而另外两个分类器的结果是正确的。通过对分类器进行投票,可以获得较高的分类准确率。但是你可能猜到了,bagging机制有时候并不太好用,所有的分类器都会在同一个区域得到错误的分类结果。
因此,助推方法背后的直观理念是:
我们需要串行训练模型,而不是并行训练。每个模型需要重点关注之前的分类器表现不佳的地方。助力介绍
概念
上述观点可以解释为:
在整个数据集上训练模型 p对 p 表现较差的区域的数据加权,并在这些数据上训练模型 h2对 p ≠ h2 的区域的数据加权重,并在这些数据上训练模型 h3...我们可以串联而不是并联训练这些模型。这就是Boosting的精髓!
Boosting方法会随着时间的推移通过调整误差度量来训练一系列低性能算法,称为弱学习器。弱学习者是指那些错误率略低于50%的算法,如下图所示:
错误率略低于50%的弱分类器
权差
如何才能实现这样的分类器?事实上,我们通过在整个迭代过程中对误差进行加权来实现这一点。这样,我们将在分类器之前对性能差的区域给予更多的权重。
想想二维图像上的数据点。有些点分类很好,有些则不然。一般在计算错误率时,每个错误的权重为1/n,其中n为待分类的数据点个数。
未加权误差
现在我们来衡量一下误差!
权差
现在,您可能已经注意到,我们对没有很好分类的数据点给予了更高的权重。加权过程如下图所示:
加权过程示例
最后,我们希望构建一个强分类器,如下图所示:
强分类器
决策树桩
你可能会问,我们需要实现多少个分类器才能让整个Boosting系统正常工作?每一步如何选择一个分类器?
答案就是所谓的“决策树桩”!决策树桩是单层决策树。主要思想是每一步都要找到最好的树桩(也就是得到最好的数据分区),这样可以把整体误差降到最低。你可以把一个树桩想象成一个测试,在这个测试中,我们假设树桩一边的所有数据点都属于类1,另一边的所有数据点都属于类0。
决策难题可能有多种组合。接下来,让我们看看这个简单的例子中有多少树桩组合。
3个数据点待划分
事实上,这个例子中有12种树桩组合!这看起来可能有点令人惊讶,但实际上很容易理解。
12个决策难题
我们可以对上述情况做12个可能的“测试”。每条分割线一侧的数字“2”简单地表示分割线一侧的所有点可能属于0类或1类。因此,每条分割线都嵌入了两个“测试”。
在每次迭代T中,我们都会选择最能划分数据的弱分类器ht,这个分类器可以使整体错误率最小化。回想一下,这里的错误率是错误率的加权校正版本,它考虑了前面介绍的内容。
找到最好的分区
如上所述,通过在每次迭代中识别最佳弱分类器ht(通常是具有1个节点和2个叶子的决策树)来找到最佳分区..假设我们试图预测一个想借钱的人是否是一个好的付款人:
找到最好的部门
在这种情况下,时间t的最佳划分是以“支付历史”为树桩,因为这个划分的加权误差最小。
请注意,事实上,像这样的决策树分类器可能比简单的树桩有更深的结构。这将是一个超级参数。
融合分类器
自然,下一步应该是将这些分类器融合成一个符号分类器。根据数据点位于分割线的哪一侧,将其分为0或1。这个过程可以实现如下:
融合分类器
你有没有找到任何可能的方法来提高分类器的性能?
通过对每个分类器进行加权,我们可以避免给不同的分类器赋予相同的重要性。
adaboost算法
综上
让我们用一小段伪代码来总结一下本文到目前为止所介绍的内容。
伪码
要记住的要点是:
Z 是一个常数,其作用是对权重进行归一化,使得它们加起来等于 1!α_t 是应用于每个分类器的权重你完了!这个算法叫做AdaBoost。如果你想完全理解所有的boosting方法,那么这是你需要理解的最重要的算法。
计算
Boosting算法训练起来非常快,很棒。但我们考虑了所有树桩的可能性,采用递归方法计算指标。为什么它训练的那么快?
现在,神奇的地方来了!如果我们选择适当的α_t和z,每一步应该改变的权重将简化为以下简单形式:
选择合适的α和z后得到的权重。
这是一个非常有力的结论,与权重应该随迭代而变化的说法并不矛盾。因为误分类的训练样本数减少了,所以它们的总权重还是0.5!
无需计算 Z无需计算 α无需计算指数另一个小技巧是,任何试图分离两个已经很好分类的数据点的分类器都不是最佳的。我们甚至不需要计算它。
试试用手编程!
现在,本文将引导读者快速浏览一个代码示例,看看如何在Python环境中使用Adaboost来识别手写数字。
进口熊猫aspd
importnumpy asnp
importmatplotlib.pyplot asplt
from sklearn . ensemble importable boostclassifier
fromsklearn . tree IMPORTdecisiontreeClassifier
fromsklearn . metrics importancracy _ score
fromsklearn . model _ selection import cross _ val _ score
fromsklearn . model _ selection import cross _ val _ predict
fromsklearn . model _ selection import train _ test _ split
fromsklearn . model _ selection import learning _ curve
fromsklearn . dataset import load _ digits
首先,加载数据:
dataset = load_digits()
X =数据集[数据]
y =数据集[目标]
x包含长度为64的数组,表示简单的8×8平面图像。使用这个数据集的目的是完成手写数字识别的任务。下图是一个给定手写数字的示例:
如果我们坚持使用深度为1的决策树分类器(决策树),下面是这种情况下如何实现AdaBoost分类器:
reg_ada = AdaBoostClassifier(决策树分类器(max_depth=1))
scores _ ada = cross _ val _ score(reg _ ada,X,y,cv=6)
分数_ada.mean()
这样分类准确率应该在26%左右,大大提高了空。其中一个关键参数是序列决策树分类器的深度。那么,决策树的深度如何改变才能提高分类精度呢?
分数= []
for detth in[1,2,10]:
reg_ada = AdaBoostClassifier(决策树分类器(max_depth=depth))
scores _ ada = cross _ val _ score(reg _ ada,X,y,cv=6)
score.append(scores_ada.mean())
在这个简单的例子中,当决策树的深度为10时,分类器得到的最高分类准确率为95.8%。
标签
研究人员对AdaBoost是否会过拟合进行了深入讨论。最近AdaBoost被证明在某个时间有拟合现象,用户应该意识到这一点。同时,Adaboost也可以作为回归算法使用。
AdaBoost在人脸识别任务中广泛用于评价视频中是否有人脸。这篇文章的作者将在不久的将来就这个话题再写一篇文章!在接下来的文章中,也会介绍梯度增强的方法!
1.《adaboost 实践秘籍:Boosting 与 AdaBoost》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《adaboost 实践秘籍:Boosting 与 AdaBoost》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/caijing/1201229.html