XGBoost 参数
在运行 XGBoost 之前,我们必须设置三种类型的参数:通用参数、提升器参数和任务参数。
通用参数 与我们在提升过程中使用的提升器相关,通常是树模型或线性模型
助推器参数 取决于你选择的助推器
学习任务参数 决定了学习场景。例如,回归任务可能使用与排序任务不同的参数。
命令行参数 与 XGBoost 的 CLI 版本的行为相关。
备注
R 包中的参数
在R包中,你可以使用 . (点) 来替代参数中的下划线,例如,你可以使用 max.depth 来表示 max_depth。下划线参数在R中也是有效的。
全局配置
以下参数可以在全局范围内设置,使用 :py:func:`xgboost.config_context()`(Python)或 ``xgb.set.config()``(R)。
verbosity: 打印消息的详细程度。有效值为 0(静默)、1(警告)、2(信息)和 3(调试)。use_rmm: 是否使用 RAPIDS 内存管理器 (RMM) 来分配 GPU 内存。此选项仅在 XGBoost 构建(编译)时启用了 RMM 插件的情况下适用。有效值为true和false。
通用参数
booster[默认=gbtree]使用哪个助推器。可以是
gbtree、gblinear或dart;gbtree和dart使用基于树的模型,而gblinear使用线性函数。
device[默认=cpu]Added in version 2.0.0.
用于 XGBoost 运行的设备。用户可以将其设置为以下值之一:
cpu: 使用 CPU。cuda: 使用GPU(CUDA设备)。cuda:<ordinal>:<ordinal>是一个整数,用于指定GPU的序号(如果你有多个设备,你想使用哪个GPU)。gpu: 从可用且支持的设备列表中选择默认的 GPU 设备。目前仅支持cuda设备。gpu:<ordinal>: 从可用且支持的设备列表中选择默认的GPU设备。目前仅支持cuda设备。
关于GPU加速的更多信息,请参阅 XGBoost GPU 支持。在分布式环境中,序号选择由分布式框架处理,而不是XGBoost。因此,使用
cuda:<ordinal>会导致错误。请改用cuda。
verbosity[默认=1]打印消息的详细程度。有效值为 0(静默)、1(警告)、2(信息)、3(调试)。有时 XGBoost 会根据启发式方法尝试更改配置,这会显示为警告消息。如果有意外行为,请尝试增加详细程度的值。
validate_parameters[默认值为false,除了 Python、R 和 CLI 接口]当设置为 True 时,XGBoost 将执行输入参数的验证,以检查是否使用了某个参数。当存在未知参数时,会发出警告。
nthread[如果未设置,默认为可用线程的最大数量]用于运行 XGBoost 的并行线程数。在选择时,请注意线程争用和超线程。
disable_default_eval_metric[默认=false]禁用默认指标的标志。设置为 1 或
true以禁用。
树提升器的参数
eta[默认值=0.3, 别名:learning_rate]在更新中使用的步长收缩,以防止过拟合。在每次增强步骤后,我们可以直接获得新特征的权重,而
eta会缩小特征权重,使增强过程更加保守。范围: [0,1]
gamma[默认值=0, 别名:min_split_loss]在树的叶节点上进行进一步分区的最小损失减少量。
gamma越大,算法将越保守。请注意,即使没有进行任何分割的树,仍可能包含一个得分非零的单个终端节点。范围: [0,∞]
max_depth[默认=6]树的最大深度。增加此值将使模型更复杂,更容易过拟合。0 表示深度没有限制。请注意,XGBoost 在训练深度树时会积极消耗内存。
exact树方法需要非零值。范围: [0,∞]
min_child_weight[默认=1]子节点中所需的实例权重(Hessian)的最小和。如果树的分区步骤导致叶节点的实例权重和小于
min_child_weight,则构建过程将放弃进一步分区。在线性回归任务中,这简单地对应于每个节点中所需的实例最小数量。min_child_weight越大,算法将越保守。范围: [0,∞]
max_delta_step[默认=0]我们允许每个叶子输出的最大增量步长。如果该值设置为0,则表示没有约束。如果设置为正值,可以帮助使更新步骤更加保守。通常不需要此参数,但在类别极度不平衡的逻辑回归中可能会有所帮助。将其设置为1-10的值可能有助于控制更新。
范围: [0,∞]
subsample[默认值=1]训练实例的子样本比例。将其设置为0.5意味着XGBoost会在生成树之前随机抽取一半的训练数据,这样可以防止过拟合。子采样将在每次提升迭代中发生一次。
范围: (0,1]
sampling_method[默认=uniform]用于采样训练实例的方法。
uniform: 每个训练实例被选中的概率相等。通常设置subsample>= 0.5 以获得良好结果。gradient_based:每个训练实例的选择概率与梯度的*正则化绝对值*成正比(更具体地说,\(\sqrt{g^2+\lambda h^2}\))。subsample可以设置为低至 0.1 而不会损失模型精度。请注意,此采样方法仅在tree_method设置为hist且设备为cuda时支持;其他树方法仅支持uniform采样。
colsample_bytree,colsample_bylevel,colsample_bynode[默认=1]这是一组用于列子采样的参数。
所有
colsample_by*参数的范围是 (0, 1],默认值为 1,并指定要采样的列的分数。colsample_bytree是在构建每棵树时列的子样本比例。每次构建树时都会发生子采样。colsample_bylevel是每一层级的列子样本比例。在树达到新的深度级别时,会进行一次子采样。列从当前树选择的列集合中进行子采样。colsample_bynode是每个节点(分割)的列子样本比率。每次评估新分割时都会发生子采样。列从当前级别选择的列集中进行子采样。这不支持精确树方法。colsample_by*参数是累积工作的。例如,组合{'colsample_bytree':0.5, 'colsample_bylevel':0.5, 'colsample_bynode':0.5}在有64个特征的情况下,每次分割时将留下8个特征供选择。使用 Python 或 R 包,可以为 DMatrix 设置
feature_weights以定义在使用列采样时每个特征被选中的概率。在 sklearn 接口的fit方法中有一个类似的参数。
lambda[默认值=1, 别名:reg_lambda]权重的L2正则化项。增加此值将使模型更加保守。
范围: [0, \(\infty\)]
alpha[默认=0, 别名:reg_alpha]权重上的L1正则化项。增加这个值会使模型更加保守。
范围: [0, \(\infty\)]
tree_method字符串 [默认=auto]scale_pos_weight[默认=1]updater一个以逗号分隔的字符串,定义了要运行的树更新器的序列,提供了一种模块化的方式来构建和修改树。这是一个高级参数,通常会根据其他一些参数自动设置。然而,用户也可以显式地设置它。以下是存在的更新器:
grow_colmaker: 基于列的非分布式树构造。grow_histmaker: 基于全局直方图计数的行数据分割分布式树构建。grow_quantile_histmaker: 使用量化直方图生长树。grow_gpu_hist: 当tree_method设置为hist并且device=cuda时启用。grow_gpu_approx: 当tree_method设置为approx并且device=cuda时启用。sync: 同步所有分布式节点中的树。refresh: 根据当前数据刷新树的统计信息和/或叶值。请注意,不会执行数据的随机子采样。prune: 修剪那些损失 < min_split_loss (或 gamma) 的分裂,以及深度大于max_depth的节点。
refresh_leaf[默认=1]这是
refresh更新器的参数。当此标志为 1 时,树的叶子以及树节点的统计数据都会被更新。当它为 0 时,仅更新节点的统计数据。
process_type[默认=default]要运行的一种提升过程。
选项:
default,updatedefault: 创建新树的正常提升过程。update: 从现有模型开始,仅更新其树。在每次提升迭代中,从初始模型中取出一棵树,对该树运行指定的更新序列,并将修改后的树添加到新模型中。新模型的树数量将取决于执行的提升迭代次数,可能与原模型相同或更少。目前,以下内置更新器可以与此过程类型有意义地使用:refresh、prune。使用process_type=update时,不能使用创建新树的更新器。
grow_policy[默认=depthwise]控制新节点如何添加到树中。
目前仅在
tree_method设置为hist或approx时支持。选择:
depthwise,lossguidedepthwise: 在离根最近的节点处进行分割。lossguide: 在损失变化最大的节点进行分割。
max_leaves[默认=0]要添加的节点最大数量。
exact树方法不使用此项。
max_bin, [默认值=256]仅在
tree_method设置为hist或approx时使用。连续特征分桶的最大离散区间数。
增加这个数值可以提高分割的最优性,但会增加计算时间。
num_parallel_tree, [默认值=1]在每次迭代中构建的并行树的数量。此选项用于支持增强随机森林。
monotone_constraints变量单调性的约束。更多信息请参见 单调约束。
interaction_constraints表示允许交互的约束条件。约束条件必须以嵌套列表的形式指定,例如
[[0, 1], [2, 3, 4]],其中每个内部列表是一组允许相互交互的特征索引。更多信息请参见 功能交互约束。
multi_strategy,[默认 =one_output_per_tree]Added in version 2.0.0.
备注
此参数正在开发中。
用于训练多目标模型的策略,包括多目标回归和多类分类。更多信息请参见 多重输出。
one_output_per_tree: 每个目标一个模型。multi_output_tree: 使用多目标树。
max_cached_hist_node,[默认值 = 65536]CPU 直方图缓存节点的最大数量。
Added in version 2.0.0.
在大多数情况下,除非需要在CPU上增长深度树,否则不应设置此参数。
分类特征的参数
这些参数仅用于分类数据的训练。更多信息请参阅 分类数据。
备注
这些参数是实验性的。exact 树方法尚未支持。
max_cat_to_onehotAdded in version 1.6.0.
决定XGBoost是否应使用独热编码进行分类数据分割的阈值。当类别数量小于阈值时,选择独热编码,否则类别将被分割到子节点中。
max_cat_thresholdAdded in version 1.7.0.
每个分割考虑的最大类别数。仅用于基于分割的方法,以防止过拟合。
Dart Booster 的附加参数 (booster=dart)
备注
使用 predict() 与 DART 增强器
如果助推器对象是DART类型,predict() 将执行dropouts,即只有部分树将被评估。如果 data 不是训练数据,这将产生不正确的结果。要在测试集上获得正确的结果,请将 iteration_range 设置为非零值,例如
preds = bst.predict(dtest, iteration_range=(0, num_round))
sample_type[默认=uniform]采样算法的类型。
uniform: 掉落的树木是均匀选择的。weighted: 丢弃的树按权重比例选择。
normalize_type[默认=tree]归一化算法的类型。
tree: 新树的重量与每棵被砍伐的树相同。新树的权重为
1 / (k + 学习率)。倒下的树按
k / (k + learning_rate)的因子进行缩放。
forest: 新树的权重等于被砍伐树的总和(森林)。新树的权重为
1 / (1 + 学习率)。被丢弃的树按
1 / (1 + 学习率)的因子进行缩放。
rate_drop[默认=0.0]Dropout 率(在 dropout 期间要丢弃的前几棵树的分数)。
范围: [0.0, 1.0]
one_drop[默认=0]当此标志启用时,在dropout期间至少会丢弃一个树(允许从原始DART论文中进行二项式加一或epsilon-dropout)。
skip_drop[默认=0.0]在提升迭代过程中跳过dropout程序的概率。
如果跳过dropout,新树将以与``gbtree``相同的方式添加。
请注意,非零的
skip_drop比rate_drop或one_drop具有更高的优先级。
范围: [0.0, 1.0]
线性提升器的参数 (booster=gblinear)
lambda[默认=0, 别名:reg_lambda]权重上的L2正则化项。增加此值将使模型更加保守。按训练样本数量进行归一化。
alpha[默认=0, 别名:reg_alpha]权重上的L1正则化项。增加此值将使模型更加保守。按训练样本数量归一化。
updater[默认=shotgun]选择拟合线性模型的算法
shotgun: 基于shotgun算法的并行坐标下降算法。使用’hogwild’并行性,因此在每次运行时产生一个不确定的解决方案。coord_descent: 普通坐标下降算法。也是多线程的,但仍然产生确定性的解。当device参数设置为cuda或gpu时,将使用 GPU 变体。
feature_selector[默认=cyclic]特征选择和排序方法
cyclic: 通过依次循环遍历特征来进行确定性选择。shuffle: 类似于cyclic,但在每次更新前进行随机特征打乱。random: 一个随机(有放回)的坐标选择器。greedy: 选择梯度幅度最大的坐标。它具有O(num_feature^2)的复杂度。它是完全确定性的。它允许通过设置top_k参数,将选择限制为每个组中一元权重变化幅度最大的top_k个特征。这样做会将复杂度降低到O(num_feature*top_k)。thrifty: 节俭的、近似贪婪的特征选择器。在循环更新之前,按其单变量权重变化的降序重新排列特征。此操作是多线程的,并且是二次贪婪选择的线性复杂度近似。通过设置top_k参数,它允许将选择限制为每个组中具有最大单变量权重变化的top_k特征。
top_k[默认=0]在
greedy和thrifty特征选择器中选择的前几个特征的数量。值为 0 表示使用所有特征。
学习任务参数
指定学习任务和相应的学习目标。目标选项如下:
objective[默认=reg:squarederror]reg:squarederror: 使用平方损失的回归。reg:squaredlogerror: 使用平方对数损失的回归 \(\frac{1}{2}[log(pred + 1) - log(label + 1)]^2\)。所有输入标签必须大于 -1。另请参阅指标rmsle以了解与此目标相关的可能问题。reg:logistic: 逻辑回归,输出概率reg:pseudohubererror: 使用伪Huber损失的回归,这是绝对损失的一个二次可微的替代方案。reg:absoluteerror: 使用L1误差的回归。当使用树模型时,叶子值在树构建后刷新。如果在分布式训练中使用,叶子值计算为所有工作者的平均值,这不能保证是最优的。Added in version 1.7.0.
reg:quantileerror: 分位数损失,也称为pinball loss。有关其参数和示例,请参见后面的部分和 分位数回归。Added in version 2.0.0.
binary:logistic: 用于二分类的逻辑回归,输出概率binary:logitraw: 用于二分类的逻辑回归,输出逻辑变换前的分数binary:hinge: 二元分类的铰链损失。这使得预测结果为0或1,而不是生成概率。count:poisson: 用于计数数据的泊松回归,输出泊松分布的均值。max_delta_step在泊松回归中默认设置为0.7(用于保护优化过程)
survival:cox: 用于右删失生存时间数据的Cox回归(负值被视为右删失)。请注意,预测结果以风险比尺度返回(即,在比例风险函数h(t) = h0(t) * HR中,HR = exp(marginal_prediction))。survival:aft: 用于截尾生存时间数据的加速失效时间模型。详情请参见 使用加速失效时间模型的生存分析。multi:softmax: 设置 XGBoost 使用 softmax 目标进行多类分类,您还需要设置 num_class(类的数量)multi:softprob: 与 softmax 相同,但输出一个ndata * nclass的向量,可以进一步重塑为ndata * nclass矩阵。结果包含每个数据点属于每个类别的预测概率。rank:ndcg: 使用 LambdaMART 执行成对排序,其中最大化 归一化折损累积增益 (NDCG)。此目标支持点击数据的位置去偏。rank:map: 使用 LambdaMART 执行成对排序,其中 平均精度均值 (MAP) 被最大化rank:pairwise: 使用 LambdaRank 通过 ranknet 目标进行成对排序。reg:gamma: 使用对数链接的伽马回归。输出是伽马分布的均值。它可能对建模保险索赔的严重性或任何可能为 伽马分布 的结果有用。reg:tweedie: 使用对数链接的Tweedie回归。它可能有用,例如,用于建模保险中的总损失,或用于任何可能 Tweedie分布 的结果。
base_score所有实例的初始预测分数,全局偏差
在训练前,参数会自动为选定的目标进行估计。要禁用估计,请指定一个实数参数。
如果提供了
base_margin,则不会添加base_score。对于足够多的迭代次数,改变这个值不会有太大影响。
更多信息请参见 拦截。
eval_metric[默认根据目标设定]验证数据的评估指标,将根据目标分配默认指标(回归为rmse,分类为logloss,``rank:map``为`平均精度均值`等)
用户可以添加多个评估指标。Python 用户:记得将指标作为参数对列表传递,而不是作为映射传递,这样后面的
eval_metric不会覆盖前面的指标。以下列出了选择:
rmse: 均方根误差rmsle: 均方对数误差根: \(\sqrt{\frac{1}{N}[log(pred + 1) - log(label + 1)]^2}\)。reg:squaredlogerror目标的默认度量。该度量减少了数据集中异常值产生的误差。但由于使用了log函数,当预测值小于 -1 时,rmsle可能会输出nan。请参阅reg:squaredlogerror了解其他要求。mae: 平均绝对误差mape: 平均绝对百分比误差mphe: 均值伪Huber误差.reg:pseudohubererror目标的默认度量。logloss: 负对数似然error: 二分类错误率。它计算为#(错误案例)/#(所有案例)。对于预测,评估将预测值大于0.5的实例视为正实例,其余的视为负实例。error@t: 可以通过提供数值 ‘t’ 来指定一个不同于 0.5 的二分类阈值。merror: 多类分类错误率。其计算公式为#(错误案例)/#(所有案例)。mlogloss: 多类对数损失。auc: 接收者操作特征曲线下面积. 适用于分类和学习排序任务。在使用二元分类时,目标函数应为
binary:logistic或类似处理概率的函数。在使用多类分类时,目标应为
multi:softprob而不是multi:softmax,因为后者不输出概率。此外,AUC 是通过 1-vs-rest 计算的,参考类按类别的流行度加权。在使用LTR任务时,AUC是通过比较文档对来计算的,以统计正确排序的对数。这对应于成对学习排序。该实现存在一些问题,即围绕组和分布式工作者的平均AUC定义不明确。
在一台机器上,AUC 计算是精确的。在分布式环境中,AUC 是每个节点上训练行 AUC 的加权平均值 - 因此,分布式 AUC 是对数据在各工作节点上分布敏感的近似值。如果在分布式环境中精度和可重复性很重要,请使用其他指标。
当输入数据集仅包含负样本或正样本时,输出为 NaN。该行为是实现定义的,例如,
scikit-learn返回 \(0.5\)。
aucpr: PR 曲线下面积。适用于分类和学习排序任务。在XGBoost 1.6之后,使用``aucpr``进行分类问题的要求和限制与``auc``相似。对于排序任务,仅支持二进制相关性标签 \(y \in [0, 1]\)。与``map(平均精度均值)``不同,``aucpr``计算的是使用连续插值的精度召回曲线下*插值*面积。
pre: 在 \(k\) 处的精确度。仅支持学习排序任务。ndcg: 归一化折损累积增益map: 平均精度均值平均精度 定义为:
\[AP@l = \frac{1}{min{(l, N)}}\sum^l_{k=1}P@k \cdot I_{(k)}\]其中 \(I_{(k)}\) 是一个指示函数,当位置 \(k\) 的文档是相关时等于 \(1\),否则等于 \(0\)。\(P@k\) 是位置 \(k\) 处的精度,而 \(N\) 是相关文档的总数。最后,平均精度均值 定义为所有查询的加权平均值。
ndcg@n,map@n,pre@n: \(n\) 可以被赋值为一个整数,以截断列表中用于评估的前几个位置。ndcg-,map-,ndcg@n-,map@n-: 在 XGBoost 中,NDCG 和 MAP 在没有正样本的情况下将列表的评分评估为 \(1\)。通过在评估指标名称后附加“-”,我们可以要求 XGBoost 在某些条件下将这些评分评估为 \(0\)。poisson-nloglik: 泊松回归的负对数似然gamma-nloglik: 伽马回归的负对数似然cox-nloglik: Cox比例风险回归的负偏对数似然gamma-deviance: 伽马回归的残差偏差tweedie-nloglik: Tweedie 回归的负对数似然(在指定的tweedie_variance_power参数值处)aft-nloglik: 加速失效时间模型的负对数似然。详情请参见 使用加速失效时间模型的生存分析。interval-regression-accuracy: 预测标签落在区间删失标签内的数据点比例。仅适用于区间删失数据。详情请参阅 使用加速失效时间模型的生存分析。
seed[默认=0]随机数种子。在 R 包中,如果未指定,将不会默认使用种子 ‘零’,而是通过 R 自己的随机数生成引擎获取一个随机种子。
seed_per_iteration[默认=false]通过迭代器编号确定性地播种PRNG。
Tweedie回归的参数 (objective=reg:tweedie)
tweedie_variance_power[默认=1.5]控制 Tweedie 分布方差的参数
var(y) ~ E(y)^tweedie_variance_power范围: (1,2)
设置更接近2以趋向于伽马分布
设置更接近1以趋向于泊松分布。
使用Pseudo-Huber的参数 (reg:pseudohubererror)
huber_slope: 用于伪Huber损失的参数,定义 \(\delta\) 项。[默认值 = 1.0]
使用分位数损失的参数 (reg:quantileerror)
quantile_alpha: 一个标量或目标分位数的列表。Added in version 2.0.0.
使用AFT生存损失 (survival:aft) 和AFT指标的负对数似然 (aft-nloglik) 的参数
aft_loss_distribution: 概率密度函数,normal,logistic, 或extreme.
学习排序的参数 (rank:ndcg, rank:map, rank:pairwise)
这些是特定于学习排序任务的参数。有关深入解释,请参阅 学习排序。
lambdarank_pair_method[默认 =topk]如何为成对学习构建配对。
mean: 对于查询列表中的每个文档,采样lambdarank_num_pair_per_sample对。topk: 专注于前lambdarank_num_pair_per_sample个文档。为每个排名前lambdarank_num_pair_per_sample的文档构建 \(|query|\) 对。
lambdarank_num_pair_per_sample[范围 = \([1, \infty]\)]当配对方法为
mean时,它指定每个文档采样的对数,或者当配对方法为topk时,它指定查询的截断级别。例如,要使用ndcg@6进行训练,请将lambdarank_num_pair_per_sample设置为 \(6\),并将lambdarank_pair_method设置为topk。lambdarank_normalization[默认 =true]Added in version 2.1.0.
是否通过lambda梯度来归一化叶值。这有时可能会使训练进度停滞。
lambdarank_unbiased[默认 =false]
指定是否需要对输入的点击数据进行去偏处理。
lambdarank_bias_norm[默认值 = 2.0]\(L_p\) 位置去偏的归一化,默认是 \(L_2\)。仅在
lambdarank_unbiased设置为 true 时相关。ndcg_exp_gain[默认 =true]我们是否应该为
NDCG使用指数增益函数。NDCG有两种形式的增益函数,一种是直接使用相关性值,另一种是使用 \(2^{rel} - 1\) 来强调检索相关文档。当ndcg_exp_gain为真(默认)时,相关性程度不能大于31。
命令行参数
以下参数仅在 XGBoost 的控制台版本中使用
num_round提升的轮数
data训练数据的路径
test:data用于进行预测的测试数据路径
save_period[默认=0]保存模型的周期。设置
save_period=10意味着每10轮XGBoost将保存一次模型。设置为0意味着在训练期间不保存任何模型。
task[默认=train] 选项:train,pred,eval,dumptrain: 使用数据进行训练pred: 对测试数据进行预测eval: 用于评估由eval[name]=filename指定的统计数据dump: 用于将学习到的模型转储为文本格式
model_in[默认=NULL]输入模型的路径,对于
test、eval、dump任务是必需的。如果在训练中指定了它,XGBoost 将继续从输入模型进行训练。
model_out[默认=NULL]训练完成后输出模型的路径。如果未指定,XGBoost 将输出类似
0003.model的文件,其中0003是提升轮数。
model_dir[默认=models/]训练期间保存模型的输出目录
fmap特征图,用于导出模型
dump_format[默认=text] 选项:text,json模型转储文件的格式
name_dump[默认=dump.txt]模型转储文件的名称
name_pred[默认=pred.txt]预测文件的名称,用于预测模式
pred_margin[默认=0]预测边际而不是转换后的概率