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

问题描述 投票:0回答:2

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
)的方法。

我的理解准确吗?有什么解决方法吗?

r xgboost
2个回答
2
投票

我相信您的理解是准确的,并且没有设置可以保存交叉验证的模型。

为了更好地控制交叉验证,您可以使用

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


0
投票

如果您使用插入符号,您可以定义一个自定义模型方法,在调用

fit()
时保存模型。简而言之,复制您想要与
caret::getModelInfo()
一起使用的模型并将其分配给
custom_method
。然后,修改
custom_method$fit()
函数以将
out
变量(模型)保存到 RDS 文件(但请注意,函数中的最后一行仍应为
out
以返回模型)。最后,将
custom_method
传递给
method
中的
caret::train()
参数。这可能会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.