gpt4 book ai didi

r - 如何限制执行时间但将输出保存在R中?

转载 作者:行者123 更新时间:2023-11-30 08:32:15 26 4
gpt4 key购买 nike

我正在尝试限制分析的执行时间,但我想保留分析已经完成的内容。就我而言,我正在运行 xgb.cv (来自 xgboost R 包),并且我想保留所有迭代,直到分析达到 10 秒(或“n”秒/分钟/小时)。

我已经尝试过 this thread 中提到的方法但它在达到 10 秒后停止,而不保留之前完成的迭代。

这是我的代码:

require(xgboost)
require(R.utils)

data(iris)
train.model <- model.matrix(Sepal.Length~., iris)

dtrain <- xgb.DMatrix(data=train.model, label=iris$Sepal.Length)

evalerror <- function(preds, dtrain) {
labels <- getinfo(dtrain, "label")
err <- sqrt(sum((log(preds) - log(labels))^2)/length(labels))
return(list(metric = "error", value = err))}

xgb_grid = list(eta = 0.05, max_depth = 5, subsample = 0.7, gamma = 0.3,
min_child_weight = 1)

fit_boost <- tryCatch(
expr = {evalWithTimeout({xgb.cv(data = dtrain,
nrounds = 10000,
objective = "reg:linear",
eval_metric = evalerror,
early_stopping_rounds = 300,
print_every_n = 100,
params = xgb_grid,
colsample_bytree = 0.7,
nfold = 5,
prediction = TRUE,
maximize = FALSE
)},
timeout = 10)
},
TimeoutException = function(ex) cat("Timeout. Skipping.\n"))

输出是

#Error in dim.xgb.DMatrix(x) : reached CPU time limit

谢谢!

最佳答案

编辑 - 稍微接近你想要的:

用 R 的 capture.output() 函数包装整个事情。这会将所有评估输出存储为 R 对象。再说一次,我认为你正在寻找更多的东西,但这至少是本地的和可塑的。语法:

fit_boost <- capture.output(tryCatch(expr = {evalWithTimeout({...}) ) )
> fit_boost
[1] "[1]\ttrain-error:2.033160+0.006109\ttest-error:2.034180+0.017467 " ...

原始答案:

您还可以使用sink 。只需在开始进行交叉验证之前添加此行即可:

sink("evaluationLog.txt")
fit_boost <- tryCatch(
expr = {evalWithTimeout({xgb.cv(data = dtrain,
nrounds = 10000,
objective = "reg:linear",
eval_metric = evalerror,
early_stopping_rounds = 300,
print_every_n = 100,
params = xgb_grid,
colsample_bytree = 0.7,
nfold = 5,
prediction = TRUE,
maximize = FALSE
)},
timeout = 10)
},
TimeoutException = function(ex) cat("Timeout. Skipping.\n"))
sink()

最后的 sink() 通常会将输出返回到控制台,但在本例中不会,因为会引发错误。但是,一旦运行此命令,您就可以打开 evaluationLog.txt 和 viola:

[1] train-error:2.033217+0.003705   test-error:2.032427+0.012808 
Multiple eval metrics are present. Will use test_error for early stopping.
Will train until test_error hasn't improved in 300 rounds.

[101] train-error:0.045297+0.000396 test-error:0.060047+0.001849
[201] train-error:0.042085+0.000852 test-error:0.059798+0.002382
[301] train-error:0.041117+0.001032 test-error:0.059733+0.002701
[401] train-error:0.040340+0.001170 test-error:0.059481+0.002973
[501] train-error:0.039988+0.001145 test-error:0.059469+0.002929
[601] train-error:0.039698+0.001028 test-error:0.059416+0.003018

当然,这并不完美。我想您想对这些执行一些操作,但这并不是最好的格式。然而,将其转换为更易于管理的东西并不是一项艰巨的任务。我还没有找到一种方法来在超时之前保存实际的 xgb.cv$evaluation_log 对象。这是一个非常好的问题。

关于r - 如何限制执行时间但将输出保存在R中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46428779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com