常见问题解答
关于 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。