为什么e1071给出了这个Naive Bayes分类器预测的NA?

时间:2016-09-23 05:04:49

标签: r

失败

library(e1071)

train.x <- data.frame(
  B=c(0,1,0),
  C=c(0,0,0),
  D=c(0,0,1),
  Z=c(1,0,0)
)

classifier <- naiveBayes(x=train.x, y=factor(c(TRUE, TRUE, FALSE)), laplace=1)  # use laplace (i.e. alpha) of nearly 0
predict(classifier, train.x, type="raw")

     FALSE TRUE
[1,]    NA   NA
[2,]    NA   NA
[3,]    NA   NA

WORKS

train.x <- data.frame(
  B=c(0,1,0,1),
  C=c(0,0,0,1),
  D=c(0,0,1,1),
  Z=c(1,0,0,1)
)

classifier <- naiveBayes(x=train.x, y=factor(c(TRUE, TRUE, FALSE, FALSE)), laplace=1)  # use laplace (i.e. alpha) of nearly 0
predict(classifier, train.x, type="raw")

              FALSE           TRUE
[1,] 0.000000002761 0.999999997239
[2,] 0.000000002761 0.999999997239
[3,] 0.997729292055 0.002270707945
[4,] 0.999999994295 0.000000005705

似乎这只有在至少有两个TRUE 两个FALSE的情况下才有效。

1 个答案:

答案 0 :(得分:0)

对于数值变量,naiveBayes使用每个变量的均值和标准差来计算每个类的每个变量的概率。由于您只有三个训练样例,因此必须至少定义一个类的标准偏差(您提供两个训练样例的类很好)。您可以通过查看分类器的tables属性来查看,该属性显示均值和标准偏差:

> classifier$tables
$B
                            B
factor(c(TRUE, TRUE, FALSE)) [,1]      [,2]
                       FALSE  0.0        NA
                       TRUE   0.5 0.7071068

$C
                            C
factor(c(TRUE, TRUE, FALSE)) [,1] [,2]
                       FALSE    0   NA
                       TRUE     0    0

$D
                            D
factor(c(TRUE, TRUE, FALSE)) [,1] [,2]
                       FALSE    1   NA
                       TRUE     0    0

$Z
                            Z
factor(c(TRUE, TRUE, FALSE)) [,1]      [,2]
                       FALSE  0.0        NA
                       TRUE   0.5 0.7071068

naiveBayes区分数字分类变量,并且分类变量在没有标准偏差的情况下工作的概率。因此,如果您将数据转换为逻辑,则可以正常工作:

train.x <- sapply(train.x, as.logical)
classifier <- naiveBayes(x=train.x, y=factor(c(TRUE, TRUE, FALSE)), laplace=1)
predict(classifier, train.x, type="raw")
         FALSE       TRUE
[1,] 0.4705882 0.52941176
[2,] 0.4705882 0.52941176
[3,] 0.9142857 0.08571429

所以,是的,每个班至少需要两个例子。除非你使用分类变量。