r-{caret}xgbTree模型在包括重量的情况下不跑步,没有重量也能跑得很好



我有一个数据集,从中构建一个没有权重的xgbTree模型没有问题,但一旦我包含了权重——即使权重都是1——模型也不会收敛。我得到了Something is wrong; all the RMSE metric values are missing:错误,当我打印警告时,我会得到In nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, ... :There were missing values in resampled performance measures.作为最后一条消息。

这是一个指向包含信息的RData文件的驱动器链接——它太大了,无法打印,较小的样本并不总是能重现错误。

它包含3个对象:input_xinput_ywts——最后一个对象只是一个1的向量,但它最终应该能够接受区间(0,1(上的数字,理想情况下。我使用的代码如下所示。请注意产生错误的权重参数旁边的注释。

nrounds<-1000
tune_grid <- expand.grid(
nrounds = seq(from = 200, to = nrounds, by = 50),
eta = c(0.025, 0.05, 0.1, 0.3),
max_depth = c(2, 3, 4, 5),
gamma = 0,
colsample_bytree = 1,
min_child_weight = 1,
subsample = 1
)
tune_control <- caret::trainControl(
method = "cv", 
number = 3, 
verboseIter = FALSE, 
allowParallel = TRUE 
)
xgb_tune <- caret::train(
x = input_x,
y = input_y,
weights = wts, # If I remove this line, the code works fine. When included, even if just 1s, it throws an error.
trControl = tune_control,
tuneGrid = tune_grid,
method = "xgbTree",
verbose = TRUE
)

编辑13.10.2021.感谢@waterpolo

指定权重的正确方法是通过weights参数到caret::train

xgb_tune <- caret::train(
x = input_x,
y = input_y,
weights = wts,
trControl = tune_control,
tuneGrid = tune_grid,
method = "xgbTree",
verbose = TRUE
)

在这里可以看到一个更详细的答案:在应用varImp函数时,将xgbTree方法与Caret和weights一起用于目标变量时出现非树模型错误

下面的旧错误答案:

根据函数源的权值自变量称为wts

线路:

if (!is.null(wts))
xgboost::setinfo(x, 'weight', wts)

运行

xgb_tune <- caret::train(
x = input_x,
y = input_y,
wts = wts,
trControl = tune_control,
tuneGrid = tune_grid,
method = "xgbTree",
verbose = TRUE
)

应该产生期望的结果。

只是想添加来自另一个帖子的@missuse响应(在使用带有Caret的xgbTree方法时出现非树模型错误,在应用varImp函数时将权重添加到目标变量(。正确的参数是weights

代码:

xgb_tune <- caret::train(x = input_x,
y = input_y,
weights = wts,
trControl = tune_control,
tuneGrid = tune_grid,
method = "xgbTree",
verbose = TRUE
)

我发现的另一件事是,我需要使用权重>1,否则我会收到与您相同的错误消息。例如,如果我使用反向加权,我会收到和你相同的消息。希望这能有所帮助。

感谢@missuse在另一个帖子中的可爱回应!

相关内容

最新更新