Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何限制执行时间,但将输出保存在R中?_R_Machine Learning_Time_Limit_Xgboost - Fatal编程技术网

如何限制执行时间,但将输出保存在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