Skip to content

常见问题解答

关于 YDF

什么是决策森林?

决策森林是易于训练的机器学习模型,擅长处理表格数据。要深入了解其背后的数学原理,请查看Google 的决策森林在线课程

我想使用 YDF,应该从哪里开始?

从 YDF 的 Python API 开始,可以在 Notebook 或 Colab 中使用。Python API 是最全面(与 C++ API 并列)且用户友好的使用 YDF 的方式。

使用一个 API 训练的模型可以与其他 API 一起使用。例如,使用 Python API 训练的模型可以导出到 C++、Go 或 JavaScript 中进行服务。

YDF 是谁在什么时候创建的?

YDF 由 Google 瑞士的工程师创建并持续开发。

YDF 开发的一些里程碑:

  • 2017 年:作为 Google Research 中的实验库创建
  • 2018 年:作为 C++ API 和 CLI 接口投入生产。YDF 模型每秒被调用数千万次。
  • 2019 年:发布适用于 TensorFlow 1 的 TensorFlow 决策森林
  • 2020 年:发布适用于 TensorFlow 2(Keras API)的 TensorFlow 决策森林
  • 2021 年:开源并在 Google I/O 上展示
  • 2023 年:在 KDD23 上展示
  • 2023 年:开发独立的 Python API

YDF 与 TF-DF

我应该使用 YDF 还是 TensorFlow 决策森林(TF-DF)?

在几乎所有情况下,您都应该优先选择 YDF 而不是 TF-DF。

YDF 的 Python API 和 TF-DF 共享相同的 C++ 后端,因此它们的许多功能和生成的模型是相同的。然而,TF-DF 受限于实现 Keras 2 API 并使用 TensorFlow 内部机制。因此,TF-DF 比 YDF 的 Python API 更慢、更大且灵活性更低。

TF-DF 的现状如何?我还能使用 TF-DF 吗?

TF-DF 是一个生产级的库,在许多产品中得到支持和部署。它仍然可以使用,并且由 YDF 团队积极维护。然而,我们认为 YDF 的 Python API 更适合大多数新的使用场景(见下文比较)。

Python API 的现状如何?

YDF 的 Python API 已经与 TF-DF 实现了功能对等,并且正在积极开发更多功能。

YDF 和 TF-DF 有什么不同?

这两个库由同一个团队开发,并使用相同的训练代码,这意味着由任一库训练的模型将是相同的。YDF 是 TF-DF 的继任者,它在功能丰富性、效率和易用性方面都显著优于 TF-DF

  Yggdrasil 决策森林 TensorFlow 决策森林
模型描述 model.describe() 生成丰富的 HTML 或文本模型描述报告。 model.describe() 生成简单的文本报告。如果从磁盘加载模型,model.describe() 无法工作。
模型评估 model.evaluate(ds) 评估模型并返回包含准确率、AUC、ROC 曲线、置信区间等的丰富模型评估报告。 每个评估指标需要在调用 model.evalute() 之前通过 model.compile() 配置。无法生成 ROC 曲线或置信区间。无法评估排名和提升模型。
模型分析 model.analyze(ds) 生成包含变量重要性、PDP 和 CEP 的丰富模型分析 HTML 报告。 不可用
模型基准测试 model.benchmark(ds) 测量模型推理速度。 不可用
交叉验证 learner.cross_validation(ds) 执行交叉验证并返回丰富的模型评估报告。 不可用
异常检测 通过隔离森林及其扩展实现。 不可用
Python 模型服务 model.predict(ds) 进行预测。支持多种数据集格式(文件路径、pandas 数据框、numpy 数组字典、TensorFlow 数据集)。 在 TensorFlow 数据集上使用 model.predict(ds)。当从磁盘加载模型并调用 model.predict(ds) 时,可能需要调整特征数据类型。
TensorFlow 服务 / Vertex AI model.to_tensorflow_saved_model(path) 创建有效的 SavedModel。SavedModel 签名会自动构建。 model.save(path, signature)。模型签名应手动编写。
其他模型服务 模型可直接在 C++、Python、CLI、Go 和 Javascript 中使用。您还可以使用工具生成服务代码:例如,调用 model.to_cpp() 生成 C++ 服务代码。 调用 model.save(path, signature) 生成 TensorFlow SaveModel,并使用 TensorFlow C++ API 在 C++ 中运行模型。或者,将模型导出到 YDF。
训练速度 在小数据集上,训练速度比 TensorFlow 决策森林快 5 倍。在所有数据集大小上,模型推理速度比 TensorFlow 决策森林快 1000 倍。 在小数据集上,大部分时间花在 TensorFlow 数据集读取上。
库加载速度 YDF 库大小约为 9MB。 TF-DF 库大小约为 12MB,但它需要 TensorFlow,后者约为 600MB。
错误消息 简短、高层次且可操作的错误消息。 长且难以理解的错误消息,通常与张量形状有关。

常见建模问题

向我的模型添加一个空列会改变其质量。为什么?

YDF 训练是确定性的,受编译器优化和随机数生成器实现的变化影响。这意味着对于给定版本的 YDF,在相同数据上训练模型两次将产生相同的结果。

训练的一部分是随机的。例如,attribute_sampling_ratio 参数用于随机选择特征。这种随机选择使用伪随机数生成器进行,该生成器使用训练种子进行初始化。添加一个空列或打乱列顺序将改变随机生成结果,从而改变输出模型。这种变化类似于改变随机种子。

其他

YDF 支持哪些架构?

YDF 支持以下架构:

  • Manylinux2014 x86_64(将在下一次发布中更新到更新版本的 manylinux)。
  • MacOS Arm64

我们还发布 Windows 二进制文件,通常在发布后稍有延迟。

以下架构可能有效,但我们目前不会为它们发布二进制文件:

  • Manylinux2014 aarch64(将在下一次发布中更新到更新版本的 manylinux)。
  • MacOS Intel。

我的模型性能比使用 XYZ 库时更差/更好,为什么?

虽然决策森林库实现了类似的算法,但它们通常会产生不同的结果。这些差异的主要原因通常是不同库中默认超参数值的不同。例如,YDF 默认使用分治学习算法训练最大深度为 6 的 GBT。其他库可能使用其他默认超参数。

YDF 以其可用技术和功能的数量而著称。请参阅我们在 KDD 2023 上发表的论文 Yggdrasil Decision Forests: A Fast and Extensible Decision Forests Library 以比较使用不同库训练的模型性能。

是 PYDF 还是 YDF?

库的名称是 ydf,相应的 Pip 包名称也是如此。内部团队有时使用名称 PYDF,因为它非常合适。

我应该如何发音 PYDF?

首选发音是 "Py-dee-eff" / ˈpaɪˈdiˈɛf (IPA)。但由于这是一个内部名称,您实际上不必发音。

我有一个重要的问题,这个 FAQ 没有回答!

您可以在 Github 上提出 YDF 的问题。您也可以联系核心开发团队 decision-forests-contact@google.com