在机器学习中,Boosting 是一种集成元算法,主要用于减少监督学习中的偏差和方差,以及将弱学习器转换为强学习器的一系列机器学习算法。 Boosting 是基于 Kearns 和 Valiant (1988, 1989) 提出的问题「一组弱学习器能否创建一个强学习器?」弱学习器被定义为与真实分类仅轻微相关的分类器(它可以比随机猜测更好地标记示例)。相反,强学习器是与真实分类任意良好相关的分类器。在 Boosting 中,会选择随机数据样本,将其与模型拟合,然后按顺序进行训练 — 也就是说,每个模型都试图弥补其前身的弱点。 在每次迭代中,来自每个单独分类器的弱规则组合成一个强预测规则。
Boosting 的三种方法
各种提升算法在顺序过程中创建和汇总弱学习器的方式可能有所不同。 三种热门的提升法包括:
- 自适应提升,也称为 AdaBoost:AdaBoost 算法是由 Yoav Freund 和 Robert Schapire 创建的。 这种方法以迭代方式运行,发现错误分类的数据点并调整它们的权重,以最大程度减少训练误差。 这种模型以顺序方式持续进行优化,直到产生最强的预测变量。
- 梯度提升:在 Leo Breiman 的研究工作的基础上,Jerome H. Friedman 开发出了梯度提升,其工作原理是将预测变量按顺序添加到集成中,每个预测变量都纠正其前者的错误。 然而,梯度提升训练的是前一个预测变量的残差,而不是像 AdaBoost 那样改变数据点的权重。 之所以使用梯度提升这个名称,是因为它结合了梯度下降算法和提升方法。
- 极限梯度提升,或称为 XGBoost: XGBoost 是梯度提升的一种实现,专为提高计算速度和规模而设计。 XGBoost 利用 CPU 的多个核心,能够在训练期间并行进行学习。
Boosting 的优点
- 易于实施:提升法可与若干超参数调优选项一起使用,以提高拟合度。 提升算法内置了例程以用于处理缺失的数据,因此不需要数据预处理。 采用 Python 时,可利用集成方法的 scikit-learn 库(也称为 sklearn.ensemble),轻松实施热门的提升方法,包括 AdaBoost 、 XGBoost 等。
- 减少偏差:提升算法按顺序组合多个弱学习器,对观察结果进行迭代式改进。 这种方法有助于减少在浅层决策树和逻辑回归模型中常见的高偏差现象。
- 计算效率:由于提升算法只选择能够在训练期间提高其预测能力的特征,因此有助于减少维度,提高计算效率。
Boosting 的挑战
- 过度拟合:关于提升法是有助于减少过度拟合还是会加剧过度拟合,各种研究(链接位于 ibm.com 之外)存在一些争议。 之所以将这一点纳入挑战中,是因为这种情况确有发生,预测无法归纳新的数据集。
- 密集计算: 提升法中的顺序训练很难扩展。 由于每个估算变量都建立在其前代的基础上,因此提升法模型在计算方面开销很大,尽管 XGBoost 试图解决在其他类型的提升法中出现的可扩展性问题。 与装袋法相比,提升算法的训练速度可能更慢,因为大量参数也会影响模型的行为。
参考来源
【1】https://www.ibm.com/cn-zh/topics/boosting