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
)的方法,其中包含新数据。
我的理解是否准确,是否有任何解决方法?
答案 0 :(得分:1)
我相信您的理解是准确的,并且没有设置来保存交叉验证中的模型。
为了更好地控制交叉验证,您可以使用xgboost
培训caret
模型(请参阅此处trainControl
函数的详细信息http://topepo.github.io/caret/training.html)
然而,除非我弄错了,caret
也缺少保存每个CV模型以供稍后预测的选项(尽管您可以手动指定您希望对其进行评估的指标)。根据您使用CV模型预测新数据的原因,您可以1)从最终模型中检索CV模型的索引,以重新训练特定的一个模型(没有交叉验证,但使用相同的种子)只是该数据的子集(来自$control$index
的{{1}}函数生成的对象中的caret
列表:
train
或2)使用> 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 ...
或lapply
循环手动交叉验证,以保存您创建的所有模型。 for
中的createFolds
函数族是选择交叉验证折叠的有用工具。