首页 > 解决方案 > 是否在每次调整评估中重新运行重新采样?

问题描述


我在尝试学习时间序列数据模型时遇到了困难。为此,我决定使用mlr3框架,特别是mlr3tuning::AutoTuner功能。整个设置如下所示:

at <- mlr3tuning::AutoTuner$new(
  learner = mlr3::lrn("classif.xgboost"),
  resampling = mlr3::rsmp("RollingWindowCV", window_size = 86400, horizon = 28800, folds = 24, fixed_window = F),
  measure = mlr3::msr("classif.costs", costs = costs),
  search_space = ps,
  terminator = mlr3tuning::trm("clock_time", stop_time = as.POSIXct("2021-08-13 10:00:00")),
  tuner = mlr3tuning::tnr("random_search")
)  

我收到的错误消息如下所示:

Error in .__Archive__add_evals(self = self, private = private, super = super,  : 
  Assertion on 'ydt[, self$cols_y, with = FALSE]' failed: Contains missing values (column 'classif.costs', row 1).

我试图自己处理这个问题,这就是我尝试过的

  1. 起初我尝试了简单的解决方案,如果错误消息表明有问题,msr("classif.costs", costs = costs)让我们将其更改为msr("classif.acc"). 但它所做的一切都改变measure了错误消息。

  2. 其次,我确保我的火车组中没有NA, NaN,Inf-Inf,但下一次尝试也产生了相同的错误消息。

     > df <- task$data()
     > sapply(df, function(x) sum(is.na(x))) %>% sum
      [1] 0
     > sapply(df, function(x) sum(is.nan(x))) %>% sum
      [1] 0
     > sapply(df, function(x) sum(is.infinite(x))) %>% sum
      [1] 0
    
  3. 最后,我遇到了在 mlr3 的 github 上解决的类似问题: Error on missing values without missing values 该问题被发现并描述为:非常不平衡的数据集导致一些交叉验证重新采样不包括所有标签。所以我开始检查这是否也适用于我的问题:

    • 首先是不平衡 - 所以数据是如此不平衡,但坦率地说,我认为它不会创建不完整(标签明智)的 cv 重采样组。

      > df[[task$target_names]] %>% table
      .
          -1      0      1 
      133024 413200 123584
      
    • 重采样本身——如果我们看一下重采样方案,就会清楚地看到,造成问题的最高机会出现在测试组之一中。它们中的每一个都包含 28800 个观测值,但让我们来看看它们的全部。上面的代码表示每个主题都有完整的标签集。

      免责声明
      我知道这些是随机拆分的,但是经过数百次重复后,我仍然无法找到没有全套标签的那个。

      > resample$instantiate(task)
      > rs <- resample$instance
      > sapply(1:24, function(x) df[[task$target_names]][rs$train[[x]]] %>% unique %>% length)
       [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
      > sapply(1:24, function(x) df[[task$target_names]][rs$test[[x]]] %>% unique %>% length)
       [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
      

但我的思考过程可能有问题,重采样可能是我无法训练模型的问题。这个假设的唯一问题是错误发生在第 x 次评估。所以,问题出在其他地方,或者在每次调整评估中重新运行重新采样,直到它创建不完整的组并产生错误,这可能吗?

我确实尝试使用带有随机标签的虹膜集上的恒定超参数对此进行测试,但我的结果优柔寡断。所以我仍然在问一个问题我做错了什么?

无论如何,感谢您的任何回答,干杯!

标签: rmachine-learningresamplingmlr3

解决方案


由于缺少数据并且看起来涉及一些非确定性组件,因此很难在这里提供准确的答案。

所以,问题出在其他地方,或者在每次调整评估中重新运行重新采样,直到它创建不完整的组并产生错误,这可能吗?

在调整期间创建一次重采样,并且在样本拆分上测试所有调整设置。

我建议为可重复性设置种子并在“正常”重采样中进一步调查(即不在嵌套场景中(=调整))。

如果匹配的超参数组合不顺利,模型训练可能会在调整场景中失败。但这些失败通常与训练数据无关。

您可以尝试通过将记录器阈值设置为“调试”来增加调试输出。

一般来说,它通常有助于简化问题、使用数据集的子集、减少调整空间等。处理不平衡的数据集/和/或异常值可能很麻烦,尤其是对于某些学习者(xgboost 就是其中之一)。


推荐阅读