新项目建议优先使用 YDF
YDF 是谷歌用于训练决策森林(Decision Forests)的新库。
YDF 扩展了 TF-DF 的功能,提供了新特性、简化的 API、更快的训练速度、更新后的文档以及与主流机器学习库更好的兼容性。
下文提到的部分问题已在 YDF 中得到解决。
Windows Pip 包不可用
TensorFlow Decision Forests 目前尚未提供 Windows Pip 包。
变通方法
- 解决方案 #1:在您的 Windows 机器上安装 Windows Linux 子系统 (WSL),并按照 Linux 说明进行操作。
与 Keras 3 不兼容
目前尚未实现与 Keras 3 的兼容。请使用 tf_keras 或 2.16 之前的 TensorFlow 版本。或者,使用 ydf。
未经 Conda 测试
虽然 TF-DF 可能可以在 Conda 下运行,但这未经测试,且我们目前未在 conda-forge 上维护相关包。
与旧版本或 nightly 版本的 TensorFlow 不兼容
TensorFlow 的 ABI 在不同发布版本间并不兼容。由于 TF-DF 依赖于自定义的 TensorFlow C++ 操作,每个版本的 TF-DF 都绑定到特定版本的 TensorFlow。最新发布的 TF-DF 版本始终与最新发布的 TensorFlow 版本绑定。
基于这些原因,当前版本的 TF-DF 可能与旧版本或 TensorFlow 的 nightly 构建版本不兼容。
如果使用了不兼容的 TF 和 TF-DF 版本,您将看到类似以下的晦涩错误:
tensorflow_decision_forests/tensorflow/ops/training/training.so: undefined symbol: _ZN10tensorflow11GetNodeAttrERKNS_9AttrSliceEN4absl14lts_2020_09_2311string_viewEPSs
- 请使用与您的 TensorFlow 版本兼容的 TF-DF 版本。
兼容性表
下表展示了 tensorflow_decision_forests 及其依赖项之间的兼容性
| tensorflow_decision_forests | tensorflow |
|---|---|
| 1.12.0 | 2.19.0 |
| 1.11.0 | 2.18.0 |
| 1.10.0 | 2.17.0 |
| 1.9.2 | 2.16.2 |
| 1.9.1 | 2.16.1 |
| 1.9.0 | 2.16.1 |
| 1.8.0 - 1.8.1 | 2.15.0 |
| 1.6.0 - 1.7.0 | 2.14.0 |
| 1.5.0 | 2.13.0 |
| 1.3.0 - 1.4.0 | 2.12.0 |
| 1.1.0 - 1.2.0 | 2.11.0 |
| 1.0.0 - 1.0.1 | 2.10.0 - 2.10.1 |
| 0.2.6 - 0.2.7 | 2.9.1 |
| 0.2.5 | 2.9 |
| 0.2.4 | 2.8 |
| 0.2.1 - 0.2.3 | 2.7 |
| 0.1.9 - 0.2.0 | 2.6 |
| 0.1.1 - 0.1.8 | 2.5 |
| 0.1.0 | 2.4 |
- 解决方案 #2:将您的预处理函数包装在另一个函数中,对其输入进行 降维 (squeeze)。
并非所有模型都支持分布式训练和分发策略
除非另有说明,否则模型均在单机上进行训练,且与分发策略不兼容。例如,GradientBoostedTreesModel 不支持分布式训练,而 DistributedGradientBoostedTreesModel 则支持。
变通方法
- 请使用支持分发策略的模型(例如
DistributedGradientBoostedTreesModel),或对数据集进行降采样,使其能够适应单机运行。
不支持 GPU / TPU。
TF-DF 不支持 GPU 或 TPU 训练。但是,使用 AVX 指令编译可能会加快推理服务速度。
不支持 model_to_estimator
TF-DF 未实现将训练好/未训练的模型转换为 Estimator 格式所需的 API。
加载的模型与 Python 模型行为不一致。
虽然通过 Keras API 进行了抽象,但在 Python 中实例化的模型(例如使用 tfdf.keras.RandomForestModel())和从磁盘加载的模型(例如使用 tf_keras.models.load_model())行为可能不同。值得注意的是,Python 实例化的模型会自动执行必要的类型转换。例如,如果将 float64 特征输入到期望 float32 的模型中,该转换会隐式执行。然而,对于从磁盘加载的模型,这种转换是不可行的。因此,务必确保训练数据和推理数据具有完全相同的类型。
Tensorflow 特征名称清理
Tensorflow 会清理特征名称,例如,可能会将它们转换为小写。