【问题标题】:Pause and resume caret training in R在 R 中暂停和恢复插入符号训练
【发布时间】:2020-09-10 01:21:47
【问题描述】:

假设我将在 R 中进行 caret 培训,但我想将此培训分成两个运行会话。

library(mlbench)
data(Sonar)
library(caret)
set.seed(998)
inTraining <- createDataPartition(Sonar$Class, p = .75, list = FALSE)
training <- Sonar[ inTraining,]
testing  <- Sonar[-inTraining,]

# First run session
nn.partial <- train(Class ~ ., data = training, 
                method = "nnet",
                 max.turns.of.iteration=5) # Non-existent parameter. But represents my goal

假设 nn 完整对象在第 5 回合之前我只有一个部分对象具有训练信息(即nn.partial)。因此,将来我可以运行以下代码来完成训练工作:

library(mlbench)
data(Sonar)
library(caret)
set.seed(998)
inTraining <- createDataPartition(Sonar$Class, p = .75, list = FALSE)
training <- Sonar[ inTraining,]
testing  <- Sonar[-inTraining,]

nn <- train(Class ~ ., data = training, 
                 method = "nnet",
                 previous.training=nn.partial) # Non-existent parameter. But represents my goal

我知道max.turns.of.iterationprevious.training 都不存在于train 函数中。我只是尽力在代码中表示如果已经在 train 函数中实现了实现我的目标的理想世界。但是,由于参数不存在,有没有办法通过以某种方式欺骗函数来实现这个目标(即在不止一次运行中进行插入符号训练)?

我尝试使用trainControl 函数但没有成功。

t.control <- trainControl(repeats=5)
nn <- train(Class ~ ., data = training, 
                 method = "nnet",
trControl = t.control)

通过这样做,迭代次数仍然远高于 5,正如我想在我的示例中获得的那样。

【问题讨论】:

  • nnet() 函数有参数maxitwts,听起来很像您的想法。这些可以在插入符号的train(..., method = 'nnet') 中传递。那是我会开始的,我猜。
  • @PinotTiger,显然maxit 改变了每轮的最大迭代次数,而不是最大轮数
  • 请注意正确的标签是r-caret不是 caret(已编辑)。
  • 在我看来,这在插入符号中很难实现。但是看看 mlr3,它可以让你随意停止和恢复配置训练。

标签: r machine-learning parallel-processing neural-network r-caret


【解决方案1】:

我几乎可以肯定,在插入符号当前的基础架构中实现这一点非常复杂。不过,我将向您展示如何使用 mlr3 实现这种开箱即用的功能。

示例所需的包

library(mlr3)
library(mlr3tuning)
library(paradox)

获取示例任务并定义要调整的学习器:

task_sonar <- tsk('sonar')
learner <- lrn('classif.rpart', predict_type = 'prob')

定义要调整的超参数:

ps <- ParamSet$new(list(
  ParamDbl$new("cp", lower = 0.001, upper = 0.1),
  ParamInt$new("minsplit", lower = 1, upper = 10)
))

定义调谐器和重采样策略

tuner <- tnr("random_search")
cv3 <- rsmp("cv", folds = 3)

定义调优实例

instance <- TuningInstance$new(
  task = task_sonar,
  learner = learner,
  resampling = cv3,
  measures = msr("classif.auc"),
  param_set = ps,
  terminator = term("evals", n_evals = 100) #one can combine multiple terminators such as clock time, number of evaluations, early stopping (stagnation), performance reached - ?Terminator
)

调:

tuner$tune(instance)

现在按停止在一秒钟后停止 Rstudio 中的任务

instance$archive()

    nr batch_nr  resample_result task_id    learner_id resampling_id iters params tune_x warnings errors classif.auc
 1:  1        1 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7105586
 2:  2        2 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7372720
 3:  3        3 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7335368
 4:  4        4 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7335368
 5:  5        5 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7276246
 6:  6        6 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7111217
 7:  7        7 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.6915560
 8:  8        8 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7452875
 9:  9        9 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7372720
10: 10       10 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7172328

在我的例子中,它完成了 10 次随机搜索迭代。 例如,您现在可以调用

save.image()

关闭 RStudio 并重新打开同一个项目

或在您希望保留的对象上使用saveRDS/readRDS

saveRDS(instance, "i.rds")
instance <- readRDS("i.rds")

加载所需的包后,继续训练

tuner$tune(instance)

几秒钟后再次停止:

在我的例子中,它完成了额外的 12 次迭代:

instance$archive()

    nr batch_nr  resample_result task_id    learner_id resampling_id iters params tune_x warnings errors classif.auc
 1:  1        1 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7105586
 2:  2        2 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7372720
 3:  3        3 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7335368
 4:  4        4 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7335368
 5:  5        5 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7276246
 6:  6        6 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7111217
 7:  7        7 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.6915560
 8:  8        8 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7452875
 9:  9        9 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7372720
10: 10       10 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7172328
11: 11       11 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7325289
12: 12       12 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7105586
13: 13       13 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7215133
14: 14       14 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.6915560
15: 15       15 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.6915560
16: 16       16 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7335368
17: 17       17 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7276246
18: 18       18 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7111217
19: 19       19 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7172328
20: 20       20 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7276246
21: 21       21 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7105586
22: 22       22 <ResampleResult>   sonar classif.rpart            cv     3 <list> <list>        0      0   0.7276246

在不按停止的情况下再次运行它

tuner$tune(instance)

它将完成 100 次评估

限制:上面的示例将调整(超参数的评估)拆分为多个会话)。但是,它不会将一个训练实例拆分为多个会话 - R 中很少有包支持这种东西 - keras/tensorflow 是我所知道的唯一一个。

但是,无论算法的一个训练实例的长度如何,这种算法的调整(超参数的评估)都需要更多时间,因此能够像上面那样暂停/恢复调整更有利例子。

如果你觉得这很有趣,这里有一些学习 mlr3 的资源

https://mlr3book.mlr-org.com/
https://mlr3gallery.mlr-org.com/

看看 mlr3pipelines - https://mlr3pipelines.mlr-org.com/articles/introduction.html

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 2018-06-24
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2018-08-30
    • 2014-06-14
    相关资源
    最近更新 更多