是否可以使用 TensorFlow 从许多单独的决策树构建决策森林?另外,根据某些性能标准删除和添加决策林中的单个树?让我们考虑一下,如果多个工作人员训练他们的树,并在过程结束时将他们的树发送到决策林中进行聚合。我计划在联邦学习中使用这个模型,其中服务器有一个决策林,设备发送它们的树进行聚合。
我觉得有点难以理解这个解决方案是否可行。
这里是 TF-DF 开发者。
在 TF-DF 中执行此操作是可能的(但可能非常慢),尽管这有点超出“正常”用例。您需要的关键工具是“模型检查器”(从模型构建器中提取树)和“模型构建器”(将树添加到模型中)。 这里有这些工具的教程。我将尝试概述主要步骤。
TF-DF 树可以用
tfdf.py_tree.tree.Tree
类表示。从现有模型中,您可以像这样提取一棵树:
tree_idx = 4 # Which tree to extract
insp = source_model.make_inspector() # source_model is a TF-DF model
t = inspector.extract_tree(tree_idx=0)
现在我们使用树构建模型:
# Create some model
builder = tfdf.builder.RandomForestBuilder(
path="/tmp/manual_model",
objective=tfdf.py_tree.objective.ClassificationObjective(
label="color", classes=["red", "blue", "green"]))
builder.add_tree(t)
# ... possibly add more trees
builder.close()
# Now load the model
manual_model = tf_keras.models.load_model("/tmp/manual_model")
您还可以使用 TF-DF 的姊妹库 YDF,它可以更快、更轻松地处理此任务。主要优点是YDF允许您直接在内存中修改模型,而TF-DF仅修改磁盘上的模型文件。 YDF模型可以导出为TF-DF,因此在许多情况下这将是更好的选择。修改模型的文档位于此处。
在ydf中,上面的代码将是
import ydf # Import the library
tree_idx = 4 # Which tree to extract
tree = source_model.get_tree(tree_idx)
现在我们使用树构建一个模型。请注意,这里的数据集仅用于定义输入特征,而不用于训练(因为模型是使用 0 棵树创建的)。
manual_model = model = ydf.RandomForestLearner(label="label", num_trees=0, task=ydf.Task.REGRESSION).train(dataset)
manual_model.add_tree(tree) # Add the tree.