1

我正在运行一个朴素贝叶斯模型,klaR直接使用该包非常快,在标准笔记本电脑上计算不到一秒:

mod <- NaiveBayes(category ~ ., data=training, na.action = na.omit)

然而,使用caret包的train()接口——我认为这只是上述函数的包装——需要很长时间:

mod <- train(category ~ ., data=training, na.action = na.omit, method="nb")

我猜这是因为train默认包含一些重采样。我尝试包含trControl = trainControl(method = "none")但收到以下错误:

Error in train.default(x, y, weights = w, ...) : Only one model should be specified in tuneGrid with no resampling

任何想法为什么会发生这种情况或对这两个功能之间的速度差异的一般想法?

另外,速度差异有没有可能与公式界面有关?我的一些预测因子是超过一百个水平的因子。

4

1 回答 1

4

因为当您在caret::train没有指定任何的情况下调用时trControl, tuneGrid, tuneLength它默认对所有可能的超参数进行网格搜索

trControl = trainControl(), tuneGrid = NULL, tuneLength = 3

...更糟糕的是,它使用该特定模型的默认参数进行网格搜索(在本例中为 NaiveBayes)!

并且默认值trainControl绝对不是您想要的:method = "boot", number = 10 or 25,这是引导程序的 10/25 次完整传递,并且还保存了中间结果 ( returnData=T)。

所以你通过做覆盖了一个糟糕的默认值trControl = trainControl(method = "none"),但是它仍然在做一个网格搜索tuneGrid = NULL, tuneLength = 3。您需要明确设置/覆盖这些。

(正如@Khl4v 已经在评论中所说)

于 2015-07-17T00:38:25.873 回答