如何在 XGBoost 中提取树?

数据挖掘 分类 决策树 xgboost 助推
2021-10-08 18:57:31

我想提取每棵树,以便可以将任何数据提供给它,并查看输出。

dump_list=xg_clas.get_booster().get_dump()
num_t=len(dump_list)
print("Number of Trees=",num_t)

我可以找到这样的树的数量,

xgb.plot_tree(xg_clas, num_trees=0)
plt.rcParams['figure.figsize']=[50, 10]
plt.show()

像这样绘制每棵树。当我做类似的事情时:

转储列表[0]

它给了我作为文本的树。但我找不到任何方法将树提取为对象并使用它。

https://github.com/dmlc/xgboost/issues/117#ref-commit-3f6ff43 我发现了这一点,但并没有真正理解建议的内容。

进展:我试图以某种方式转向

转储列表[0]

将字符串对象转换为 sklearn DecisionTreeClassifier 对象。仍然没有运气。

如果您想查看,我上传了我的笔记本: https ://github.com/sciencelove11/Question

1个回答

这是一个开放的功能请求(在撰写本文时):
https ://github.com/dmlc/xgboost/issues/2175
https://github.com/dmlc/xgboost/issues/3439
在那里,非常浪费但有效提到了解决方案:预测使用ntree_limit每个感兴趣的树数。我在这里整理了一个快速演示 Colab 笔记本

在 SO 上也被多次询问过,请参见例如
https://stackoverflow.com/questions/51681714/extract-trees-and-weights-from-trained-xgboost-model
https://stackoverflow.com/questions/ 37677496/how-to-get-access-of-individual-trees-of-a-xgboost-model-in-python-r
及其相关问题。
在第一个链接中,提到了另一种解决方法:通过转储到文本/PMML,您应该能够重新加载每个单独的树(或其子集)并进行预测。但目前尚不清楚如何使这项工作:XGB 本身没有一种简单的方法来加载模型,除了从它自己的二进制格式。您可以通过将输出(JSON 似乎最有希望)解析到另一个带有树模型的库来实现。