在 R 中暂停和恢复插入符训练
Pause and resume caret training in R
假设我将在 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.iteration
和 previous.training
都不存在于 train
函数中。如果它已经在 train
函数中实现,我只是尽力在代码中表示实现我的目标的理想世界。但是,由于参数不存在,是否有办法通过以某种方式欺骗函数来实现此目标(即在多个 运行 中进行插入符号训练)?
我尝试使用 trainControl
函数但没有成功。
t.control <- trainControl(repeats=5)
nn <- train(Class ~ ., data = training,
method = "nnet",
trControl = t.control)
通过这样做,迭代次数仍远高于 5,正如我想在示例中获得的那样。
我几乎可以肯定,这在当前基础设施中实现起来非常复杂。但是,我将向您展示如何使用 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 是我所知道的唯一一个。
然而,无论算法的一个训练实例的长度如何,这种算法的调整(超参数的评估)需要更多的时间,因此能够 pause/resume 调整更有利如上例所示。
如果您觉得这很有趣,这里有一些学习 mlr3 的资源
https://mlr3book.mlr-org.com/
https://mlr3gallery.mlr-org.com/
也看看 mlr3pipelines - https://mlr3pipelines.mlr-org.com/articles/introduction.html
假设我将在 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.iteration
和 previous.training
都不存在于 train
函数中。如果它已经在 train
函数中实现,我只是尽力在代码中表示实现我的目标的理想世界。但是,由于参数不存在,是否有办法通过以某种方式欺骗函数来实现此目标(即在多个 运行 中进行插入符号训练)?
我尝试使用 trainControl
函数但没有成功。
t.control <- trainControl(repeats=5)
nn <- train(Class ~ ., data = training,
method = "nnet",
trControl = t.control)
通过这样做,迭代次数仍远高于 5,正如我想在示例中获得的那样。
我几乎可以肯定,这在当前基础设施中实现起来非常复杂。但是,我将向您展示如何使用 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 是我所知道的唯一一个。
然而,无论算法的一个训练实例的长度如何,这种算法的调整(超参数的评估)需要更多的时间,因此能够 pause/resume 调整更有利如上例所示。
如果您觉得这很有趣,这里有一些学习 mlr3 的资源
https://mlr3book.mlr-org.com/
https://mlr3gallery.mlr-org.com/
也看看 mlr3pipelines - https://mlr3pipelines.mlr-org.com/articles/introduction.html