我有一个数据集,从中构建一个没有权重的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_x
、input_y
和wts
——最后一个对象只是一个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在另一个帖子中的可爱回应!