过拟合、正则化和早停法

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

例如,下图显示了训练 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 个或几个 μs / 示例)。

缺点

  • 决策树必须依序训练,这可能会显著降低训练速度。但是,由于决策树较小,训练速度会有所抵消。
  • 与随机森林一样,梯度提升树无法学习和重复使用内部表示法。每个决策树(以及每个决策树的每个分支)都必须重新学习数据集模式。在某些数据集(尤其是包含非结构化数据的数据集(例如图片、文本)中),这会导致梯度提升树的结果比其他方法更差。