跳至主要内容

什么是 Boosting?

Boosting 通过顺序纠错并将弱学习器组合为强预测器来提升机器学习性能。
· 11分钟 阅读

使用 AI 探索

机器学习的最新进展带来了处理复杂问题的新方法。Boosting 就是一项持续展现潜力的技术。它通过使用多个算法来提升表现,正在改变我们进行数据建模的方式。随着 boosting 概念不断演进,像 Gradient Boosting 和 XGBoost 这样的新变体相继出现,将速度与精度的边界进一步推高。

如果您觉得在预测建模方面需要学习的内容很多,也无需担心。试试我们的Python 助理数据科学家或Python 数据科学家职业路线,以及我们的探索集成学习技术教程,持续进阶。

机器学习中的 Boosting

Boosting 是一种强大的集成学习方法,专为通过组合多个弱学习器——表现仅略优于随机猜测的模型——来提升预测模型的准确性而设计。

Boosting 的核心在于一个迭代过程:每个弱学习器都被训练来纠正其前一个学习器的错误,从而逐步提升整体模型的性能。通过聚焦先前模型的错误,boosting 能将一组弱学习器转化为更准确的模型。

Boosting 的工作原理

Boosting 通过一套系统性流程,在顺序训练模型时聚焦于降低误差,将弱学习器转化为统一的强学习器。其步骤包括:

  1. 选择初始权重:为所有数据点分配初始权重,以表示其在学习过程中的重要性。
  2. 顺序训练: 先在数据上训练第一个弱学习器。评估其表现后,提高被误分类样本的权重,使下一个弱学习器更多关注这些较难的样本。
  3. 迭代该过程:重复调整权重并训练后续学习器。每个新模型都会聚焦于当前集成模型的弱点。
  4. 合并结果: 聚合所有弱学习器的预测,形成最终输出。聚合通常是加权的,更准确的学习器权重更高、影响更大。

该方法通过更侧重训练数据中的难例,有效降低误差,从而实现强大的预测性能。

Boosting 算法的类型

下面来看几种最知名的 boosting 算法。

AdaBoost(自适应 Boosting)

AdaBoost 是最早的 boosting 算法之一。它在每次加入学习器时都会重新加权训练样本,更强调那些被错误分类的实例。AdaBoost 尤其适用于二分类问题。阅读我们的Python 中的 AdaBoost 分类器教程了解更多。

Gradient Boosting

Gradient Boosting 以序列方式构建模型,并在过程中不断纠错。它在添加新模型时使用梯度下降算法来最小化损失。该方法灵活,可用于回归和分类问题。我们的教程梯度提升算法指南对此进行了详细介绍。

XGBoost(Extreme Gradient Boosting)

XGBoost 是一个优化的分布式梯度提升库,是许多 Kaggle 比赛获胜者的常用方法。它被设计为高效、灵活且可移植。在梯度提升框架下实现了多种机器学习算法,为众多实际数据问题提供了可扩展且准确的解决方案。若想更深入学习,请查看我们的在 Python 中使用 XGBoost教程,并参加专项课程:Extreme Gradient Boosting with XGBoost。

集成方法

Boosting 属于更广义的集成方法。集成方法是一类机器学习思路,通过组合多个模型来生成比任何单个模型通常能达到的更准确的预测。这些技术利用不同模型的多样性——各自的长处与局限——来形成一个集体的决策过程。

不同类型的集成方法

Boosting 是突出的集成学习技术,但它只是众多增强模型预测能力的方法之一。我们再看几个其他方法。

  • Bagging(自助聚合):在训练数据的随机子集上训练多个模型并聚合其预测。它可降低方差,帮助避免过拟合。
  • Stacking(堆叠泛化):通过训练一个元模型来学习如何最佳组合基模型的预测,从而整合多个模型。它可以捕捉单个模型可能遗漏的复杂模式。
  • Blending:与 stacking 类似,但使用划出的验证集而非交叉验证来训练元模型。它比 stacking 更简单、更快速,但可能不如其稳健。
  • Voting:通过多数表决(硬投票)或对预测概率加权平均(软投票)来组合多个模型的预测。实现简单,对多样化的基模型也常常有效。

Boosting 与 bagging 的对比

Boosting 常被拿来与 bagging 做比较。尽管两者有相似之处,但差异也很大。下表比较了 boosting 与 bagging:

特性BoostingBagging
概念侧重点通过聚焦先前被误分类的样本,按序提升准确性。在随机子集上训练多个模型,并对其预测求平均。
模型训练顺序训练使每个模型都能从前一个模型的错误中学习。在不同样本上并行训练模型,以提升多样性。
误差降低主要降低偏差,同时在较小程度上降低方差。降低方差,尤其在易过拟合的复杂模型中效果明显。
对异常值的敏感性更敏感,因为更关注被误分类的数据。较不敏感,因随机抽样会稀释异常值的影响。
示例AdaBoost、Gradient Boosting、XGBoost。随机森林(Random Forests)、自助聚合(Bootstrap Aggregating)。

如果您想进一步了解 bagging,请阅读我们的教程机器学习中的 Bagging 是什么?,其中使用了 sklearn。

在 Python 中实现 Boosting

理解 boosting 的最佳方式之一就是动手实践。为此,我们将使用这个 Kaggle 数据集:Almond Types Classification,其中包含三种杏仁:MAMRA、SANORA 和 REGULAR,以及它们独特的物理属性,如面积、周长、圆度等。

每个杏仁样本的特征均通过复杂的图像处理技术提取。数据集中的空值代表这样一些情况:杏仁的朝向——竖直、侧放或背面朝上——影响了特征提取过程的准确性。

现在我们用该数据集来进行一次分类任务。我们将使用 AdaBoost 算法,正如前文所述,它通过将多个弱学习器组合为一个强学习器来提升模型表现。

1. 导入库

我们先导入必要的库并加载杏仁数据集,然后分离特征与目标变量。

import pandas as pd
almonds = pd.read_csv('Almond.csv', index_col=0)
X = almonds.drop('Type', axis=1)  
y = almonds['Type']

2. 处理缺失数据

接着我们使用 KNN 插补器填补缺失值,清洗数据集。这样可以确保用于建模的数据是完整的。

from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
X_imputed = imputer.fit_transform(X)

3. 划分训练集与测试集

我们将数据划分为训练集与测试集,以评估模型在新数据上的表现。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_imputed, y, test_size=0.2, random_state=42)

4. 训练决策树分类器

这里我们先训练一个简单的决策树模型,作为在进一步提升之前的基线准确率。

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
tree = DecisionTreeClassifier(max_depth=1, random_state=42)
tree.fit(X_train, y_train)
tree_accuracy = accuracy_score(y_test, tree.predict(X_test))

5. 使用 AdaBoost 提升性能

随后我们用 AdaBoost 聚焦决策树的错误,从而提升其准确率。

from sklearn.ensemble import AdaBoostClassifier
ada = AdaBoostClassifier(base_estimator=tree, n_estimators=100, learning_rate=1.0, random_state=42)
ada.fit(X_train, y_train)
ada_accuracy = accuracy_score(y_test, ada.predict(X_test))

# Print the accuracies
print(f'Accuracy of the weak learner (Decision Tree): {tree_accuracy * 100:.2f}%')
print(f'Accuracy of AdaBoost model: {ada_accuracy * 100:.2f}%')

6. 最终输出

最后,我们对比结果,看看 AdaBoost 如何显著提升准确率。

Accuracy of the weak learner (Decision Tree): 43.14%
Accuracy of AdaBoost model: 61.50%

那么结论是什么?结果展示了通过 AdaBoost 实现的集成学习威力。此处的弱学习器是最大深度仅为 1 的决策树,准确率约为 43%。考虑到只有三类杏仁,43% 的准确率并不比平均猜测高出太多。然而,当这个弱学习器作为 AdaBoost 模型的基学习器并迭代 100 次后,准确率提升到了 62%。

退一步来看,需要提醒的是,尽管 AdaBoost 在我们的杏仁数据集上报告了更高的准确率,但它未必总是每种情境的最佳选择。尤其在这类较小的数据集上,存在过拟合风险,模型可能变得过于复杂。实际上,对于某些任务,更简单的分类技术同样可能表现良好甚至更佳。因此,虽然我们在此用 AdaBoost 解释了概念,但重要的是要回过头考虑:我们是否真的需要如此高的复杂度。

结论

Boosting 代表了机器学习领域的一项重要进步,展现了集成方法在提升预测准确性方面的力量。正如我们所探讨的,AdaBoost、Gradient Boosting 和 XGBoost 等算法基于同一基本原则:将多个弱模型组合为一个更有效的预测器。

不过,务必记住,boosting 只是机器学习工具箱中的一件工具。其有效性会因具体问题而异。与任何机器学习技术一样,了解何时以及如何应用 boosting,才是发挥其全部潜力的关键。

若要加深对 boosting 及其他机器学习概念的理解,建议探索 DataCamp 的综合职业路线:Machine Learning for Everyone。如果您希望进一步专业化,Machine Learning Scientist with Python 职业路线提供有关高级技术与实践应用的深入训练。

Vinod Chugani

作者

Vinod Chugani

Vinod Chugani 的职业生涯始于东京,曾任摩根大通最年轻的对冲基金销售台负责人,随后在雷曼兄弟创下个人销售纪录,之后又打造了覆盖 30 个国家的电子分销业务,营收突破 1 亿新元,随后转向数据领域。他毕业于杜克大学经济学专业,亦为 NYC Data Science Academy 校友,并在 100 多名申请者中成为Hugo Bowne-Anderson 在 Maven 开设的 “Building AI Applications” 课程的三位奖学金获得者之一。目前,他为 DataCamp、KDnuggets、Machine Learning Mastery 和 Statology 撰稿,内容涵盖从统计学到代理式 AI 等主题,并在 NYC Data Science Academy 指导数据从业者,已完成超过 1,000 场一对一辅导。

 

常见问题解答

机器学习中的 boosting 是什么?

Boosting 是一种集成学习技术,用于提升预测模型的准确性。它将多个弱学习器——表现仅略高于随机猜测的模型——组合成一个强学习器,从而显著增强整体模型表现。

Boosting 与 bagging 有何不同?

Boosting 与 bagging 都是通过组合多个模型来改进预测的集成技术,但运作方式不同。Boosting 按序训练模型,每个新模型聚焦前一模型的错误,以降低偏差并提升准确性。相反,bagging 在数据的不同子集上并行训练模型,并对其输出求平均,以降低方差并增强稳定性。由于聚焦难例,boosting 对噪声与异常值更敏感;而 bagging 由于采用平均化方式,对此更为稳健。

Boosting 是否可同时用于分类与回归问题?

是的,boosting 技术既可用于分类也可用于回归。虽然 AdaBoost 更常用于分类问题,但像 Gradient Boosting 这样的变体也能有效用于回归。

如何选择 boosting 的迭代次数?

Boosting 的迭代次数(或弱学习器的数量)通常取决于具体数据集和问题复杂度。可通过交叉验证等方法确定,以在欠拟合与过拟合之间取得平衡。

AdaBoost 与 Gradient Boosting 等其他 boosting 技术有何不同?

AdaBoost 会提高被误分类实例的权重,以便后续模型聚焦这些困难样本。相比之下,Gradient Boost 则将新学习器拟合到先前模型的残差误差上。

使用 AdaBoost 的主要优势有哪些?

AdaBoost 的主要优势在于其简单、有效,且无需事先了解弱学习器的细节。它也非常灵活,几乎可与任意学习算法结合,并常在其他方法可能吃力的分类任务中取得很好的效果。

在提升机器学习模型性能方面,AdaBoost 的一些重要替代方案有哪些?

除 AdaBoost 外,值得关注的替代方案包括 Gradient Boosting、XGBoost、CatBoost、LightGBM 和 HistGradientBoost。

除 boosting 外,还有哪些类型的集成学习方法?

除 boosting 之外,常见的集成学习形式包括 bagging 和 stacking,它们采用不同策略整合模型以最大化预测能力。

主题