对于不同大小的非相同任务,我如何使用尊重时间顺序的自定义重采样?
How can I use custom resampling respecting temporal order for non identical tasks with different sizes?
我的任务中的行具有时间顺序(例如每月数据)。
我想执行“loo”类型的重采样,但训练数据必须始终早于测试数据。所以我要做的是通过以下方式生成自定义重采样:
# Instantiate Resampling
resampling_backtest = rsmp("custom")
train_sets = list(1:30) # n.b. we just deliberately call the list of splits "train_sets" and "test_sets"
test_sets = list(31) # for later use in the instantiated resampling class, they will automatically be named "train_set" and "test_set" and be lists
for (testmonth in (32:task$nrow)) {
train_sets <- append(train_sets, list(c(1:(testmonth-1))))
test_sets <- append(test_sets, list(c(testmonth)))
}
resampling_backtest$instantiate(task, train_sets, test_sets)
我的任务是具有一个“日期”列的大样本的不同子集。所有子样本都是“有序的”,因为我首先使用 task_n <- TaskClassif$new(...)
,然后对我的 n 个任务中的每一个使用 task_n$set_col_roles("Date", roles = "order")
。
现在,我有两个问题:
- 我已经定义了重采样方案,但是行 ID 值为例如“2”将指代不同的月份。这可能不是一个真正的问题,如果不是下面的观点
- 当我列出 n 个任务 (
list_of_tasks=list(task_1,...task_n)
) 并定义如下基准时,我会收到一条错误消息
design = benchmark_grid(
tasks = list_of_tasks,
learners = list_of_learners,
resamplings = resampling_backtest
)
错误信息是错误:所有任务必须是未实例化的,或者必须具有相同的行数。
那么,我可以在这里做什么?有没有办法交出“未实例化”的重采样?或者我是否需要为 n 个任务中的每一个任务分别手动定义重采样方案?如果是,我怎样才能把它交给benchmark_grid()
?
Or do I need to manually define a resampling scheme for each of the n tasks separately?
是的。只需使用 data.table()
手动创建基准设计。实例化重采样的示例:
library(mlr3)
library(data.table)
task_pima = tsk("pima")
task_spam = tsk("spam")
resampling_pima = rsmp("cv", folds = 3)
resampling_pima$instantiate(task_pima)
resampling_spam = rsmp("cv", folds = 3)
resampling_spam$instantiate(task_spam)
design = data.table(
task = list(task_pima, task_spam),
learner = list(lrn("classif.rpart"), lrn("classif.rpart")),
resampling = list(resampling_pima, resampling_spam)
)
bmr = benchmark(design)
``
我的任务中的行具有时间顺序(例如每月数据)。 我想执行“loo”类型的重采样,但训练数据必须始终早于测试数据。所以我要做的是通过以下方式生成自定义重采样:
# Instantiate Resampling
resampling_backtest = rsmp("custom")
train_sets = list(1:30) # n.b. we just deliberately call the list of splits "train_sets" and "test_sets"
test_sets = list(31) # for later use in the instantiated resampling class, they will automatically be named "train_set" and "test_set" and be lists
for (testmonth in (32:task$nrow)) {
train_sets <- append(train_sets, list(c(1:(testmonth-1))))
test_sets <- append(test_sets, list(c(testmonth)))
}
resampling_backtest$instantiate(task, train_sets, test_sets)
我的任务是具有一个“日期”列的大样本的不同子集。所有子样本都是“有序的”,因为我首先使用 task_n <- TaskClassif$new(...)
,然后对我的 n 个任务中的每一个使用 task_n$set_col_roles("Date", roles = "order")
。
现在,我有两个问题:
- 我已经定义了重采样方案,但是行 ID 值为例如“2”将指代不同的月份。这可能不是一个真正的问题,如果不是下面的观点
- 当我列出 n 个任务 (
list_of_tasks=list(task_1,...task_n)
) 并定义如下基准时,我会收到一条错误消息
design = benchmark_grid(
tasks = list_of_tasks,
learners = list_of_learners,
resamplings = resampling_backtest
)
错误信息是错误:所有任务必须是未实例化的,或者必须具有相同的行数。
那么,我可以在这里做什么?有没有办法交出“未实例化”的重采样?或者我是否需要为 n 个任务中的每一个任务分别手动定义重采样方案?如果是,我怎样才能把它交给benchmark_grid()
?
Or do I need to manually define a resampling scheme for each of the n tasks separately?
是的。只需使用 data.table()
手动创建基准设计。实例化重采样的示例:
library(mlr3)
library(data.table)
task_pima = tsk("pima")
task_spam = tsk("spam")
resampling_pima = rsmp("cv", folds = 3)
resampling_pima$instantiate(task_pima)
resampling_spam = rsmp("cv", folds = 3)
resampling_spam$instantiate(task_spam)
design = data.table(
task = list(task_pima, task_spam),
learner = list(lrn("classif.rpart"), lrn("classif.rpart")),
resampling = list(resampling_pima, resampling_spam)
)
bmr = benchmark(design)
``