社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

【机器学习】图解 XGBoost 参数,构建稳健模型

机器学习初学者 • 8 月前 • 202 次点击  

然而,它通过参数控制提高预测性能——就像是解锁性能、平衡复杂性,甚至使模型更易于解释。尽管 XGBoost 被广泛使用,但它的参数在大多数情况下还是个黑匣子,其潜力尚未得到充分挖掘。

理解这些参数以及它们如何促进更好的泛化并防止过拟合,对于构建在实际应用中表现良好的健壮且可解释的模型至关重要。

XGBoost 核心参数

XGBoost 参数主要分为三类:(1) 通用参数,(2) booster 参数,以及 (3) 学习任务参数。通用参数决定了模型的整体行为,例如决定是否使用基于树或线性增强器另一方面,学习任务参数定义了模型的目标,例如回归或分类。

然而,真正的魔力在于增强器参数,它们可以微调增强算法的内部运作。这些参数是控制决策树的构建、平衡和性能优化的杠杆。在本文中,我们将探讨最常用的树增强器参数,以及它们如何帮助最大限度地发挥模型的性能。

1. max_depth

参数 max_depth 决定了树的最大深度,控制树可以进行多少次拆分。较小的值会创建更简单的树,这些树侧重于数据中的广泛模式,但可能会忽略复杂的关系。相比之下,较大的值允许树捕获更复杂的模式和交互,但会增加过度拟合的风险。

下图展示了这种权衡。深度为 2 的树只需进行高层级的拆分,就能捕捉数据中的广泛模式。

深度为 2 的树
max_depth为 2 的树

通过深度为 3 的树,可以引入额外的分割,从而创建更多选项来优化预测并捕获数据集中的更精细的细节。

深度为 3 的树
max_depth为 3 的树

当然,深度为 3 仍然很小,但这只是为了说明目的。分割选项的数量会随着深度的增加而呈指数增长,从而允许随着此参数的增加而对越来越复杂的模式进行建模。

2. min_child_weight

参数min_child_weight控制树中拆分所需的最小数据量。如果该值设置得太低,树甚至可能基于非常小的数据子集进行拆分,这可能会导致过度拟合。另一方面,如果该值设置得较高,树会变得更加保守,仅在有大量数据支持的情况下才进行拆分。这有助于防止模型在捕获有意义的模式的同时,捕获数据中的噪声。

例如,考虑下面min_child_weight=10 以及 max_depth=2的树。由于较低的阈值允许较小的子节点,因此它表现出更多的分裂。该树能够捕捉数据中更精细的细节和细微的变化,从而做出更精细的预测。

min_child_weight=10 的树,显示多个拆分和较小的叶节点,以实现更细粒度的预测。绿色标签对应于每个节点上数据点的原始计数
min_child_weight=10 的树,显示多个拆分和较小的叶节点,以实现更细粒度的预测。绿色标签对应于每个节点上数据点的原始计数

相比之下,使用min_child_weight=50生成的树由于阈值较高(要求子节点包含更大的样本权重(或原始计数)),分裂次数较少。这导致树结构更简单,更侧重于数据中更普遍的模式。

min_child_weight=50 的树,表明更少的分裂和更大的叶节点,以实现更强的正则化和更广泛的泛化。绿色标签对应于每个节点上数据点的原始计数
min_child_weight=50 的树,表明更少的分裂和更大的叶节点,以实现更强的正则化和更广泛的泛化。绿色标签对应于每个节点上数据点的原始计数

注意:样本权重决定了训练期间每个数据点的相对重要性。如果未指定sample_weight,XGBoost 默认平等对待所有样本,并使用数据点的原始计数来强制执行类似 min_child_weight 的约束。当某些样本需要优先处理时,例如在不平衡的数据集、噪声数据或特定样本对预测任务更重要的场景中,应使用自定义样本权重。

3. learning_rate

learning_rate控制每次 boosting 迭代中的步长eta,决定每棵树对整体预测的贡献程度。较低的学习率会导致学习速度较慢但更稳定。这通常需要更多的 boosting 迭代才能达到最优模型,但可以降低过拟合的风险。相比之下,较高的学习率可以使模型快速收敛,但存在超出最优解的风险,从而导致泛化能力较差。

低、高和良好学习率的折线图(损失与提升迭代)
低、高和良好学习率的折线图(损失与提升迭代)

上图显示了这种权衡:较低的学习率可以稳步提高,但需要多次迭代; 较高的学习率可以快速收敛,但平台期较差;良好的学习率可以达到适当的平衡,在保持泛化能力的同时有效地实现低损失。

4. gamma

参数 gamma 控制模型在决策树中进行拆分时的保守程度。具体来说,它设置了拆分所需的损失函数的最小减少量。当 gamma 值较低时,即使损失函数的改善非常小,模型也允许拆分,从而导致拆分次数增加并可能造成过拟合。另一方面,当 gamma 值较高时,只有当拆分能够显著改善损失函数时才允许拆分,这有助于防止过拟合并创建更简单的决策树。

具有低gamma值(大量小分裂)和高伽马值(更少、更有意义的分裂)的树
具有低gamma值(大量小分裂)和高gamma值(更少、更有意义的分裂)的树

如上图所示,低 gamma 树包含许多小的拆分——尽管这些额外的拆分并不能显著降低损失,但由于  gamma 值较小,它们被允许形成。相比之下,高 gamma 树的拆分更少,但更加显著,侧重于总体趋势,从而提高了模型的简单性和鲁棒性。

5. subsample

参数 subsample 控制用于生长每棵树的训练数据比例。XGBoost 不会使用整个数据集,而是根据 subsample 为每棵树随机选择一部分数据集。这样做有助于提高模型的鲁棒性,并提升其对未知数据的泛化能力。

构建每棵树的数据点的随机子采样
构建每棵树的数据点的随机子采样

上图展示了当subsample设置为 0.7 时的效果。模型随机选择 70% 的训练数据作为子样本来构建每棵树,从而引入了随机性并增强了树的鲁棒性。

6. colsample_bytree

参数 colsample_bytree控制用于构建每棵树的特征(列)的比例。XGBoost 不会为每棵树使用所有可用的特征,而是根据此参数值随机选择一个子集。

根据 colsample_bytree 中选择的特征比例对数据点进行随机子采样
根据 colsample_bytree 中选择的特征比例对数据点进行随机子采样

上图展示了colsample_bytree=0.6的效果,其中每棵树的构建仅随机选择了 60% 的特征(在本例中为 5 个特征中的 3 个)。通过引入这种特征级随机性,该模型减少了过拟合并提高了泛化能力,尤其是在具有大量特征的数据集中。

7. scale_pos_weight

参数scale_pos_weight主要应用于分类任务,有助于处理不平衡数据集,即某个类别的出现频率明显高于其他类别。本质上,它会在训练过程中调整正类和负类的重要性,确保模型更加关注少数类。对于二分类,scale_pos_weight通常设置为(负样本数量)/(正样本数量)。这可以确保类之间的损失平衡,防止模型忽略少数类而过于关注多数类。

左图:不平衡数据集的图示,导致决策边界偏向多数类。右图:应用 scale_pos_weight 后的不平衡数据集的图示,导致决策边界发生偏移,从而更好地包含少数类。
左图:不平衡数据集的图示,导致决策边界偏向多数类。右图:应用 scale_pos_weight 后的不平衡数据集的图示,导致决策边界发生偏移,从而更好地包含少数类。

在上图中,左侧面板表示没有 scale_pos_weight的情况,其中决策边界有利于多数类(绿色),而右侧面板显示了应用scale_pos_weight如何为少数类分配更多权重(红色),从而导致决策边界发生变化以更好地包含这些数据点。

8. alpha

参数alpha控制树的叶子节点权重的L1 正则化。L1 正则化会根据叶子节点权重的绝对值,对损失函数添加惩罚,从而促使部分权重恰好变为零。这会导致模型更加稀疏,在分割过程中有效使用的特征更少。

具有低 alpha(大量小分裂)和高 gamma(较少分裂,一些分支被修剪,因为它们的叶子权重减小到零)的树的插图。
具有低 alpha(大量小分裂)和高 gamma(较少分裂,一些分支被修剪,因为它们的叶子权重减小到零)的树的插图。

顶部的树显示了更复杂的结构,包含许多分支,反映了未应用 L1 正则化(alpha 值较低或为 0)的情况。所有特征都积极地参与了分支,从而形成了稠密的树。相比之下,底部的树展示了如何通过增加此参数来减少分支数量,从而简化树。由于 L1 惩罚,一些分支被有效地剪枝,从而产生了更稀疏的模型,降低了过拟合的可能性。

9. lambda

alpha类似,参数lambda控制L2 正则化,但它不关注绝对值,而是根据叶子权重的平方添加惩罚项。这会抑制过大的权重,平滑值而不是强制其为零,这也有助于减少过拟合,使模型更加平衡,但不会过于激进。

说明低 lambda 值会导致分配较大的叶子权重,而高 lambda 值会导致叶子值变得平滑并且模型更加稳健。
说明低 lambda 值会导致分配较大的叶子权重,而高 lambda 值会导致叶子值变得平滑并且模型更加稳健。

上图展示了这种效果。在上图中,树允许较大的、变化的叶子权重(例如 22、-16 等),这可能导致过拟合,尤其是在噪声数据中。然而,在下图中,应用了更强的正则化,这使得叶子值更加平滑(例如 3、-2 等),从而使树的预测更加平衡和稳健。

写在最后

希望以上示例能让更清晰、更直观地理解 XGBoost 的核心参数及其对模型行为的影响。调整诸如etagammasubsample以及正则化项( alphalambda)之类的参数,关键在于在复杂性和泛化能力之间找到适当的平衡。根据我的经验,深思熟虑的实验和对这些概念的扎实掌握,对于构建真正在现实世界中表现优异的模型至关重要。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/184715