在训练提升树模型时,有两个用于选择算法的参数,即 updater 和 tree_method。XGBoost 有三种内置的树方法,分别是 exact
、approx
和 hist
。除了这些树方法之外,还有一些独立的更新器,包括 refresh
、prune
和 sync
。参数 updater
比 tree_method
更为基础,因为后者只是前者的预配置。这种差异主要是由于历史原因,每个更新器都需要一些特定的配置,并且可能缺少某些功能。
精确方法
Exact精确意味着XGBoost考虑从数据中选择所有候选的树分裂点,但其背后的目标仍然被解释为泰勒展开。
exact(精确)
:这是在参考论文中描述的标准梯度提升树算法。在查找分裂点时,它会迭代所有输入数据的条目。它更准确(在其他贪婪方法中)但与其他树方法相比计算速度较慢。此外,其功能集是有限的。不支持需要近似分位数的分布式训练和外部内存等功能。可以使用参数tree_method
设置为exact
来使用此树方法。
近似方法
由于精确树方法在计算性能上较慢且难以扩展,因此通常采用近似的训练算法。这些算法为每个节点构建一个梯度直方图,并通过直方图迭代,而不是使用真实的数据集。
-
approx
树方法:在构建每棵树之前,它会对所有行(属于根节点的行)进行草图处理。在草图处理过程中,Hessian
被用作权重。可以通过将tree_method
设置为approx
来访问此算法。 -
hist
树方法:这是LightGBM中使用的一种近似树方法,实现上有些许不同。它在训练之前对用户提供的权重进行草图处理,而不是使用Hessian
。随后,基于此全局草图构建每个节点的直方图。这是最快的算法,因为它只运行一次草图处理。可以通过将tree_method
设置为hist
来访问此算法。
问题
一些目标函数,比如reg:squarederror
,具有常数Hessian
。在这种情况下,应该首选hist
,因为使用常数权重进行草图处理是没有意义的。当使用非常数Hessian目标时,有时approx
能够获得更好的准确性,但计算性能较慢。大多数情况下,使用具有更高max_bin
的hist
可以实现类似甚至更好的准确性,同时保持良好的性能。然而,由于xgboost在很大程度上是由社区推动的,实际的实现与纯数学描述有一些差异,结果可能与预期略有不同。
其他的更新
-
Prune
: 对已建立的树进行修剪。通常prune是作为其他树方法的一部分来使用的。要独立使用pruner
,需要将处理类型设置为update by: {"process_type": "update", "updater": "prune"}
。使用这组参数进行训练时,XGBoost将根据两个参数min_split_loss(gamma)
和max_depth
修剪现有的树 -
Refresh
: 刷新已建树的统计信息,使用新的训练数据集。与pruner一样,要独立使用refresh,需要将处理类型设置为update: {"process_type": "update", "updater": "refresh"}
。在训练过程中,更新器将根据新的训练数据集更改统计信息,例如cover和weight。当refresh_leaf
也设置为true
时,XGBoost将根据新的叶权重更新叶值,但树结构(分割条件)本身不会改变 -
Sync
: 在运行分布式训练时,对工作节点之间的树进行同步
已删除的更新
-
Distributed colmaker
: 这是 exact tree 方法的分布式版本。它需要为基于列的分裂策略进行专门设计,并且具有不同的预测过程。由于exact tree
方法本身速度较慢,扩展性更低效,因此完全删除了它。 -
skmaker
:grow_local_histmaker
使用的每个节点加权草图都很慢,而skmaker
未经维护,似乎是一种尝试消除直方图创建步骤并直接在分裂评估期间使用草图值的解决方案。它从未经过测试,包含一些未知的错误,现删除它,并将资源集中在更有前途的算法上。就准确性而言,大多数情况下,通过一些参数调整,approx
和hist
就足够了,因此删除它们不会有任何实际影响。 -
grow_local_histmaker
更新程序:在寻找分裂时,它首先对属于当前节点的数据点运行加权 GK 草图以找到分裂候选项,使用hessian
作为权重。直方图是根据每个节点的这个草图构建的。在某些应用中,它比exact
更快,但仍然在计算上较慢。它被删除,因为它依赖于 Rabit 的定制化归约功能,该功能处理可以序列化/反序列化为固定大小缓冲区的所有数据结构,这不受 NCCL 或联邦学习 gRPC 的直接支持,因此很难重构为通用的全局归约接口。
特征矩阵
以下表格总结了4种树方法之间在支持功能方面的一些差异,其中T表示支持,而F表示不支持。
Exact | Approx | Approx (GPU) | Hist | Hist (GPU) | |
---|---|---|---|---|---|
grow_policy | Depthwise | depthwise/lossguide | depthwise/lossguide | depthwise/lossguide | depthwise/lossguide |
max_leaves | F | T | T | T | T |
sampling method | uniform | uniform | gradient_based/uniform | uniform | gradient_based/uniform |
categorical data | F | T | T | T | T |
External memory | F | T | P | T | P |
Distributed | F | T | T | T | T |
在此未提及的特性/参数在所有3种树方法中都是通用支持的(例如,列采样和约束)。外部内存中的 P 表示特殊处理。请注意,分类数据和外部内存都是实验性的。