过拟合、正则化和早停法

与随机森林不同,梯度提升树可能会过拟合。因此,对于神经网络,您可以使用验证数据集应用正则化和提前停止。

例如,以下图显示了训练 GBT 模型时训练集和验证集的损失和准确率曲线。请注意曲线的差异程度,这表明过拟合程度较高。

训练损失和验证损失与决策树数量的对比图。随着决策树数量的增加,训练损失逐渐降低。不过,验证损失仅在决策树数量达到约 40 个时才会下降。如果决策树超过 40 个,验证损失实际上会增加。使用 400 个决策树时,训练损失与验证损失之间的差距非常大。

图 29. 损失与决策树数量的关系。

 

训练准确率和验证准确率与决策树数量的对比图。随着决策树数量的增加,训练准确性会逐渐提高,在 400 个决策树时达到峰值,几乎为 1.0。验证准确率在 40 个决策树时会增加到约 0.86,然后在 400 个决策树时逐渐下降到约 0.83。

图 30. 准确率与决策树数量。

 

梯度提升树的常见正则化参数包括:

  • 树的最大深度。
  • 收缩率。
  • 每个节点测试的属性的比例。
  • 损失函数的 L1 和 L2 系数。

请注意,决策树通常比随机森林模型要浅得多。默认情况下,TF-DF 中的梯度提升树会生长到深度 6。 由于树的深度较浅,因此每个叶子节点的最小示例数影响不大,通常不需要进行调整。

当训练示例数量较少时,需要验证数据集是一个问题。因此,通常是在交叉验证循环中训练梯度提升树,或者在已知模型不会过拟合时停用提前停止。

用法示例

在上一章中,我们对一个小型数据集训练了随机森林。在此示例中,我们只需将随机森林模型替换为梯度提升树模型即可:

model = tfdf.keras.GradientBoostedTreesModel()

# Part of the training dataset will be used as validation (and removed
# from training).
model.fit(tf_train_dataset)

# The user provides the validation dataset.
model.fit(tf_train_dataset, validation_data=tf_valid_dataset)

# Disable early stopping and the validation dataset. All the examples are
# used for training.
model.fit(
   tf_train_dataset,
   validation_ratio=0.0,
   early_stopping="NONE")
# Note: When "validation_ratio=0", early stopping is automatically disabled,
# so early_stopping="NONE" is redundant here.

使用和限制

梯度提升树有一定的优缺点。

优点

  • 与决策树一样,它们原生支持数值特征和分类特征,通常不需要特征预处理。
  • 梯度提升树具有默认超参数,通常可提供出色的结果。不过,调整这些超参数可以显著改进模型。
  • 梯度提升树模型通常体积较小(节点数和内存用量较小),并且运行速度较快(通常只需 1 到 2 微秒即可处理一个示例)。

缺点

  • 决策树必须按顺序进行训练,这可能会大大减慢训练速度。不过,决策树较小,这在一定程度上抵消了训练速度放慢的影响。
  • 与随机森林一样,梯度提升树无法学习和重复使用内部表示法。每个决策树(以及每个决策树的每个分支)都必须重新学习数据集模式。在某些数据集中(尤其是包含非结构化数据 [例如图片、文本] 的数据集),这会导致梯度提升树的结果不如其他方法。