我正在运行朴素贝叶斯模型,直接使用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
为什么会出现这种情况的想法或关于两种功能之间速度差异的一般想法?
此外,速度差异是否有可能与公式界面有关?我的一些预测因素是超过一百个级别的因素。
答案 0 :(得分:3)
因为当您在未指定任何caret::train
,的情况下致电trControl, tuneGrid, tuneLength
时,默认情况下会对所有可能的超参数进行网格搜索 !!
trControl = trainControl(), tuneGrid = NULL, tuneLength = 3
......更糟糕的是,它使用特定模型的默认参数进行网格搜索(在这种情况下为NaiveBayes)!
trainControl
的默认值绝对不是你想要的:method = "boot", number = 10 or 25
,这是10/25整个bootstrap传递,也保存了中间结果(returnData=T
)。
因此,您通过执行trControl = trainControl(method = "none")
覆盖一个错误的默认值,但是发现它仍在使用tuneGrid = NULL, tuneLength = 3
进行网格搜索。您需要明确设置/覆盖它们。
(正如@ Khl4v已在评论中所述)