首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在以bin格式保存后,xgboost不提供可重复的预测。

在以bin格式保存后,xgboost不提供可重复的预测。
EN

Stack Overflow用户
提问于 2022-03-08 20:55:59
回答 2查看 245关注 0票数 1

我遇到了一个问题,在将xgboost保存到二进制文件后,它不会产生可重复的结果。

R版本: 4.1.2

XGBoost版本1.5.2.1

方法如下(logistic回归,gbtree):

代码语言:javascript
运行
复制
bst <- xgboost(
                params = best.params
                , data = dtrain
                , nrounds = nrounds
                , early_stopping_rounds = early_stopping_rounds
                , nthread = nthread
                , num_parallel_tree = num_parallel_tree
                , eval_metric =  eval_metric
                , verbose = 2  
                , print_every_n = 1
)

min(predict(bst, dtest))
max(predict(bst, dtest))
xgb.save(bst, savefilemodelloc)

这就产生了:

最小值= 0.17932555079

最大值= 0.78802382946

现在我把垃圾桶读回来了

代码语言:javascript
运行
复制
remove(bst)
bst <- xgb.load(savefilemodelloc)
min(predict(bst, dtest))
max(predict(bst, dtest))

这就产生了:

最小值= 0.49377295375

最大值= 0.50564271212

这是在完全相同的数据集上运行的,并且在接近相同结果的地方没有产生任何结果。我多次尝试重建这个模型,结果几乎相同。

型号大小约为17 is。

我的操作系统是RHEL 7

有人知道这是怎么回事吗?

更新3.8.2022

我已经发现,如果我将参数手动加载回模型中,它就能工作。

例如

代码语言:javascript
运行
复制
remove(bst)
bst <- xgb.load(savefilemodelloc)
xgb.parameters(bst) <- best.params
min(predict(bst, dtest))
max(predict(bst, dtest))

现在这就产生了:

最小值= 0.17932555079

最大值= 0.78802382946

我不确定这是否是预期的行为。

EN

回答 2

Stack Overflow用户

发布于 2022-03-08 22:26:04

我以前也遇到过这个问题,我通过保存.rds格式的模型来“解决它”。我的预测没有那么极端(<1%的差异在保存/导入之前/之后),但我认为这与“丢失”xgboost模型对象的特定参数有关(与“早期停止”有关吗?)当使用xgb.save()保存模型时。

我把模型保存为:

文本

代码语言:javascript
运行
复制
xgboost::xgb.dump(model = xgb,
                  fname = "xgb_model_text.txt",
                  with_stats = TRUE, dump_format = c("text"))

二进制

代码语言:javascript
运行
复制
xgboost::xgb.save(model = xgb, fname = "xgb.model")

R对象(.rds)

代码语言:javascript
运行
复制
saveRDS(object = xgb, file = "xgb.model.rds")

我还将特性名保存到一个文件中(非常有用,强烈推荐):

代码语言:javascript
运行
复制
# Write the model feature names to file
dt <- xgb.model.dt.tree(feature_names = NULL, model = xgb)

write.table(x = dt, file = "model_dt_tree.txt",
  quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE)

要在模型中加载以“重复”我使用的预测:

代码语言:javascript
运行
复制
xgb2 <- readRDS("xgb.model.rds")
xgb2 <- xgb.Booster.complete(xgb2)

有更多的,但希望这将解决您的眼前问题。

票数 1
EN

Stack Overflow用户

发布于 2022-03-10 18:30:29

基于贾里德上面所说的暗示,我能够解决我的问题。问题似乎是,如果保存xgboost bin文件,它将不保留使用的参数。解决方案是将参数加载回。我试着将模型保存到一个json文件中,但每次尝试时它都会使我的rsession崩溃。看来垃圾桶是我唯一的选择。

方法如下(logistic回归,gbtree):

代码语言:javascript
运行
复制
bst <- xgboost(
                params = best.params
                , data = dtrain
                , nrounds = nrounds
                , early_stopping_rounds = early_stopping_rounds
                , nthread = nthread
                , num_parallel_tree = num_parallel_tree
                , eval_metric =  eval_metric
                , verbose = 2  
                , print_every_n = 1
)

min(predict(bst, dtest))
max(predict(bst, dtest))
xgb.save(bst, savefilemodelloc)

这就产生了:

最小值= 0.17932555079

最大值= 0.78802382946

现在把垃圾箱读回来

代码语言:javascript
运行
复制
remove(bst)
bst <- xgb.load(savefilemodelloc)
xgb.parameters(bst) <- best.params  # this loads the special parameters back in
min(predict(bst, dtest))
max(predict(bst, dtest))

现在这就产生了:

最小值= 0.17932555079

最大值= 0.78802382946

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71401330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档