增强(Boosting)是一种集成技术,它试图从多个弱分类器中创建一个强分类器。
在这篇文章中,您将了解机器学习中的AdaBoost集成方法。阅读本文后,您将了解:
- 什么是增强集成方法以及它通常如何工作。
- 如何使用AdaBoost算法学习增强决策树。
- 如何使用学习到的AdaBoost模型进行预测。
- 如何最好地准备数据以与AdaBoost算法一起使用。
这篇文章是为开发人员撰写的,不假设读者具备统计学或数学背景。文章重点介绍了算法的工作原理以及如何将其用于预测建模问题。如果您有任何问题,请留言,我将尽力回答。
通过我的新书《掌握机器学习算法》启动您的项目,其中包括逐步教程和所有示例的Excel电子表格文件。
让我们开始吧。

机器学习中的增强和AdaBoost
图片来源:KatieThebeau,保留部分权利。
增强集成方法
增强是一种通用的集成方法,它从多个弱分类器中创建一个强分类器。
这是通过从训练数据构建模型,然后创建第二个模型来尝试纠正第一个模型的错误来实现的。模型会不断添加,直到训练集被完美预测或达到最大模型数量。
AdaBoost是第一个真正成功的、为二元分类开发的增强算法。它是理解增强的最佳起点。
现代增强方法建立在AdaBoost的基础上,最著名的是随机梯度增强机。
获取您的免费算法思维导图

方便的机器学习算法思维导图样本。
我创建了一份方便的思维导图,其中包含60多种按类型组织的算法。
下载、打印并使用它。
还可以独家访问机器学习算法电子邮件迷你课程。
从数据中学习AdaBoost模型
AdaBoost最适合用于提高决策树在二元分类问题上的性能。
AdaBoost最初被技术作者Freund和Schapire命名为AdaBoost.M1。最近,它可能被称为离散AdaBoost,因为它用于分类而非回归。
AdaBoost可以用于提高任何机器学习算法的性能。它最适合与弱学习器一起使用。这些模型在分类问题上实现的准确度仅略高于随机猜测。
最适合并因此最常与AdaBoost一起使用的算法是单层决策树。由于这些树非常短,并且只包含一个分类决策,因此它们通常被称为决策树桩。
训练数据集中的每个实例都被赋予权重。初始权重设置为
权重(xi) = 1/n
其中xi是第i个训练实例,n是训练实例的数量。
如何训练一个模型
使用加权样本在训练数据上准备一个弱分类器(决策树桩)。仅支持二元(两类)分类问题,因此每个决策树桩对一个输入变量做出一个决策,并为第一个或第二个类别值输出+1.0或-1.0值。
计算训练模型的错误分类率。传统上,这被计算为
错误率 = (正确预测数 – N) / N
其中,错误率是错误分类率,正确预测数是模型正确预测的训练实例数,N是训练实例的总数。例如,如果模型正确预测了100个训练实例中的78个,则错误率或错误分类率将是(78-100)/100,即0.22。
这被修改为使用训练实例的权重
错误率 = sum(w(i) * terror(i)) / sum(w)
这是错误分类率的加权和,其中w是训练实例i的权重,terror是训练实例i的预测错误,如果分类错误则为1,如果分类正确则为0。
例如,如果我们有3个训练实例,权重分别为0.01、0.5和0.2。预测值分别为-1、-1和-1,实例中的实际输出变量分别为-1、1和-1,那么terrours将是0、1和0。错误分类率将计算为
错误率 = (0.01*0 + 0.5*1 + 0.2*0) / (0.01 + 0.5 + 0.2)
或者
错误率 = 0.704
为训练模型计算一个阶段值,该值提供了模型所做任何预测的权重。训练模型的阶段值计算如下
阶段值 = ln((1-错误率) / 错误率)
其中,阶段值是用于加权模型预测的阶段值,ln()是自然对数,错误率是模型的错误分类错误。阶段权重的作用是,更准确的模型对最终预测具有更大的权重或贡献。
训练权重会更新,给错误预测的实例更大的权重,给正确预测的实例更小的权重。
例如,一个训练实例的权重 (w) 使用以下公式更新
w = w * exp(阶段值 * terror)
其中 w 是特定训练实例的权重,exp() 是数值常数 e 或欧拉数(raised to a power),阶段值是弱分类器的错误分类率,terror 是弱分类器预测训练实例输出变量时产生的错误,评估为:
如果 (y == p),则 terror = 0,否则为 1
其中 y 是训练实例的输出变量,p 是弱学习器的预测。
这会产生以下效果:如果训练实例分类正确,则权重不变;如果弱学习器错误分类了实例,则权重略微增大。
AdaBoost集成
弱模型按顺序添加,使用加权训练数据进行训练。
这个过程会持续到创建了预设数量的弱学习器(一个用户参数),或者在训练数据集上无法再进一步改进为止。
完成后,您将得到一个弱学习器池,每个学习器都带有一个阶段值。
使用AdaBoost进行预测
通过计算弱分类器的加权平均值来进行预测。
对于新的输入实例,每个弱学习器计算一个预测值,为+1.0或-1.0。预测值由每个弱学习器的阶段值加权。集成模型的预测取加权预测的总和。如果总和为正,则预测第一个类别;如果为负,则预测第二个类别。
例如,5个弱分类器可能预测值分别为1.0、1.0、-1.0、1.0、-1.0。根据多数票,模型似乎会预测值为1.0或第一个类别。这5个弱分类器可能分别具有0.2、0.5、0.8、0.2和0.9的阶段值。计算这些预测的加权和,结果输出为-0.8,这将是集成预测的-1.0或第二个类别。
AdaBoost的数据准备
本节列出了一些为AdaBoost准备数据的最佳启发式方法。
- 高质量数据:由于集成方法会不断尝试纠正训练数据中的错误分类,因此您需要确保训练数据质量高。
- 异常值:异常值会迫使集成方法陷入“兔子洞”,努力纠正不切实际的案例。这些异常值可以从训练数据集中移除。
- 噪声数据:噪声数据,特别是输出变量中的噪声,可能会有问题。如果可能,请尝试从训练数据集中分离并清理这些数据。
进一步阅读
以下是一些从机器学习角度描述AdaBoost的机器学习文本。
- 《统计学习导论:R语言应用》,第321页
- 《统计学习的要素:数据挖掘、推理和预测》,第10章
- 《应用预测建模》,第203页和第389页
以下是一些关于该方法的开创性且很好的概述研究文章,如果您想深入探讨该方法的理论基础,可能会有所帮助
- 在线学习的决策理论泛化及其在增强中的应用, 1995
- 使用置信度预测改进增强算法, 1999
- 解释AdaBoost,《经验推理》一章, 2013
- 增强简介, 1999
总结
在这篇文章中,您了解了机器学习中的增强集成方法。您了解了:
- 增强及其作为一种通用技术,通过不断添加弱学习器来纠正分类错误。
- AdaBoost作为第一个成功的二元分类增强算法。
- 通过加权训练实例和弱学习器本身来学习AdaBoost模型。
- 通过加权弱学习器的预测来进行AdaBoost预测。
- 在哪里可以找到AdaBoost算法的更多理论背景。
如果您对这篇文章或增强或AdaBoost算法有任何疑问,请在评论中提问,我将尽力回答。
谢谢您!这篇文章对理解AdaBoost算法非常有帮助。
在文章中,您说:“AdaBoost最适合用于提高决策树在二元分类问题上的性能。”这是什么意思?
这个算法不能用于“水果识别系统”之类的非二元分类问题吗?训练集包含特征矩阵和不同水果的相关名称。我需要为我的研究项目了解这一点。
AdaBoost 是为二元分类(两个输出类别)设计的,并利用决策树。
如果您认为该算法可以用于您的问题,不妨尝试一下,看看它是否有效。
那么,选择机器学习算法是启发式的吗?也就是说,我应该不断实现不同的算法,然后选择最适合我的问题并提供最佳准确度的算法吗?
选择最佳算法甚至问题的最佳表示方式都取决于具体问题。您必须通过实验,凭经验发现最佳组合。
这篇文章非常有帮助!
我有一些关于AdaBoost的问题。首先,AdaBoost中的每个弱学习器或分类器都是基于决策树的,其他算法(如KNN或SVM)可以作为集成学习的基本组件吗?我的第二个问题是,AdaBoost算法如何处理大型动态序列数据集,如全球天气数据或传感器数据集?
非常感谢!
你好 Jessica。我想其他方法也可以使用,但传统上,弱学习器是单层决策树(决策树桩)。如果神经网络是“弱的”,即只有一层并且神经元很少(也许只有一个),它可能会起作用。这可能是一个有趣的实验,我敢打赌如果你想查一下,http://scholar.google.com 上应该有一些相关的文献。
我不熟悉Adaboost在时间序列上的应用。也许有可能,但我还没有见过。我预计可能需要对方法进行重大修改。
嗨,JESSICA,关于你关于ADABOOST算法的问题,这巧合地也是我对这个算法的一个问题,而且由于你提到了全球天气数据或传感器数据集(如不同辐射计和气象卫星的通道)数据集,我能问你是否在气象学或气象卫星数据降水和气候估算领域进行研究?因为这正是我目前的研究领域,我也有同样的问题,关于是否可以使用其他弱分类器,如SVM、ANN或代替决策树桩?,也许Jason BROWNLEE先生可以帮助我们。
由于决策树桩是弱学习器,因此在adaboost中首选它们。
理论上您可以使用其他弱学习器,例如使用小样本或小k值的knn。
在预测新实例时,阶段值是如何确定的,它是否使用训练阶段值?
错误率公式不应该是
错误率 = (N – 正确预测数) / N 吗?
否则你会得到一个负的错误分类率。
显然 😉
嗨,Jason,感谢您对AdaBoost算法的详细阐述。我有一个问题。训练权重在此AdaBoost算法中是如何使用的(意思是AdaBoost算法在构建模型时是否根据权重重复观测值,还是以某种不同的方式使用)?
嗨 Prashant,这些权重用于构建后续的决策树桩。
嗨,Jason,
最后我们会得到一堆权重和模型。这个例子最终的预测是如何决定的?
我们使用加权模型进行预测。
谢谢你,Jason。这非常有帮助。
不客气,很高兴能帮到您。
嗨,Jason,
我想知道在 H(x) = sign(Sum(alpha*h_i(x))) 中,对于 h_i = 1…n,是否存在关于 alphas(学习器权重)的规则。例如,alphas 的和必须等于1,每个 alpha 的值不能 > 1 等等。
据我回忆,没有。如果您在文献中发现任何内容,请告诉我。
谢谢您。会的。
鉴于阶段值 = ln((1-错误率) / 错误率),如果错误率 > 0.5,阶段值可能为负。由于阶段值将用作模型的权重,它能否为负值?
我想我找到了答案并在这里分享
当错误率 > 0.5 时,阶段值可以为负。在这种情况下,弱分类器的权重变为负值,这意味着我们翻转其预测,使弱分类器所说的真变为假,反之亦然。对于弱分类器错误分类的数据点,由于我们翻转了弱分类器的符号,这些数据点实际上被正确分类了。作为补偿,我们通过 w*exp(负值) 来降低它们的权重……
谢谢 Yi。
你好,
您一开始说:-
训练数据集中的每个实例都被赋予权重。权重(xi) = 1/n
所以每个实例都有相同的权重,对吗?
然后在示例中,您说:-
“例如,如果我们有3个训练实例,权重分别为0.01、0.5和0.2。”
为什么上面3个实例有不同的权重,而不是来自(1/n 公式 = .33,.33,.33)的相同权重呢?
正如 Jason 在文章中提到的,在应用下一个分类器之前,权重会根据 w = w * exp(stage * terror) 进行更新。
谢谢Ali。
这篇文章真的很有帮助!我找了很多AdaBoost的介绍。这是最好的!
很高兴听到这个消息。
嗨,Jason,
感谢您的完美描述。我有一个问题!AdaBoost或通常的增强方法是否用于提高一种类型弱学习器的准确性?我的意思是,如果我们有不同类型的学习器,并且它们的表现不准确,我们是否可以使用增强方法来处理它们?基本上,问题是,在这种情况下,我们应该对每种学习器类型单独应用增强,还是应该将所有弱学习器(即使来自不同类型)一起考虑并应用一个增强?
谢谢,
它是为决策树(决策树桩)设计的。
如果您喜欢,可以尝试其他模型。
如果弱分类器对错误预测没有太多共识,你可以。
例如,你有3个分类器c1、c2、c3,它们都错误分类了一个样本。所以你无法进行正确的分类。
另一方面,如果其中至少一个对样本进行了正确分类,你可能就能正确分类该样本。
我认为这就是人们想要弱分类器的主要原因。如果你使用比如说3个强分类器,那么所有3个分类器中都有样本被错误分类的可能性更大。
嗨,Jason,
这是一个很好的解释,谢谢。权重到底是如何影响树学习算法的?它们是否直接输入到信息增益的熵计算中?我猜它们改变了概率的计算方式,但我找不到一个很好的解释。
没错,权重会影响用于选择后续弱学习器分割点的分割标准。这是一种将模型的重心从问题的“简单”部分转移到“更难”部分的方法,具体取决于分割点的参数值。
当我尝试练习Adaboost时,我发现我对“如何通过加权训练数据构建新的弱分类器”仍然不清楚。你提到权重用于计算误差,但让我说我们使用ID3或CART,它们不是误差驱动的。我们如何使用加权训练数据来构建新的ID3/CART?
谢谢!
(P.S. 我发现自己越来越频繁地访问这个地方。非常感谢您提供的非常有用的信息。)
与CART和ID#不同,Boosting会连续创建多棵树。每棵树都建立在加权形式的数据集上,以确保该树专注于前一棵/几棵树表现不佳的区域。后续的树会尝试纠正前一棵树的错误。
希望这能有所帮助。
不完全是~~~
问题1:我们如何构建CART树桩或ID#树桩(在adaboost中)?或者它们不是选项?
问题2:我看到一些例子使用非常简单的公式(如x5.5)作为树桩,它们确实使用权重来衡量误差,但这是我们可以在adaboost中使用的唯一方法吗?
您可以使用一个分割点构建一个树桩。权重可以影响分割点的选择。
是的,这就是AdaBoost算法。
我的“掌握机器学习算法”一书中有一个电子表格的示例。
非常感谢Jason!
我原以为典型的AdaBoost会使用一些“高级”算法作为树桩。例如,如果我尝试在Kaggle中使用AdaBoost。您的指导为我节省了很多时间。
你好,
集成算法中是否有能进行相似性工作的算法?
当然,你可以创建相似性算法的集成。
你好,
集成技术中是否存在一种算法,可以根据特定规则进行相似性预测?
我没听懂,您能换个方式解释一下您的问题吗?
属性1 属性2 属性3 类别标签
类别1 4 5 5
类别2 2 3 1
类别3 4 5 5
类别4 1 3 5
类别5 2 3 1
类别6 4 5 5
现在类别标签的值是1或0
如果属性的值相同则为1,如果没有任何一个相同则为0
例如:类别1、类别3和类别6相同
类别标签值为1
我能使用集成技术得到这个结果吗?
抱歉,我没听懂,您能换个方式解释一下您的问题吗?
嗨,Jason,terror不应该是-1或1吗?因为在更新规则中,(W = W * exp(stage * y_i * h_t))。如果 y_i 是 -1,h_t 是 -1(因此分类正确),它们的乘积将得到 +1,而分类错误将导致 -1?
这篇文章似乎也表达了同样的意思(https://towardsdatascience.com/boosting-algorithm-adaboost-b6737a9ee60c),当它说:“如果一个错误分类的案例来自正加权分类器,分子中的“exp”项将总是大于1(y*f 总是-1,theta_m 是正的)。”
在手动计算中,如果将正确分类的terror设置为0而不是1,会降低总的exp/欧拉值,而将错误分类的terror设置为1而不是-1,则会反过来提高总的欧拉值,这不是我们想要的。我是否遗漏了什么?
嘿 Jason,你有 AdaBoost M1 的例子吗?谢谢你的文章,在我的 AdaBoost 研究中,这是我的最爱 :)
谢谢。抱歉,我不记得了。
我正在参加一个二元分类问题的挑战。训练数据有25万条。我需要生成概率。我发现每次运行,概率都会改变。这使得它变得有问题,因为我无法得到可复现的结果。有什么想法吗?
是的,这是机器学习算法的一个特性。在此了解更多信息
https://machinelearning.org.cn/randomness-in-machine-learning/
这是一种有效评估随机模型的方法
https://machinelearning.org.cn/evaluate-skill-deep-learning-models/
你能建议如何在SVR预测模型上实现AdaBoost吗?
ValueError 回溯 (最近一次调用)
in ()
9 print(X_test)
10 #print(y_test)
—> 11 er_tree = generic_clf(y_train, X_train, y_test, X_test, clf_tree)
在 generic_clf(y_train, X_train_scaled, y_test, X_test_scaled, clf) 中
9 print(pred_train)
10 print(pred_test)
—> 11 clf.fit(X_train_scaled,y_train)
12 pred_train = clf.predict(X_train_scaled)
13 pred_test = clf.predict(X_test_scaled)
~/anaconda3/lib/python3.6/site-packages/sklearn/tree/tree.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
788 sample_weight=sample_weight,
789 check_input=check_input,
–> 790 X_idx_sorted=X_idx_sorted)
791 return self
792
~/anaconda3/lib/python3.6/site-packages/sklearn/tree/tree.py in fit(self, X, y, sample_weight, check_input, X_idx_sorted)
138
139 if is_classification
–> 140 check_classification_targets(y)
141 y = np.copy(y)
142
~/anaconda3/lib/python3.6/site-packages/sklearn/utils/multiclass.py in check_classification_targets(y)
170 if y_type not in [‘binary’, ‘multiclass’, ‘multiclass-multioutput’,
171 ‘multilabel-indicator’, ‘multilabel-sequences’]
–>> 172 raise ValueError(“Unknown label type: %r” % y_type)
173
174
ValueError: 未知标签类型:'continuous'
我的代码显示了这样的错误……
我很抱歉听到这个消息。
您正在尝试运行什么代码?
抱歉,手边没有,需要仔细开发。另外,我认为SVR不适合作为adaboost中的弱模型。
Jason,这对我硕士论文的撰写非常有帮助。感谢您的贡献。
很高兴听到!
先生,请提供adaboost和随机森林集成分类器的代码。
我相信我有,请尝试搜索博客。
嗨,Jason。我快2年没回答这个问题了。我想知道,你是如何利用实例的权重(概率)来“选择”它们作为训练集的一部分的?你是根据权重对实例进行排序,然后只选择权重较高的那些作为下一个训练集的一部分(用于下一个分类器)吗?
好的。我验证了我的答案是否正确。我使用了无放回加权随机数生成器的一个简单技术。
不客气。
嗨 Jason
当您选择高概率的例子时,如何决定划分训练集?您是否通过将具有较高概率的每个例子放回训练集,使所选样本与训练集大小相同?还是只取训练集的一个子集(例如,只取前70%的例子进行训练),然后对整个训练集进行分类以获取训练误差并更新其权重?
这真的取决于问题。
你的目标是拥有一个代表更广泛数据集的训练集和测试集。
只是更新一下我的问题
该算法指出,训练集中的实例每次被正确分类或错误分类时都会被加权,以确保后续的学习器专注于难以分类的实例。我的问题是,从训练集中选择多少个难以分类的实例来训练一个弱分类器。您是选择这些难以分类实例的70%/50%/30%等子集,并将其用于下一次迭代中训练弱学习器吗?还是使用整个加权训练集。如果答案是后者,那么弱学习器如何利用实例权重来使其能够专注于那些权重值较大的实例?
这都是基于训练数据集的。
嗨,Jason,阶段值是否应该乘以0.5?我发现同样的公式中,对数值乘以了0.5。
也许混用公式不是个好主意。请选择一种方法。
嗨,Jason,
非常感谢您的简单解释。
我有一个问题,
1)就模型预测的稳定性而言,您如何比较AdaBoost与XGBoost和随机森林?我知道这些是决策树的不同实现,如果我错了请纠正我。
谢谢。
它们都是集成方法,并且都使用决策树。
比较取决于您可用的数据。也许重复交叉验证是一个好的开始?
谢谢,我会尝试的。
嗨 Jason,非常感谢您分享知识!
关于阶段值和进行预测的问题。由于阶段值 = ln((1-错误率) / 错误率),在实际中,我们可能会得到一个错误率 > 0.5 的预测器,因此阶段值 < 0。在这种情况下,预测器不仅“弱”,而且“差”(因为它比随机猜测还要差,如果训练数据集是平衡的)。我们是否应该将这个预测器纳入预测投票中,并给它分配一个负阶段值,让它对最终分数产生负面贡献(想象我们有一个错误率 = 1 的“糟糕”预测器,那么从某种意义上说它是完美的,因为我们可以基于它做出相反的预测),还是直接丢弃它,因为它不属于“略优于随机猜测”的预测器组?
是的,全部包括在内,您不希望在这个过程中引入偏见。
你好,你如何从头开始使用Python制作adaboost?
我推荐使用 sklearn 库
https://scikit-learn.cn/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html
它如何用于检测欺诈,特别是在信用卡交易中
从对您问题的明确定义开始
https://machinelearning.org.cn/how-to-define-your-machine-learning-problem/
不平衡数据会影响增强算法的性能吗?
可能会。您必须仔细选择模型评估指标。
你好,谢谢你的解释。我想问一下 e_t 是用 D 还是 Dt 来确定?
D是训练数据,Dt是基于权重的样本数据。
抱歉,您指的是什么?
当我们计算错误率时,我们是使用全部训练数据还是我们用来训练模型的样本数据?当预测的加权和等于0时会发生什么?
是的,是整个训练数据集。
当预测的加权和等于0时会发生什么?
你好,我有一个问题。AdaBoost算法与任何类型的弱分类器或某些弱分类器的组合,最终能否达到零训练误差?
可能吧,但它会过度拟合训练数据。
所有模型都会有一些我们无法(也不希望)捕捉到的随机误差。
“在训练新模型时赋予更大权重”到底是什么意思?
我想,“更大权重”是指在为模型训练采样时,选择该实例的概率很高。
如果以上是正确的,那么在训练模型时多次提供相同的实例是否真的会产生任何差异?
就像输入的加权一样,施加到输入上的系数会增加或减少其在决策中的重要性。
即使过了四年,仍然没有另一篇文章能像这篇一样简洁明了。
谢谢!
算法变化不大 🙂
你好,我无法理解正确分类的数据权重是如何减少的?它们的terror为零,所以指数项变为,更新后的w = w。我错过了什么?
或许在进一步阅读部分中的资源会为您提供有用的替代描述?
Jason,你好!
有一个问题一直困扰着我。算法是否可能陷入某种循环,其中一个分类器错误分类了一些点,而下一个分类器纠正了这些点,但现在又错误分类了之前正确分类的点?或者
好问题。
可能吧。这可能是该算法一个有趣的方面,值得研究。
嗨,Jason,请问错误分类率有什么用?
它能让您了解您的模型表现如何(或不如何)。
你好,
由于我正在做与海气相互作用相关的研究。
如果我们不知道两个或更多参数之间的关系,我能使用adaboost技术来寻找两个参数之间的遥相关性,比如两个参数是如何相互关联的?
或者
SOM在这种情况下会很有用。
或许可以构建一个模型原型,并将其结果与其他方法进行比较。
这些缩写HLSTA和HLSPA是什么意思?
抱歉,我以前没见过它们。
在阶段公式ln((1 – 错误率) / 错误率)中,如果ln()内部的计算结果为负,则结果为nan。这是正确的吗?我们可以这样使用abs()吗 → ln(abs((1 – 错误率) / 错误率))?
感谢这篇精彩的文章!
没错。在这种情况下,错误率应该总是小于1。如果不是,您的函数可以防止NaN,但也意味着您的函数对错误率不是单调的。这通常不是我们想要的。
对于错误率计算,您提到了错误率 = (正确预测数 - N) / N,但这个量在大多数情况下会是负数。错误率不应该是 = (N - 正确预测数) / N 吗?
感谢您的反馈!应考虑误差的绝对值。
这和logitboost一样吗?
嗨 Greg……它们非常相似
https://oneapi-src.github.io/oneDAL/daal/algorithms/boosting/logitboost.html