对于朴素贝叶斯,插入符号和 klaR 包之间的速度差异

Posted

技术标签:

【中文标题】对于朴素贝叶斯,插入符号和 klaR 包之间的速度差异【英文标题】:Speed difference between caret and klaR packages, for Naive Bayes 【发布时间】:2015-09-13 17:38:30 【问题描述】:

我正在运行朴素贝叶斯模型,直接使用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

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

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

【问题讨论】:

如果您不使用模型参数的自动调整和选择,您必须使用train()tuneGrid 参数指定模型参数(此处为flusekernel)功能。看到这个question Bryan,如果您发现有用的答案,您可以点赞或接受。 【参考方案1】:

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

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

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

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

因此,您通过执行trControl = trainControl(method = "none") 覆盖了一个错误的默认值,但这让人觉得它仍在使用tuneGrid = NULL, tuneLength = 3 进行网格搜索。您需要明确设置/覆盖这些。

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

【讨论】:

以上是关于对于朴素贝叶斯,插入符号和 klaR 包之间的速度差异的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用插入符号调整朴素贝叶斯分类器

R中的多项朴素贝叶斯分类器

通俗易懂-朴素贝叶斯

数据挖掘十大经典算法之朴素贝叶斯

朴素贝叶斯分类器原理

Naive Bayes朴素贝叶斯法