天真贝叶斯预测的“下标越界”错误是什么? (训练/测试中的水平相同)

时间:2018-07-25 20:56:29

标签: r prediction naivebayes

我正在尝试对数据进行幼稚的贝叶斯测试,这是一个由35个变量组成的大型数据框,其中一些是因素:

nb1927<-naiveBayes(ostpayer ~ ., data=trainoversample)
nb199pred<-predict(nb1927, testoversample, type = "class")

我不断收到错误消息:

Error in `[.default`(object$tables[[v]], , nd + islogical[attribs[v]]) : 
subscript out of bounds

现在,我从搜索中知道因素水平可能是一个问题。但是,在我降低了一些级别之后,同一测试集已经通过了逻辑回归预测,没有任何问题。因此,可以肯定地说,完全相同的测试集适用于贝叶斯,是吗?

我什至跑了

sapply(trainoversample, levels)
sapply(testoversample, levels)

然后在diffchecker.com(最好的网站btw)上显示这些结果,结果表明我的测试集比训练集具有更低的水平(因为我通过强制将它们放入逻辑回归中删除了一些东西)这些变量的“ UNK”因子)。

所以可能不是关卡。我什至对droplevels()设置的火车执行了sapply命令,并通过diffchecker将其放置,仍然一无所获。因此,并不是说内部的贝叶斯也正在这样做。

有什么想法吗?

我不能发布数据或变量名,但是如果有帮助,这里是其中之一的字符串:

str(testoversample)
'data.frame':   405661 obs. of  35 variables:
 $ 1                   : int  1207532 1208246 1187313 1259718 1206948 1207319 1206577 1206725 1262913 1209568 ...
 $ 2                         : num  1668 1208 854 5225 347 ...
 $ 3                        : Date, format: "2017-04-13" "2017-04-19" "2017-02-13" "2017-11-14" ...
 $ 4              : num  50 100 115 1204 30 ...
 $ 5                        : int  1 1 1 1 1 1 1 1 1 1 ...
 $ 6                  : Factor w/ 13 levels "1","2","3","4",..: 1 1 1 5 1 1 1 1 5 1 ...
 $ 7                          : int  0 0 0 0 0 0 0 0 0 0 ...
 $ 8                            : int  0 0 0 0 0 0 0 0 0 0 ...
 $ 9        : Date, format: "2016-02-25" "2016-11-03" "2015-12-29" "2016-11-14" ...
 $ 10                : int  0 0 0 0 0 0 0 0 0 0 ...
 $ 11                          : int  1 1 1 1 1 1 1 1 1 1 ...
 $ 12                      : num  50 100 115 1204 30 ...
 $ 13                      : int  284 242 224 313 225 176 318 221 108 244 ...
 $ 35                            : int  2773 3452 6042 3231 6104 2395 2575 6336 6392 2534 ...
 $ 14                  : int  1 1 1 1 1 1 1 1 1 1 ...
 $ 15                    : int  1 6 1 6 3 5 0 13 2 2 ...
 $ 16      : int  0 0 0 0 0 0 0 0 0 0 ...
 $ 17                    : int  0 0 0 0 0 0 0 1 0 0 ...
 $ 18      : int  15300 11140 0 9500 8300 1100 16600 500 0 2500 ...
 $ 19       : int  13692 1474 0 6916 8981 1543 9687 3 0 1820 ...
 $ 20                    : int  0 0 0 0 0 0 0 1 0 1 ...
 $ 21           : int  0 1 0 0 0 2 0 0 0 1 ...
 $ 22: int  3 1 0 1 3 2 2 0 2 0 ...
 $ 23           : int  0 3 0 4 1 0 0 5 1 0 ...
 $ 24                         : Factor w/ 3 levels "BAD","GOOD","UNK": 2 2 2 2 2 2 2 2 2 2 ...
 $ 25                            : int  1 1 0 1 1 1 0 1 1 0 ...
 $ 26                          : Factor w/ 6 levels "CUZ","DFA","DNF",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ 27                          : Factor w/ 50 levels "AK","AL","AR",..: 18 42 17 48 20 32 5 4 27 5 ...
 $ 28                            : Factor w/ 6 levels "Discharged","Dismissed",..: 3 3 3 3 3 3 3 1 3 3 ...
 $ 29                           : Factor w/ 3 levels "Dismissed","Other",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ 30                           : Factor w/ 6 levels "Discharged","Dismissed",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ 31                    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ 32                     : Factor w/ 13 levels "Alternate","AlternateCell",..: 6 6 2 5 5 7 6 6 6 5 ...
 $ 33                        : int  0 0 0 0 0 0 0 0 0 0 ...
 $ 34                     : num  0 0 0 0 0 0 0 0 0 0 ...

1 个答案:

答案 0 :(得分:0)

因此,按照@MrFlick的建议,我创建了一个可复制的示例。这个可复制的示例行之有效,因此我比以前更加困惑。

所以我试图预知我的火车设置,甚至无法预测我的火车设置。

我制作了一个非常小的测试集版本,看是否是问题所在。不。

我下载并安装了另一个朴素贝叶斯软件包(而不是使用e1071)。同样的问题。

在测试过程中,我测试了所有可能想到的东西,然后偶然发现了答案。我为可重现的示例制作了火车并进行了设置,而该版本的测试版本将NA作为所有列名。因此,我尝试将其翻转(使用repro-train作为要预测的项目,因为它具有正常的列名称),并且肯定会失败。

然后我将我的测试集的列名设置为NA并运行它,并确保它起作用!

为什么?上帝只知道,我怀疑某个变量名中一定有一个奇怪的字符代码(这是来自我们数据库的数据,谁知道他们做了什么奇怪的废话),但是如果遇到相同的问题,请尝试删除列名。