深入解析梯度提升算法:原理、实现与应用

在机器学习的领域中,要提升模型的准确性,仅仅拟合模型和进行预测是远远不够的。在行业和竞赛里,许多获胜的模型都采用了集成技术(Ensemble Techniques)或特征工程(Feature Engineering)来提升性能。其中,集成技术由于相较于特征工程更易于使用,而受到了广泛的欢迎。在众多集成方法中,梯度提升(Gradient Boosting)就是一种能显著提高高级机器学习算法准确性的方法。接下来,我们将逐步、直观且全面地揭开梯度提升的神秘面纱。

什么是梯度提升?

集成学习是通过集合多个“弱”模型来构建一个“强”模型,而梯度提升属于提升方法(Boosting)的范畴。它通过迭代地从每个弱学习器中学习,逐步构建出一个强大的模型,可用于优化回归、分类和排序等任务。本文将重点聚焦于分类问题。

提升方法的灵感源于这样一种直觉:弱学习器可以经过改进而变得更强大。AdaBoost是第一个提升算法,后来杰罗姆·H·弗里德曼(Jerome H. Friedman)等研究人员在此基础上改进出了用于回归的梯度提升算法。此后,许多研究人员将该算法拓展到了机器学习和统计学的更多领域。

梯度提升中的“梯度”指的是同一函数的两个或多个导数。它是一种迭代的函数梯度算法,通过迭代地选择指向负梯度的函数(即弱假设)来最小化损失函数。

梯度提升的主要组成部分

损失函数

损失函数的作用是评估模型在给定数据上的预测能力。不同的问题需要不同的损失函数。例如,在预测一个人的体重(回归问题)时,损失函数用于衡量预测体重与实际体重之间的差异;而在根据一个人的个性判断其是否会喜欢某部电影(分类问题)时,损失函数则用于评估模型对喜欢和不喜欢该电影人群的分类准确性。

弱学习器

弱学习器对数据进行分类的效果较差,其错误率可能与随机猜测差不多。通常,弱学习器是决策树(也称为决策桩,因为它们比典型的决策树更简单)。

加法模型

这是一种迭代和顺序的方法,每次添加一棵决策树(弱学习器)。每次迭代后,我们都要更接近最终模型,也就是说,每次迭代都应降低损失函数的值。

梯度提升在分类问题中的直观理解

以泰坦尼克号乘客生存预测问题为例,我们根据乘客的年龄、性别等特征来预测他们的生存情况。首先,我们有一个初始叶节点,它为每个乘客预测初始值,在分类问题中,这个值是目标值的对数几率(log(odds))。将对数几率转换为概率后,如果生存概率大于0.5,我们先将训练数据集中的所有人都分类为幸存者。

接下来,我们计算伪残差(Pseudo Residual),即观测值与预测值之间的差异。利用这些残差来构建下一棵决策树。由于决策树的叶子节点数量有限,一个叶子节点可能包含多个值。而且,由于预测是基于对数几率,而叶子节点是从概率推导而来的,因此需要进行某种转换。最常见的转换形式是:分子为该特定叶子节点中的残差之和,分母为每个残差的先前预测概率乘以(1 - 相同的先前预测概率)之和。

在得到转换后的决策树后,我们将初始叶节点与新树以一个学习率相加。学习率用于缩放新树的贡献,通常是一个较小的数,如0.1。通过这种方式,我们可以计算出新的对数几率预测和概率,并重复这个过程,直到达到指定的最大树数量或残差变得非常小。

梯度提升的数学理解

设输入变量为 x i x_i xi,目标变量为 y i y_i yi。我们可以根据预测概率来预测数据的对数似然。目标是最大化对数似然函数,因此,如果我们使用对数似然作为损失函数,较小的值表示模型拟合得更好。

经过一系列的数学推导,我们将预测概率 p p p 转换为对数几率,得到损失函数。为了构建模型,我们需要对损失函数进行求和,并找到使这个和最小化的对数几率值。然后,我们计算每个损失函数的导数,根据导数计算残差。

接着,我们拟合一个回归树到残差上,并创建终端区域。对于新树的每个叶子节点,我们计算输出值 γ \gamma γ。由于损失函数中包含大量变量,直接求导计算 γ \gamma γ 非常繁琐,因此我们使用二阶泰勒多项式来近似损失函数。经过一系列计算,我们得到了 γ \gamma γ 的公式。

最后,我们更新预测值,使用新的预测值来计算新的预测结果。在实际应用中,梯度提升会构建很多棵树,M 可能高达 100 或更多。

梯度提升在 Python 中的实现

我们使用 Kaggle 上的泰坦尼克号数据集进行实践。首先,导入所需的库,如 pandassklearn.ensemble.GradientBoostingClassifier 等。然后,加载训练和测试数据,并查看数据的基本信息。

接着,我们对数据进行预处理,包括删除不必要的列、将对象类型转换为数字、填充缺失值、使用 MinMaxScaler 进行数据转换以及将训练集随机拆分为训练子集和验证子集。

之后,我们使用不同的学习率(如 0.05、0.1、0.25、0.5、0.75、1)训练梯度提升算法,并检查在训练集和验证集上的准确率。

与 AdaBoost 的比较

AdaBoost 和梯度提升都是从一组弱学习器中顺序学习,通过加法模型得到一个强学习器。AdaBoost 需要用户指定一组弱学习器,它会增加错误预测实例的权重,减少正确预测实例的权重,使弱学习器更关注困难实例。训练后,弱学习器根据其性能(所谓的 alpha 权重)添加到强学习器中。

而梯度提升不修改样本分布,弱学习器在强学习器的剩余误差上进行训练。在每次迭代中,计算伪残差并拟合一个弱学习器到这些伪残差上。弱学习器对强学习器的贡献不是根据其在新分布样本上的性能计算,而是使用梯度下降优化过程,计算出的贡献是使强学习器的整体误差最小化的贡献。可以说,Adaboost 更侧重于“投票权重”,而梯度提升更侧重于“添加梯度优化”。

梯度提升的优缺点

优点
  • 高预测准确性:通常能提供难以超越的预测准确性。
  • 灵活性高:可以在不同的损失函数上进行优化,并提供多种超参数调整选项,使函数拟合非常灵活。
  • 无需数据预处理:通常可以直接处理分类和数值数据。
  • 处理缺失数据:无需进行数据插补。
缺点
  • 过拟合风险:梯度提升模型会不断改进以最小化所有误差,这可能会过度强调异常值并导致过拟合。
  • 计算成本高:通常需要许多棵树(>1000),这可能会消耗大量的时间和内存。
  • 参数调整复杂:高度的灵活性导致有许多相互作用并严重影响方法行为的参数(如迭代次数、树深度、正则化参数等),这在调优时需要进行大量的网格搜索。
  • 可解释性较差:虽然可以通过各种工具解决,但本质上可解释性相对较差。

梯度提升算法在理论和实践上都展现出了强大的能力,是构建分类和回归预测模型的有力技术。但由于其容易在训练数据集上过拟合的问题,我们可以利用不同的约束或正则化方法来提高算法的性能并防止过拟合,如惩罚学习、树约束、随机抽样和收缩等。许多现实生活中的机器学习挑战都可以通过梯度提升来解决,希望本文能鼓励你深入探索梯度提升,并将其应用到实际的机器学习问题中,提升模型的准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值