如何知道在 XGBoost 中创建的树的数量

Posted

技术标签:

【中文标题】如何知道在 XGBoost 中创建的树的数量【英文标题】:How to know the number of tree created in XGBoost 【发布时间】:2018-10-29 18:37:53 【问题描述】:

我有一个关于 XGBoost 的问题。

你知道如何知道 XGBoost 中创建的树的数量吗? 与由模型制造商决定制作多少棵树的 RandomForest 不同,XGBoost 基本上会继续创建树,直到损失函数达到某个数字。所以我想知道这个。

谢谢。

【问题讨论】:

【参考方案1】:

有点歪,但我目前正在做的是dump-ing 模型(XGBoost 生成一个列表,其中每个元素都是单个树的字符串表示),然后计算有多少元素在列表:

# clf is a XGBoost model fitted using the sklearn API
dump_list = clf.get_booster().get_dump()
num_trees = len(dump_list)

【讨论】:

【参考方案2】:

在 java 中,似乎没有直接的方法来做到这一点。但是,您可以使用模型转储的结果来获取实际的树数。使用训练有素的Booster

int numberOfTrees = booster.getModelDump("", false, "text").length;

【讨论】:

【参考方案3】:

这由您作为用户控制。您是否使用本机训练 API,那么这是由 num_boost_round 控制的(默认为 10)请参阅文档 here:

num_boost_round (int) - 提升迭代次数。

如果您使用 sklearn API,则这由 n_estimators 控制(默认为 100)请参阅文档 here:

n_estimators : int 要适应的增强树的数量。

唯一需要注意的是,如果您设置了提前停止标准,这是要拟合的最大树数,拟合可以停止。我不确定你是否使用它。

【讨论】:

我想知道为什么这个答案被否决了?我是不是答错了问题或答案? @Mykhalio OP 想知道为给定的拟合 XGBoost 对象生成的树的实际数量。就像你写的那样,这可能小于用户定义的参数,所以不能使用。 @OmerB 可以是对原始问题的一种解释。但是,该问题没有提到提前停止程序并且含糊不清。如果配置中没有实现提前停止,那么我的回答是正确的。 @Mykhalio - 还有其他效果。例如,在多类问题中,XGBoost 为每个类创建单独的树,因此使用 3 个类和 10 轮提升,您可能会得到 30 棵树。总之,该参数既不能用作上限,也不能用作下限。

以上是关于如何知道在 XGBoost 中创建的树的数量的主要内容,如果未能解决你的问题,请参考以下文章

XGB:展示每个预测结果的各特征概率

xgboost predict 方法为所有行返回相同的预测值

xgboost predict 方法为所有行返回相同的预测值

R语言构建xgboost模型:使用xgb.DMatrix保存加载数据集使用getinfo函数抽取xgb.DMatrix结构中的数据

R语言构建xgboost模型:模型的保存(xgb.save)和加载(xgb.load)或者保存为R二进制文件(xgb.save.raw R binary vector)

R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能