TensorFlow 决策森林简介
2021 年 5 月 27 日

作者:Mathieu Guillame-Bert,Sebastian Bruch,Josh Gordon,Jan Pfeifer

我们很高兴开源 TensorFlow 决策森林 (TF-DF)。TF-DF 是一个包含用于训练、服务和解释决策森林模型(包括随机森林和梯度提升树)的生产就绪最先进算法的集合。您现在可以使用这些模型进行分类、回归和排序任务 - 并具有 TensorFlow 和 Keras 的灵活性和可组合性。

GIF showing Random Forest decision model
随机森林是一种流行的决策森林模型类型。在这里,您可以看到一组树通过对结果进行投票来对示例进行分类。

关于决策森林

决策森林是一类机器学习算法,其质量和速度与神经网络(甚至在许多情况下优于神经网络)相媲美,尤其是在处理表格数据时。它们由许多 决策树 构成,这使得它们易于使用和理解 - 并且您可以利用现有的丰富可解释性工具和技术。

TF-DF 将此类模型以及一套定制工具带给 TensorFlow 用户

  • 初学者会发现开发和解释决策森林模型更容易。无需显式列出或预处理输入特征(因为决策森林可以自然地处理数值和类别属性),指定架构(例如,通过尝试不同的层组合,就像您在神经网络中所做的那样),或担心模型发散。模型训练完成后,您可以直接绘制模型或使用易于解释的统计数据对其进行分析。
  • 高级用户将受益于具有非常快推理时间的模型(在许多情况下,每个示例的推理时间不到微秒)。此外,此库为模型实验和研究提供了极大的可组合性。特别是,很容易将神经网络和决策森林结合起来。

如果您已经在 TensorFlow 之外使用决策森林,以下是 TF-DF 提供的一些功能

  • 它提供了一系列最先进的决策森林训练和服务算法,例如随机森林、梯度提升树、CART、(Lambda)MART、DART、Extra Trees、贪婪全局增长、斜树、单边采样、类别集学习、随机类别学习、包外评估和特征重要性以及结构特征重要性。
  • 此库可以作为连接到丰富的 TensorFlow 生态系统的桥梁,使您能够更轻松地将基于树的模型与各种 TensorFlow 工具 和平台(如 TFX)集成。
  • 对于不熟悉神经网络的用户,您可以使用决策森林作为开始使用 TensorFlow 的简单方法,并在此基础上继续探索神经网络。

代码示例

一个好的例子胜过千言万语。因此,在这篇博文中,我们将展示使用 TensorFlow 决策森林训练模型是多么容易。更多示例可在 TF-DF 网站GitHub 页面 上找到。您还可以观看我们在 Google I/O 2021 上的 演讲

训练模型

让我们从一个最小的示例开始,在这个示例中,我们在 表格 Palmer's Penguins 数据集上训练一个随机森林模型。目标是从动物的特征预测动物的物种。该数据集包含数值特征和类别特征,并存储为 csv 文件

Three examples from the Palmer's Penguins dataset.
来自 Palmer's Penguins 数据集的三个示例。

让我们训练一个模型

# Install TensorFlow Decision Forests
!pip install tensorflow_decision_forests

# Load TensorFlow Decision Forests
import tensorflow_decision_forests as tfdf

# Load the training dataset using pandas
import pandas
train_df = pandas.read_csv("penguins_train.csv")

# Convert the pandas dataframe into a TensorFlow dataset
train_ds = tfdf.keras.pd_dataframe_to_tf_dataset(train_df, label="species")

# Train the model
model = tfdf.keras.RandomForestModel()
model.fit(train_ds)

请注意,我们在代码中没有提供输入特征或超参数。这意味着,TensorFlow 决策森林将自动从该数据集中检测输入特征,并对所有超参数使用默认值。

评估模型

现在,让我们评估模型的质量

# Load the testing dataset
test_df = pandas.read_csv("penguins_test.csv")

# Convert it to a TensorFlow dataset
test_ds = tfdf.keras.pd_dataframe_to_tf_dataset(test_df, label="species")

# Evaluate the model
model.compile(metrics=["accuracy"])
print(model.evaluate(test_ds))
# >> 0.979311
# Note: Cross-validation would be more suited on this small dataset.
# See also the "Out-of-bag evaluation" below.

# Export the model to a TensorFlow SavedModel
model.save("project/my_first_model")

很容易吧?而且具有默认超参数的默认 RandomForest 模型为大多数问题提供了快速且良好的基线。一般来说,决策森林在处理中小型问题时训练速度很快,与许多其他类型的模型相比,需要更少的超参数调整,并且通常会提供不错的结果。

解释模型

既然您已经查看了训练模型的准确性,那么让我们考虑一下它的可解释性。如果您希望了解和解释正在建模的现象、调试模型或开始信任其决策,可解释性非常重要。如上所述,我们提供了一些工具来解释训练模型,从绘图开始。

tfdf.model_plotter.plot_model_in_colab(model, tree_idx=0)
tree structure

您可以直观地跟踪树结构。在这棵树中,第一个决策是基于 喙长。喙长超过 42.2 毫米的企鹅很可能是蓝色(Gentoo)或绿色(Chinstrap)物种,而喙较短的企鹅很可能是红色物种(Adelie)。

对于第一组,树接着询问鳍长。鳍长超过 206.5 毫米的企鹅很可能是绿色物种(Chinstrap),而其余的企鹅很可能是蓝色物种(Gentoo)。

模型统计数据是绘图的有益补充。示例统计数据包括

  • 每个特征被使用了几次?
  • 模型训练速度有多快(以树的数量和时间衡量)?
  • 节点在树结构中的分布情况如何(例如,大多数分支的长度是多少)?

这些以及更多此类问题的答案都包含在模型摘要中,并且可以通过模型检查器访问。

# Print all the available information about the model
model.summary()
>> Input Features (7):
>>   bill_depth_mm
>>   bill_length_mm
>>   body_mass_g
>>   ...
>> Variable Importance:
>>   1.    "bill_length_mm" 653.000000 ################
>>   ...
>> Out-of-bag evaluation: accuracy:0.964602 logloss:0.102378
>> Number of trees: 300
>> Total number of nodes: 4170
>>   ...

# Get feature importance as a array
model.make_inspector().variable_importances()["MEAN_DECREASE_IN_ACCURACY"]
>> [("flipper_length_mm", 0.149),
>>      ("bill_length_mm", 0.096),
>>      ("bill_depth_mm", 0.025),
>>      ("body_mass_g", 0.018),
>>      ("island", 0.012)]

在上面的示例中,模型是在默认超参数值下训练的。这是一个不错的第一个解决方案,但“调整”超参数通常可以进一步提高模型的质量。这可以通过以下方法完成

# List all the other available learning algorithms
tfdf.keras.get_all_models()
>> [tensorflow_decision_forests.keras.RandomForestModel,
>>  tensorflow_decision_forests.keras.GradientBoostedTreesModel,
>>  tensorflow_decision_forests.keras.CartModel]

# Display the hyper-parameters of the Gradient Boosted Trees model 
? tfdf.keras.GradientBoostedTreesModel
>> A GBT (Gradient Boosted [Decision] Tree) is a set of shallow decision trees trained sequentially. Each tree is trained to predict and then "correct" for the errors of the previously trained trees (more precisely each tree predicts the gradient of the loss relative to the model output)..
   ...
   Attributes:
     num_trees: num_trees: Maximum number of decision trees. The effective number of trained trees can be smaller if early stopping is enabled. Default: 300.
     max_depth: Maximum depth of the tree. `max_depth=1` means that all trees will be roots. Negative values are ignored. Default: 6.
   ...

# Create another model with specified hyper-parameters
model = tfdf.keras.GradientBoostedTreesModel(
    num_trees=500,
    growing_strategy="BEST_FIRST_GLOBAL",
    max_depth=8,
    split_axis="SPARSE_OBLIQUE",
    )

# Evaluate the model
model.compile(metrics=["accuracy"])
print(model.evaluate(test_ds))
# >> 0.986851

后续步骤

我们希望您喜欢阅读这个关于 TensorFlow 决策森林的简短演示,并且您像我们一样对使用它和为它做出贡献感到兴奋。

使用 TensorFlow 决策森林,您现在可以在 TensorFlow 中以最快的速度和最高的质量训练最先进的决策森林模型,并且只需付出最少的努力。如果您喜欢冒险,您现在可以将决策森林和神经网络结合起来,创建新型的混合模型。

如果您想详细了解 TensorFlow 决策森林库,我们整理了一些资源,并推荐以下内容

如果您有任何问题,请在 discuss.tensorflow.org 上使用标签“TFDF”提问,我们将尽力提供帮助。再次感谢。

下一篇文章
Introducing TensorFlow Decision Forests

作者:Mathieu Guillame-Bert,Sebastian Bruch,Josh Gordon,Jan Pfeifer 我们很高兴开源 TensorFlow 决策森林 (TF-DF)。TF-DF 是一个包含用于训练、服务和解释决策森林模型(包括随机森林和梯度提升树)的生产就绪最先进算法的集合。您现在可以使用这些模型进行分类、回归和排序……