是否可以在R中交叉验证并使用xgboost(xgb.cv)保存交叉验证的模型?

时间:2016-04-09 22:09:05

标签: r xgboost

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)的方法,其中包含新数据。

我的理解是否准确,是否有任何解决方法?

1 个答案:

答案 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函数族是选择交叉验证折叠的有用工具。