R 中的几乎所有机器学习包/函数都允许您在训练模型时获得交叉验证性能指标。
据我所知,使用 xgboost 进行交叉验证的唯一方法是设置一个
xgb.cv
语句,如下所示:
clf <- xgb.cv( params = param,
data = dtrain,
nrounds = 1000,
verbose = 1,
watchlist = watchlist,
maximize = FALSE,
nfold = 2,
nthread = 2,
prediction = T
)
但即使使用
prediction = T
选项,您也只是从训练数据中获得预测结果。我没有找到在带有新数据的 clf
语句中使用生成的对象(本示例中的 predict
)的方法。
我的理解准确吗?有什么解决方法吗?
我相信您的理解是准确的,并且没有设置可以保存交叉验证的模型。
为了更好地控制交叉验证,您可以使用
xgboost
训练 caret
模型(请参阅此处 trainControl
函数的更多详细信息 http://topepo.github.io/caret/training.html)
然而,除非我弄错了,
caret
还缺少保存每个 CV 模型以供稍后预测的选项(尽管您可以手动指定您希望评估它们的指标)。根据使用 CV 模型预测新数据的原因,您可以 1) 从最终模型中检索 CV 模型的索引,以重新训练该特定模型(无需交叉验证,但使用相同的种子)只是数据的子集(来自 $control$index
的 caret
函数生成的对象内的 train
列表:
> library(MASS) # For the Boston dataset
> library(caret)
> ctrl <- trainControl(method = "cv", number = 3, savePred=T)
> mod <- train(medv~., data = Boston, method = "xgbLinear", trControl = ctrl)
> str(mod$control$index)
List of 3
$ Fold1: int [1:336] 2 3 4 6 8 9 13 14 17 19 ...
$ Fold2: int [1:338] 1 2 4 5 6 7 9 10 11 12 ...
$ Fold3: int [1:338] 1 3 5 7 8 10 11 12 14 15 ...
或 2) 使用
lapply
或 for
循环手动交叉验证以保存您创建的所有模型。 createFolds
中的 caret
函数系列是选择交叉验证折叠的有用工具。
如果您使用插入符号,您可以定义一个自定义模型方法,在调用
fit()
时保存模型。简而言之,复制您想要与 caret::getModelInfo()
一起使用的模型并将其分配给 custom_method
。然后,修改 custom_method$fit()
函数以将 out
变量(模型)保存到 RDS 文件(但请注意,函数中的最后一行仍应为 out
以返回模型)。最后,将 custom_method
传递给 method
中的 caret::train()
参数。这可能会起作用。