【问题标题】:Why does naiveBayes return all NA's for multiclass classification in R?为什么 naiveBayes 在 R 中返回所有 NA 进行多类分类?
【发布时间】:2013-07-28 01:42:57
【问题描述】:

开始写这个问题,然后想出了答案。将其放在这里以供后代使用,因为很难找到答案。

我正在尝试使用 e1071 包中的 naiveBayes 分类器。为新数据生成 预测 似乎没有问题,但我实际上需要新数据类别的概率估计。

例子:

> model <- naiveBayes(formula=as.factor(V11)~., data=table, laplace=3)
> predict(model, table[,1:10]) 
[1] 4 4 4 4 4 4 4 4 1 1 1 3 3 1 1
> predict(model, table[,1:10], type="raw")
       1  2  3  4
 [1,] NA NA NA NA
 [2,] NA NA NA NA
 [3,] NA NA NA NA
 [4,] NA NA NA NA
 [5,] NA NA NA NA
 [6,] NA NA NA NA
 [7,] NA NA NA NA
 [8,] NA NA NA NA
 [9,] NA NA NA NA
[10,] NA NA NA NA
[11,] NA NA NA NA
[12,] NA NA NA NA
[13,] NA NA NA NA
[14,] NA NA NA NA
[15,] NA NA NA NA

这对我来说似乎很荒谬,因为模型能够输出预测的事实意味着它必须具有类的概率估计。是什么导致了这种奇怪的行为?

我已经尝试过的一些事情没有成功:

  • 将 type="raw" 添加到模型构造调用中。
  • 改用 klaR 包中的 NaiveBayes 函数(无法处理 .

产生此错误的一些数据示例:

table[1:5,]
  V1 V2       V3         V4        V5        V6        V7        V8        V9
1  0  0 0.000000  0.0000000  0.000000 0.0000000 0.6711444 0.7110409 0.0000000
2  0  0 0.000000  0.0000000 -1.345804 2.1978370 0.6711444 0.7110409 0.0000000
3  0  0 1.923538 -3.6718725  0.000000 0.0000000 0.0000000 0.0000000 0.8980172
4  0  0 1.923538 -0.4079858  0.000000 0.0000000 0.0000000 0.0000000 0.8980172
5  0  0 0.000000  0.0000000 -1.345804 0.2930449 0.6711444 0.7110409 0.0000000
         V10 V11
1  0.0000000   6
2  0.0000000   3
3 -3.1316213   2
4 -0.2170431   5
5  0.0000000   4

【问题讨论】:

  • 为了使其更具重现性,如果您可以添加一些我们可以解决相同错误的数据,那就太好了。
  • @Arun 当然。我现在就放一些。
  • 感谢您考虑我的建议。一样东西。您在代码中提到了as.factor(V17),但数据中有 11 列。我在这里遗漏了什么还是应该在table 中有更多列?另外dput(head(table)) 可能更好地复制/粘贴您的数据以供他人复制。
  • @Arun 我已将示例代码更改为更加一致。这些集合是由流式处理产生的,不久之后就被丢弃了,所以我实际上不再拥有其中任何一个。
  • 非常感谢,type="raw" 为我工作:),但我仍然不了解答案:(

标签: r


【解决方案1】:

发生这种情况是因为数据集中的一个类只有一个实例。

对我的应用程序来说,一个简单的解决方法是克隆该记录并添加少量噪音,然后预测按预期工作。

编辑:实际上似乎并不总是需要添加噪音。这是一个非常简单的示例,它通过简单地添加表中每一行的额外副本来解决问题中发布的数据集:

> table <- as.data.frame(rbind(as.matrix(table),as.matrix(table))
> nms <- colnames(table)
> model <- naiveBayes(table[,1:length(nms)-1], factor(table[,length(nms)]))
> predict(model, table[,1:(length(nms)-1)], type='raw')
                 2            3            4            5            6
 [1,] 2.480502e-34 6.283185e-12 6.283185e-12 2.480502e-34 1.000000e+00
 [2,] 1.558542e-45 9.999975e-01 2.506622e-06 1.558542e-45 6.283170e-12
 [3,] 1.000000e+00 1.558545e-45 1.558545e-45 6.283185e-12 2.480502e-34
 [4,] 6.283185e-12 1.558545e-45 1.558545e-45 1.000000e+00 2.480502e-34
 [5,] 1.558542e-45 2.506622e-06 9.999975e-01 1.558542e-45 6.283170e-12
 [6,] 2.480502e-34 6.283185e-12 6.283185e-12 2.480502e-34 1.000000e+00
 [7,] 1.558542e-45 9.999975e-01 2.506622e-06 1.558542e-45 6.283170e-12
 [8,] 1.000000e+00 1.558545e-45 1.558545e-45 6.283185e-12 2.480502e-34
 [9,] 6.283185e-12 1.558545e-45 1.558545e-45 1.000000e+00 2.480502e-34
[10,] 1.558542e-45 2.506622e-06 9.999975e-01 1.558542e-45 6.283170e-12

【讨论】:

  • 而不是用语言说出来,如果你能分享代码,那么它会更有用。如果您能实施我的两个建议,我很乐意为这两个问答 +1。
  • 尚不清楚是什么导致了这个问题,以及为什么它被解决了。
猜你喜欢
  • 2017-05-04
  • 1970-01-01
  • 2016-10-18
  • 2017-02-04
  • 1970-01-01
  • 2019-06-04
  • 2018-06-28
  • 2019-01-01
  • 1970-01-01
相关资源
最近更新 更多