我遇到了一个问题,在将xgboost保存到二进制文件后,它不会产生可重复的结果。
R版本: 4.1.2
XGBoost版本1.5.2.1
方法如下(logistic回归,gbtree):
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
现在我把垃圾桶读回来了
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
我已经发现,如果我将参数手动加载回模型中,它就能工作。
例如
remove(bst)
bst <- xgb.load(savefilemodelloc)
xgb.parameters(bst) <- best.params
min(predict(bst, dtest))
max(predict(bst, dtest))现在这就产生了:
最小值= 0.17932555079
最大值= 0.78802382946
我不确定这是否是预期的行为。
发布于 2022-03-08 22:26:04
我以前也遇到过这个问题,我通过保存.rds格式的模型来“解决它”。我的预测没有那么极端(<1%的差异在保存/导入之前/之后),但我认为这与“丢失”xgboost模型对象的特定参数有关(与“早期停止”有关吗?)当使用xgb.save()保存模型时。
我把模型保存为:
文本
xgboost::xgb.dump(model = xgb,
fname = "xgb_model_text.txt",
with_stats = TRUE, dump_format = c("text"))二进制
xgboost::xgb.save(model = xgb, fname = "xgb.model")R对象(.rds)
saveRDS(object = xgb, file = "xgb.model.rds")我还将特性名保存到一个文件中(非常有用,强烈推荐):
# 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)要在模型中加载以“重复”我使用的预测:
xgb2 <- readRDS("xgb.model.rds")
xgb2 <- xgb.Booster.complete(xgb2)有更多的,但希望这将解决您的眼前问题。
发布于 2022-03-10 18:30:29
基于贾里德上面所说的暗示,我能够解决我的问题。问题似乎是,如果保存xgboost bin文件,它将不保留使用的参数。解决方案是将参数加载回。我试着将模型保存到一个json文件中,但每次尝试时它都会使我的rsession崩溃。看来垃圾桶是我唯一的选择。
方法如下(logistic回归,gbtree):
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
现在把垃圾箱读回来
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
https://stackoverflow.com/questions/71401330
复制相似问题