什么是 Boosting
Boosting 通过按顺序纠正错误并将弱学习器组合成强预测器来提高机器学习性能。机器学习的最新进展引入了解决复杂问题的新方法。Boosting 是一种不断显示出希望的技术。它通过使用多种算法来提高性能,从而改变了我们进行数据建模的方式。随着 Boost 概念的不断发展,Gradient Boosting 和 XGBoost 等更新的变体已经出现,突破了速度和准确性的界限。
机器学习中的提升
Boosting 是机器学习中一种强大的集成学习方法,专门设计用于通过将多个弱学习器(性能仅比随机猜测稍好一点的模型)组合到一个强学习器中来提高预测模型的准确性。
提升的本质在于迭代过程,其中每个弱学习器都经过训练以纠正其前身的错误,从而逐渐增强整体模型的性能。通过关注早期模型所犯的错误,Boosting 将一组较弱的学习器转换为更准确的模型。
提升的工作原理
Boosting 通过一个系统的过程将弱学习者转变为一个统一的强学习者,该过程专注于减少顺序模型训练中的错误。涉及的步骤包括:
- 选择初始权重:为所有数据点分配初始权重,以表明它们在学习过程中的重要性。
- **按顺序训练:**根据数据训练第一个弱学习器。评估其性能后,增加错误分类实例的权重。这使得下一个较弱的学习器更专注于更难的情况。
- 迭代过程:重复调整权重和培训后续学习者的过程。到目前为止,每个新模型都侧重于集成 (ensemble) 的弱点。
- 合并结果:聚合所有弱学习器的预测以形成最终输出。聚合通常是加权的,其中更准确的学习者具有更大的影响力。
这种方法通过更集中地关注训练数据中的困难情况,有效地最大限度地减少了错误,从而产生了强大的预测性能。
提升算法的类型
让我们来看看一些最著名的提升算法。
AdaBoost(自适应提升)
AdaBoost 是最早的提升算法之一。它侧重于在每次添加学习者时重新加权训练示例,更加强调分类不正确的实例。AdaBoost 对于二进制分类问题特别有效。
梯度提升
梯度提升按顺序构建模型并在此过程中纠正错误。它使用梯度下降算法来最大限度地减少添加新模型时的损失。此方法非常灵活,可用于回归和分类问题。
XGBoost(极端梯度提升)
XGBoost 是一个优化的分布式梯度提升库,也是 Kaggle 上许多比赛获胜者的首选方法。它旨在实现高效、灵活和便携。它在 Gradient Boosting 框架下实施机器学习算法,为许多实际数据问题提供可扩展且准确的解决方案。
集成方法
Boosting 属于较大的集成方法组。集成方法是一种机器学习方法,它结合了多个模型来产生比任何单个模型通常无法单独实现的更准确的预测。这些技术的工作原理是利用不同模型的多样性,每个模型都有自己的优点和局限性,以创建一个集体决策过程。
不同类型的集成方法
Boosting 是一种突出的集成学习技术,但它只是增强模型预测强度的几种技术之一。让我们来看看其他几个。
- **Bagging (Bootstrap Aggregating):**一种在训练数据的随机子集上训练多个模型并聚合其预测的方法。它减少了方差并有助于避免过度拟合。
- **Stacking (Stacked Generalization):**一种通过训练元模型来组合多个模型以了解如何最好地组合基础模型的预测的技术。它可以捕获单个模型可能会遗漏的复杂模式。
- **Blending:**类似于 stacking,但使用保留的验证集来训练元模型,而不是交叉验证。它比堆叠更简单、更快捷,但可能不那么可靠。
- **投票:**通过多数投票(硬投票)或预测概率的加权平均值(软投票)组合来自多个模型的预测。它易于实现,并且对各种基本模型非常有效。
代练 vs. 装袋
Boosting 通常被比作 bagging。尽管它们在某些方面相似,但肯定存在很大差异。下表比较了代练和装袋:
特征 | 提高 | 装袋 |
---|---|---|
概念重点 | 通过关注以前错误分类的示例,按顺序提高准确性。 | 在随机子集上训练多个模型,对其预测进行平均。 |
模型训练 | 顺序训练允许每个模型从前一个模型的错误中学习。 | 在不同数据样本上对模型进行并行训练增加了多样性。 |
减少错误 | 主要减少偏差,并在较小程度上减少方差。 | 减少方差,尤其是在容易过度拟合的复杂模型中。 |
对异常值的敏感度 | 由于更加关注错误分类的数据,因此更加敏感。 | 由于随机抽样会稀释异常值的影响,因此灵敏度较低。 |
例子 | AdaBoost、梯度提升、XGBoost。 | 随机森林,Bootstrap 聚合。 |
Python 中的 Boosting 实现
了解提升的最佳方法之一是尝试在实践中展示它。为此,我们将使用这个 Almond Types Classification Kaggle 数据集,该数据集具有三种类型的杏仁:、 和 ,以及它们独特的物理属性,例如面积、周长和圆度。MAMRASANORAREGULAR
每个杏仁样品的特征都是通过复杂的图像处理技术提取的。数据集中的 Null 值表示杏仁的方向(无论是直立、侧放还是仰卧)影响特征提取过程准确性的实例。
现在,我们使用此数据集来尝试分类任务。我们将使用 AdaBoost 算法,正如我们所说,该算法通过将弱学习器组合成一个强学习器来提高模型性能。
导入库
我们首先导入必要的库并加载 almond 数据集。然后,我们拆分特征和目标变量。
import pandas as pd
almonds = pd.read_csv('Almond.csv', index_col=0)
X = almonds.drop('Type', axis=1)
y = almonds['Type']
处理缺失数据
接下来,我们通过使用 KNN 插补器填充缺失值来清理数据集。这确保了我们的模型有一个完整的数据集。
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=5)
X_imputed = imputer.fit_transform(X)
拆分数据以进行训练和测试
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)
训练决策树分类器
我们在这里训练一个简单的决策树模型,它为我们提供了基线准确性,然后再继续提高其性能
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))
使用 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}%')
最终输出
最后,我们比较结果,了解 AdaBoost 如何显著提高准确性。
Accuracy of the weak learner (Decision Tree): 43.14%
Accuracy of AdaBoost model: 61.50%
那么,收获是什么?结果说明了通过 AdaBoost 进行集成学习的力量。在这里,弱学习器是一个最大深度仅为 1 的决策树,其准确率约为 43%。鉴于只有三种杏仁,43% 的准确率并不比猜测的平均值高多少。但是,当这个弱学习器在具有 100 次迭代的 AdaBoost 模型中用作基本估计器时,准确率提高到 62%。
退后一步,需要注意的是,虽然 AdaBoost 在我们的 Almonds 数据集上报告了更高的准确性,但它可能并不总是最适合每种情况。存在过度拟合的风险,尤其是对于像这样的较小数据集,模型可能会变得过于复杂。实际上,更简单的分类技术对于某些任务的性能可能同样好,甚至更好。因此,虽然我们在这里使用 AdaBoost 来说明这个概念,但重要的是要退后一步,考虑一下我们是否真的想要高级别的复杂性。
结论
Boosting 代表了机器学习领域的重大进步,展示了集成方法在提高预测准确性方面的力量。正如我们所探索的,AdaBoost、Gradient Boosting 和 XGBoost 等提升算法基于一个基本原理运行:组合多个弱模型以创建单个更有效的预测器。
但是,重要的是要记住,提升只是机器学习工具包中的一种工具。它的有效性可能因具体问题而异。与任何机器学习技术一样,了解何时以及如何应用提升是其充分发挥潜力的关键。