如何限制执行时间,但将输出保存在R中?
我试图限制分析的执行时间,但是我想保留分析已经完成的内容。 在我的例子中,我正在运行如何限制执行时间,但将输出保存在R中?,r,machine-learning,time,limit,xgboost,R,Machine Learning,Time,Limit,Xgboost,我试图限制分析的执行时间,但是我想保留分析已经完成的内容。 在我的例子中,我正在运行xgb.cv(来自xgboostR包),我希望保持所有迭代,直到分析达到10秒(或“n”秒/分钟/小时) 我尝试了中提到的方法,但在达到10秒后停止,而没有保持之前的迭代 这是我的密码: require(xgboost) require(R.utils) data(iris) train.model <- model.matrix(Sepal.Length~., iris) dtrain <- x
xgb.cv
(来自xgboost
R包),我希望保持所有迭代,直到分析达到10秒(或“n”秒/分钟/小时)
我尝试了中提到的方法,但在达到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"))
谢谢大家! 编辑-稍微接近您想要的内容:
用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 " ...
当然,这并不完美。我想你想对这些文件执行一些操作,但这并不是最好的格式。然而,将其转化为更易于管理的东西并不是一项艰巨的任务。我还没有找到在超时之前保存实际
xgb.cv$evaluation\u log
对象的方法。这是一个很好的问题。你能将你的任务并行化吗?如果是,请了解并行:parLapply@Andre. 我熟悉并行化,但那不是我想要的。谢谢。如果以某种方式使用while循环,在每次迭代后用sys.time()记录时间,并在差值达到10秒时停止?@Ken。谢谢你的评论。问题是我不知道如何在迭代超时之前将迭代保持在xgb.cv
(或xgb.train
)之内。@patL我更新了我的答案。可能更接近你和未来的读者想要做的事情。干杯非常感谢你。尽管我无法将结果“保存在”R
Session中,但这对我需要的内容很有帮助。如果我能在R中得到这个evaluationLog
,这样我就可以处理它了。投票通过了,没问题。我在原来的帖子中拼错了,这里有一个下划线。但是,这是一个非常有趣的问题,我会继续研究。如果能够在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("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()
[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