我在尝试学习时间序列数据的模型时遇到了困难。为此,我决定使用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).
我试着自己处理这个问题,我就是这么做的:
首先我尝试了简单的解决方案,如果错误信息表明
msr("classif.costs", costs = costs)
有问题,让我们将其更改为msr("classif.acc")
。但是它所做的只是在错误信息中改变了measure
。其次,我确保在我的训练集中没有
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
最后,我在mlr3的github上遇到了一个类似的问题:没有缺失值的缺失值错误这个问题被发现并描述为:非常不平衡的数据集导致一些交叉验证样本不包括所有标签. 所以我开始检查这是否也适用于我的问题:
首先失衡-所以数据是如此不平衡,但坦率地说,我不认为它可以创建不完整的(标签明智的)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次求值. 所以,问题是在其他地方或者在每个调优评估中重新运行重新采样直到它创建不完全组并产生一个错误,这是可能的吗?
我确实尝试在具有随机标签的虹膜集上使用恒定超参数进行测试,但我的结果是犹豫不决的。所以我仍然在问一个问题,我做错了什么?
不管怎样,谢谢你的回答。干杯!
在这里很难给出一个准确的答案,因为数据缺失,而且看起来有一些不确定的成分。
所以,问题是在其他地方,或者在每次调优评估中重新运行重新采样,直到它创建不完整组并产生错误,这是可能的吗?
在调优期间创建一次重新采样,所有调优设置都在样本分割上进行测试。
我建议为再现性设置一个种子,并在"正常"的情况下进一步研究。重采样(即不在嵌套场景中(=调优))。
如果匹配的超参数组合不能很好地进行,则模型训练可能会在调优场景中失败。但这些失败通常与训练数据无关。
您可以尝试通过将记录器阈值设置为"debug"来增加调试输出。
一般来说,它通常有助于简化问题,使用数据集的子集,减少调优空间等。处理不平衡数据集和/或异常值可能会很麻烦,特别是对于一些学习器(xgboost就是其中之一)。