likes
comments
collection
share

XGBoost中的参数介绍

作者站长头像
站长
· 阅读数 3

在运行XGBoost之前,必须设置三种类型的参数:通用参数、提升器参数和学习任务参数。

  • 通用参数与要使用的提升器有关,通常是树或线性模型
  • 提升器参数取决于选择的提升器
  • 学习任务参数决定学习场景。例如,回归任务可能使用与排名任务不同的参数
  • 命令行参数与XGBoost的CLI版本的行为有关

全局配置

以下参数可以在全局范围内设置,使用 xgboost.config_context()(Python)或 xgb.set.config()(R)。

  • verbosity: 打印信息的详细程度。有效值为 0(静默),1(warning),2(info),和 3(debug)。
  • use_rmm: 是否使用 RAPIDS 内存管理器(RMM)来分配 GPU 内存。这个选项仅在 XGBoost 使用 RMM 插件启用时(编译)有效。有效值为 truefalse

通用参数

  • booster [default=gbtree]

    • 选择使用的提升器。可以是 gbtreegblineardartgbtreedart 使用基于树的模型,而 gblinear 使用线性函数。
  • device [default=cpu]

    • 设置 XGBoost 运行的设备。用户可以将其设置为以下值之一:

      • cpu: 使用 CPU

      • cuda: 使用 GPU (CUDA 设备)

      • cuda:<ordinal>: <ordinal> 是一个整数,指定 GPU 的序号

      • gpu: 从可用和支持的设备列表中选择默认 GPU 设备。目前仅支持 cuda 设备。

      • gpu:<ordinal>: 从可用和支持的设备列表中选择默认 GPU 设备。目前仅支持 cuda设备。

有关 GPU 加速的更多信息,请参见 XGBoost GPU 支持。在分布式环境中,序号选择由分布式框架而不是 XGBoost 处理。因此,使用 cuda:<ordinal> 将导致错误。请使用 cuda

  • verbosity [default=1]
    • 打印信息的详细程度。有效值为 0(silent),1(warning),2(info),3(debug)。有时 XGBoost 会尝试根据启发式方法更改配置,这会显示为警告信息。如果有意外行为,请尝试增加 verbosity 的值。
  • validate_parameters [默认为 false,Python、R 和 CLI 接口除外]

    • 设置为 True 时,XGBoost 将执行输入参数的验证,以检查参数是否被使用。当存在未知参数时,会发出警告。
  • nthread [如果未设置,则默认为可用的最大线程数]

    • 用于运行 XGBoost 的并行线程数。在选择时,请考虑线程争用和超线程。
  • disable_default_eval_metric [默认= false]

    • 用于禁用默认度量标准的标志。设置为 1 或 true 以禁用。

Tree Booster参数

  • eta [默认值=0.3, 别名: learning_rate]

    • 更新中使用的步长缩减,以防止过拟合。在每次提升步骤之后,可以直接获得新特征的权重,而 eta 会缩小特征权重,使提升过程更为保守

    • 范围: [0,1]

  • gamma [默认值=0, 别名: min_split_loss]

    • 在叶子节点上进行进一步分区所需的最小损失减小。gamma 越大,算法越保守。即使没有进行任何分割的树仍可能包含一个具有非零分数的单个叶子节点

    • 范围: [0,∞]

  • max_depth [默认值=6]

    • 树的最大深度。增加此值将使模型更复杂,更容易过拟合。0 表示深度无限制。请注意,在训练深树时,XGBoost 会消耗大量内存。exact tree 方法要求非零值。

    • 范围: [0,∞]

  • min_child_weight [默认值=1]

    • 在子节点中需要的最小实例权重(hessian)总和。如果树的分区步骤导致叶子节点的实例权重总和小于 min_child_weight,则构建过程将放弃进一步分区。在线性回归任务中,这简单地对应于每个节点中需要的最小实例数。min_child_weight 越大,算法越保守。

    • 范围: [0,∞]

  • max_delta_step [默认值=0]

    • 允许每个叶子输出的最大 delta 步长。如果该值设置为 0,则表示没有约束。如果设置为正值,它可以帮助使更新步骤更为保守。通常不需要此参数,但在逻辑回归中,当类别极度不平衡时可能会有帮助。将其设置为 1-10 的值可能有助于控制更新。

    • 范围: [0,∞]

  • subsample [默认值=1]

    • 训练实例的子样本比例。将其设置为 0.5 表示 XGBoost 会在生长树之前随机采样一半的训练数据。这将防止过拟合。子采样将在每次提升迭代中发生。

    • 范围: (0,1]

  • sampling_method [默认值= uniform]

    • 用于对训练实例进行采样的方法。
    • uniform: 每个训练实例被选中的概率相等。通常设置 subsample >= 0.5 以获得良好的结果。
    • gradient_based: 每个训练实例的选择概率与梯度的正则化绝对值成比例(g2+λh2\sqrt{g^2+\lambda h^2}g2+λh2)。subsampling 可以设置为低至 0.1 而不会损失模型的准确性。此采样方法仅在tree_method 设置为 hist 且设备为 cuda 时受支持;其他树方法仅支持均匀采样。
  • 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 来定义在使用列采样时每个特征被选中的概率。

  • lambda [默认值=1, 别名: reg_lambda]

    • 权重的 L2 正则化项。增加此值将使模型更为保守

    • 范围: [0, ∞]

  • alpha [默认值=0, 别名: reg_alpha]

    • 权重的 L1 正则化项。增加此值将使模型更为保守

    • 范围: [0, ∞]

  • tree_method [字符串,默认值= auto]

    • XGBoost 中使用的树构建算法
    • 选项: auto, exact, approx, hist,这是一组常用的更新程序的组合。对于其他更新程序(如 refresh),直接设置更新程序参数。
      • auto: 与 hist 树方法相同
      • exact: 精确的贪心算法。枚举所有分割候选项
      • approx: 使用分位数草图和梯度直方图的近似贪心算法
      • hist: 更快的直方图优化近似贪心算法

scale_pos_weight [默认值=1]

控制正负权重的平衡,对于不平衡的类别很有用。一个考虑的典型值是:负实例总和 / 正实例总和。更多讨论请参见参数调整。另请参见 Higgs Kaggle 竞赛演示:R,py1,py2,py3。

updater

定义要运行的树更新程序序列的逗号分隔字符串,以一种模块化的方式构建和修改树。这是一个通常根据其他一些参数自动设置的高级参数。但是,用户也可以显式设置它。存在以下更新程序:

  • grow_colmaker: 非分布式基于列的树构建。
  • grow_histmaker: 基于全局直方图计数提出的基于行的数据拆分的分布式树构建。
  • grow_quantile_histmaker: 使用量化直方图生长树。
  • grow_gpu_hist: 当 tree_method 设置为 hist 且设备为 cuda 时启用。
  • grow_gpu_approx: 当 tree_method 设置为 approx 且设备为 cuda 时启用。
  • sync: 同步所有分布式节点中的树。
  • refresh: 根据当前数据刷新树的统计信息和/或叶值。请注意,不执行数据行的随机子采样。
  • prune: 剪除损失 < min_split_loss(或 gamma)的拆分和深度大于 max_depth 的节点。
  • refresh_leaf [默认值=1]:这是刷新更新程序的参数。当此标志为 1 时,树叶以及树节点的统计信息都会更新。当它为 0 时,仅更新节点统计信息。
  • process_type [默认值= default]

    • 要运行的提升过程的类型

    • 选项: default, update
      • default: 创建新树的正常提升过程。
      • update: 从现有模型开始,仅更新其树。在每个提升迭代中,从初始模型中取出一棵树,为该树运行指定的更新程序序列,然后将修改后的树添加到新模型中。新模型的树数量可能相同或更小,具体取决于执行的提升迭代数。当前,以下内置更新程序可以有意义地与此进程类型一起使用:refreshprune。使用 process_type=update 时,不能使用创建新树的更新程序。
  • grow_policy [默认值= depthwise]

    • 控制将新节点添加到树的方式。

    • 目前仅在 tree_method 设置为 histapprox 时受支持。

    • 选项: depthwise, lossguide

      • depthwise: 在最靠近根部的节点处拆分
      • lossguide: 在损失变化最大的节点处拆分
  • max_leaves [默认值=0]

    • 要添加的最大节点数。在精确的树方法中不使用。
  • max_bin [默认值=256]

    • 仅在 tree_method 设置为 histapprox 时使用

    • 要将连续特征分桶的最大离散 bin 数量

    • 增加此数字会提高拆分的最优性,但会增加计算时间

  • num_parallel_tree [默认值=1]

    • 在每次迭代期间构建的并行树的数量。此选项用于支持增强型随机森林。
  • monotone_constraints

    • 变量单调性的约束
  • interaction_constraints

    • 表示允许的交互关系的交互约束。约束必须以嵌套列表的形式指定,例如 [[0, 1], [2, 3, 4]],其中每个内部列表是允许相互作用的特征的索引组
  • multi_strategy [默认值= one_output_per_tree]

    • 用于训练多目标模型(包括多目标回归和多类分类)的策略
    • one_output_per_tree: 每个目标一个模型。
    • multi_output_tree: 使用多目标树。
  • max_cached_hist_node [默认值= 65536]

    • CPU 直方图的最大缓存节点数
    • 对于大多数情况,不应设置此参数,除非在 CPU 上生长深树

分类特征的参数

  • max_cat_to_onehot

    • 用于决定 XGBoost 是否应基于独热编码拆分分类数据的阈值。当类别数小于该阈值时,选择独热编码,否则将类别分为子节点。
  • max_cat_threshold

    • 每次拆分考虑的最大类别数。仅由基于分区的拆分使用,以防止过拟合。

Dart Booster 的附加参数 (booster=dart)

使用 DART booster 进行预测

如果 booster 对象是 DART 类型,predict() 将执行 dropout 操作,即只有一部分树将被评估。如果数据不是训练数据,这将导致产生不正确的结果。为了在测试集上获得正确的结果,将 iteration_range 设置为非零值,例如:

preds = bst.predict(dtest, iteration_range=(0, num_round))

这里,num_round 是训练期间使用的 boosting 轮数或迭代次数。设置 iteration_range 确保对于预测使用了指定迭代次数之前的所有树。

  • sample_type [默认值= uniform]

    • 采样算法的类型。
      • uniform: 选择的被丢弃的树是均匀的
      • weighted: 选择的被丢弃的树与其权重成比例
  • normalize_type [默认值= tree]

    • 归一化算法的类型
      • tree: 新树的权重与每个被丢弃的树相同
        • 新树的权重为 1 / (k + learning_rate)
        • 被丢弃的树按比例缩放,缩放因子为 k / (k + learning_rate)
      • forest: 新树的权重与所有被丢弃的树(森林)的权重之和相同。
        • 新树的权重为 1 / (1 + learning_rate)
        • 被丢弃的树按比例缩放,缩放因子为 1 / (1 + learning_rate)
  • rate_drop [默认值=0.0]

    • dropout丢弃率(在丢弃期间要丢弃的先前树的比例)

    • 范围: [0.0, 1.0]

  • one_drop [默认值=0]

    • 启用此标志时,总是在丢弃期间至少丢弃一棵树
  • skip_drop [默认值=0.0]

    • 在 boosting 迭代期间跳过 dropout 过程的概率

      • 如果跳过 dropout,新树将以与 gbtree 相同的方式添加

      • 非零的 skip_drop 具有比 rate_dropone_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]

    • 在贪婪和节约特征选择器中选择的顶部特征数。值为 0 表示使用所有特征。

学习任务参数

指定学习任务以及相应的学习目标。以下是目标选项:

  • objective [默认值=reg:squarederror]

    • reg:squarederror: 带平方损失的回归
    • reg:squaredlogerror: 带平方对数损失的回归12[log(pred+1)−log(label+1)]2\frac{1}{2}[log(pred + 1) - log(label + 1)]^221[log(pred+1)log(label+1)]2。要求所有输入标签都大于-1
    • reg:logistic: 逻辑回归,输出概率。
    • reg:pseudohubererror: 带 Pseudo Huber 损失的回归,是绝对损失的两倍可微替代
    • reg:absoluteerror: 带 L1 误差的回归。当使用树模型时,叶值在树构建后会刷新。如果在分布式训练中使用,则叶值计算为所有工作节点的平均值,不能保证是最优的
    • reg:quantileerror: 分位数损失,也称为钉扣损失。有关其参数的信息,请参见后续章节和分位数回归,了解实际示例
    • binary:logistic: 用于二分类的逻辑回归,输出概率
    • binary:logitraw: 用于二分类的逻辑回归,输出 logistic 转换之前的分数
    • binary:hinge: 用于二分类的合页损失。这会产生 0 或 1 的预测,而不是生成概率
    • count:poisson: 用于计数数据的泊松回归,输出泊松分布的均值。
      • 在泊松回归中,默认将 max_delta_step 设置为 0.7
    • survival:cox: 用于右截尾生存时间数据的 Cox 回归(将负值视为右截尾)。预测以风险比例尺返回(即,在比例风险函数 h(t)=h0(t)∗HRh(t) = h0(t) * HRh(t)=h0(t)HR 中作为 HR=exp(marginal_prediction)HR=exp(marginal\_prediction)HR=exp(marginal_prediction)
    • survival:aft: 用于截尾生存时间数据的加速失效时间模型
    • multi:softmax: 使用 softmax 目标让 XGBoost 执行多类别分类,还需要设置 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 的均值平均精度等)。

    • 用户可以添加多个评估指标

    • 以下是可用的选择:

      • rmse:均方根误差
      • rmsle:均方根对数误差
      • mae:平均绝对误差
      • mape:平均绝对百分比误差
      • mphe:平均伪 Huber 误差
      • logloss:负对数似然
      • error:二元分类错误率
      • error@t:可通过 't' 参数指定不同于 0.5 的二元分类阈值值
      • merror:多类分类错误率
      • mlogloss:多类 logloss
      • auc:ROC 曲线下的面积,可用于分类和学习排序任务
      • aucpr:PR 曲线下的面积,可用于分类和学习排序任务
      • pre:Precision at K
      • ndcg:归一化折现累积增益
      • map:平均精度均值
      • ndcg@nmap@npre@n:可以将 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]

    • 随机数种子
  • 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:用于定义δ\deltaδ的Pseudo-Huber损失的参数。[默认值=1.0]

使用Quantile Loss(reg:quantileerror)的参数

  • quantile_alpha:一个标量或目标分位数的列表

使用AFT Survival Loss(survival:aft)和AFT metric(aft-nloglik)的参数

  • aft_loss_distribution:概率密度函数,可以是normal、logistic或者extreme

用于学习排序(rank:ndcg、rank:map、rank:pairwise)的参数

这些是特定于学习排名任务的参数。

  • lambdarank_pair_method [默认=mean]:构建用于成对学习的对的方法。
    • mean:为查询列表中的每个文档采样lambdarank_num_pair_per_sample对。
    • topk:专注于排名在模型排序的前lambdarank_num_pair_per_sample的文档。为每个文档构建lambdarank_num_pair_per_sample对。
  • lambdarank_num_pair_per_sample [range= [1,∞][1, \infty][1,] ]
    • 它指定在pair方法为mean时为每个文档采样的对数,或者在pair方法为topk时为查询截断的级别。例如,要使用ndcg@6进行训练,需将lambdarank_num_pair_per_sample设置为6,并将lambdarank_pair_method设置为topk。
  • lambdarank_unbiased [默认=false]:指定是否需要对输入点击数据进行去偏。
  • lambdarank_bias_norm [默认=2.0]:LpL_pLp去偏的位置归一化,默认为L2L_2L2。仅在lambdarank_unbiased设置为true时相关。
  • ndcg_exp_gain [默认=true]:
    • 是否应该使用NDCG的指数增益函数。有两种NDCG的增益函数形式:
      • 一种是直接使用相关值
      • 另一种是使用2rel−12^{rel} - 12rel1,以便强调检索相关文档。
    • ndcg_exp_gain为true(默认值)时,相关度不能大于31

命令行参数

以下参数仅用于XGBoost的控制台版本:

  • num_round:提升轮数
  • data:训练数据路径
  • test:data:测试数据路径,用于进行预测
  • save_period [默认=0]:、
  • 保存模型的周期。设置save_period=10表示每10轮XGBoost将保存模型。将其设置为0表示在训练过程中不保存任何模型。
  • task [默认=train]:选项:trainpredevaldump
    • train:使用数据进行训练
    • pred:为test:data进行预测
    • eval:用于评估由eval[name]=filename指定的统计信息
    • dump:用于将学到的模型转储为文本格式
  • model_in [默认=NULL]:
    • 输入模型的路径,对于testevaldump任务是必需的。如果在训练中指定了它,XGBoost将从输入模型继续训练。
  • model_out [默认=NULL]:
    • 训练完成后输出模型的路径。如果未指定,XGBoost将输出文件,文件名类似于0003.model,其中0003是提升轮数。
  • model_dir [默认=models/]:在训练期间保存模型的输出目录
  • fmap:特征映射,用于转储模型
  • dump_format [默认=text]:选项:textjson
    • 模型转储文件的格式
  • name_dump [默认=dump.txt]:模型转储文件的名称
  • name_pred [默认=pred.txt]:预测文件的名称,在pred模式中使用
  • pred_margin [默认=0]:预测边际而不是转换后的概率

参考