跳到内容

如何更快地训练模型?

一些超参数对模型质量和训练速度都有显著影响。

近似分裂

默认情况下,使用精确分裂进行学习。精确分裂的替代方案是近似分裂,它学习速度更快(根据数据集不同,速度提升 2 到 5 倍),但有时会导致质量下降。

通过设置 force_numerical_discretization=True 启用近似分裂。参数 max_unique_values_for_discretized_numerical(默认为 16000)控制近似分裂的精度。值越小,算法速度越快,但也可能导致分裂精度较低。

如果训练时间有限,使用近似分裂并在优化其他超参数的同时,可以实现更快的训练和更高的精度。

关于其他库

在 XGBoost 中,可以通过设置 tree_method="hist" 启用近似分裂。

LightGBM 始终使用近似分裂。

分布式训练

分布式训练将模型训练的计算成本分摊到多台计算机上。换句话说,模型不再在单台机器上训练,而是在多台机器上并行训练。这可以显著加快训练过程,并允许使用更大的数据集。对于小型数据集,分布式训练没有帮助。

树的数量

训练时间与树的数量成正比。减少树的数量将缩短训练时间。

候选属性比例

训练时间与 num_candidate_attributes_ratio 成正比。减小 num_candidate_attributes_ratio 将缩短训练时间。

禁用 OOB 性能 [仅限 RF]

compute_oob_performances=True(默认)时,在训练期间计算袋外 (Out-of-bag) 评估。OOB 评估是衡量模型质量的好方法,但它不影响训练。禁用 compute_oob_performances 将加快随机森林模型的训练速度。

设置最大训练时间

maximum_training_duration_seconds 控制模型的最大训练时间。

减少测试的斜投影

训练稀疏斜模型 (split_axis=SPARSE_OBLIQUE) 时,测试的投影数量由 num_features^num_projections_exponent 定义。减小 num_projections_exponent 将加快训练速度。

增加训练线程数

默认训练线程数设置为机器的核心数,最多 32 个。如果机器有超过 32 个核心,训练线程数将被限制在 32 个。在这种情况下,手动将 num_threads 参数设置为更大的值可以加快训练速度。

增加收缩率 [仅限 GBT]

"收缩率"(有时也称为"学习率")决定了 GBT 模型学习的速度。学习过快通常会导致较差的结果,但会生成更小、训练更快、运行更快的模型。shrinkage 默认为 0.1。您可以尝试 0.15 或 0.2。