ClaR 和 Caret 中的朴素贝叶斯
Naive Bayees in klaR and caret
我使用包 klaR
将朴素贝叶斯应用于玩具数据集,一切正常。
接下来,我想使用 method="nb"
复制与 caret
相同的分析,这实际上只是 klaR
包中 NaiveBayes
函数的包装。
不过,后一种估计不行。我确实收到一条错误消息。
Error in NaiveBayes.default(x, y, usekernel = FALSE, fL = param$fL, ...) :
Zero variances for at least one class in variables: x1_disc_46, x1_disc_810, x2_disc_46
Timing stopped at: 0.01 0 0.02
我知道玩具数据集的局限性。然而,由于 klaR
包的分析确实 运行 通过,我想知道如何使用 caret
?
复制完全相同的分析
代码如下:
# Data
d <- structure(list(Y = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,
2L, 1L), .Label = c("0", "1"), class = "factor"), x1_disc = structure(c(1L,
2L, 1L, 2L, 3L, 4L, 4L, 5L, 2L, 4L), .Label = c("_02", "_24",
"_46", "_68", "_810"), class = "factor"), x2_disc = structure(c(1L,
1L, 1L, 1L, 2L, 3L, 3L, 3L, 1L, 2L), .Label = c("_02", "_24",
"_46"), class = "factor")), .Names = c("Y", "x1_disc", "x2_disc"
), row.names = c(NA, -10L), class = "data.frame")
# Works(klaR)
library(klaR)
fit2 <- NaiveBayes(Y ~ x1_disc + x2_disc, usekernel = FALSE, fL = 0, data=d)
predict(fit2, d, threshold = 0)
# Does not work (caret)
library(caret)
model2 <- train(form=Y ~ x1_disc + x2_disc,
data=d,
method="nb",
# Uses package klaR
# (see: http://topepo.github.io/caret/train-models-by-tag.html)
trControl=trainControl(method="none"),
tuneGrid = data.frame(fL=0, usekernel=F, adjust=1))
predict(model2, d, type="prob")
我将我的评论作为答案,因为它部分解决了您的问题。我遇到了这个 Cross Validated answer,它建议 运行 没有 S3 公式界面的插入符号模型,这将适用于您的情况:
model2 <- train(y=d$Y, x=d[, 2:3], ...)
我不知道这个问题的确切原因,这可能与 CV 问题的解释不同,因为他们没有错误。
我使用包 klaR
将朴素贝叶斯应用于玩具数据集,一切正常。
接下来,我想使用 method="nb"
复制与 caret
相同的分析,这实际上只是 klaR
包中 NaiveBayes
函数的包装。
不过,后一种估计不行。我确实收到一条错误消息。
Error in NaiveBayes.default(x, y, usekernel = FALSE, fL = param$fL, ...) :
Zero variances for at least one class in variables: x1_disc_46, x1_disc_810, x2_disc_46
Timing stopped at: 0.01 0 0.02
我知道玩具数据集的局限性。然而,由于 klaR
包的分析确实 运行 通过,我想知道如何使用 caret
?
代码如下:
# Data
d <- structure(list(Y = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,
2L, 1L), .Label = c("0", "1"), class = "factor"), x1_disc = structure(c(1L,
2L, 1L, 2L, 3L, 4L, 4L, 5L, 2L, 4L), .Label = c("_02", "_24",
"_46", "_68", "_810"), class = "factor"), x2_disc = structure(c(1L,
1L, 1L, 1L, 2L, 3L, 3L, 3L, 1L, 2L), .Label = c("_02", "_24",
"_46"), class = "factor")), .Names = c("Y", "x1_disc", "x2_disc"
), row.names = c(NA, -10L), class = "data.frame")
# Works(klaR)
library(klaR)
fit2 <- NaiveBayes(Y ~ x1_disc + x2_disc, usekernel = FALSE, fL = 0, data=d)
predict(fit2, d, threshold = 0)
# Does not work (caret)
library(caret)
model2 <- train(form=Y ~ x1_disc + x2_disc,
data=d,
method="nb",
# Uses package klaR
# (see: http://topepo.github.io/caret/train-models-by-tag.html)
trControl=trainControl(method="none"),
tuneGrid = data.frame(fL=0, usekernel=F, adjust=1))
predict(model2, d, type="prob")
我将我的评论作为答案,因为它部分解决了您的问题。我遇到了这个 Cross Validated answer,它建议 运行 没有 S3 公式界面的插入符号模型,这将适用于您的情况:
model2 <- train(y=d$Y, x=d[, 2:3], ...)
我不知道这个问题的确切原因,这可能与 CV 问题的解释不同,因为他们没有错误。