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
,update
default
: 创建新树的正常提升过程。update
: 从现有模型开始,仅更新其树。在每次提升迭代中,从初始模型中取出一棵树,对该树运行指定的更新序列,并将修改后的树添加到新模型中。新模型的树数量将取决于执行的提升迭代次数,可能与原模型相同或更少。目前,以下内置更新器可以与此过程类型有意义地使用:refresh
、prune
。使用process_type=update
时,不能使用创建新树的更新器。
grow_policy
[默认=depthwise
]控制新节点如何添加到树中。
目前仅在
tree_method
设置为hist
或approx
时支持。选择:
depthwise
,lossguide
depthwise
: 在离根最近的节点处进行分割。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_onehot
Added in version 1.6.0.
决定XGBoost是否应使用独热编码进行分类数据分割的阈值。当类别数量小于阈值时,选择独热编码,否则类别将被分割到子节点中。
max_cat_threshold
Added 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
,dump
train
: 使用数据进行训练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]预测边际而不是转换后的概率