我正在尝试对数据进行幼稚的贝叶斯测试,这是一个由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 ...
答案 0 :(得分:0)
因此,按照@MrFlick的建议,我创建了一个可复制的示例。这个可复制的示例行之有效,因此我比以前更加困惑。
所以我试图预知我的火车设置,甚至无法预测我的火车设置。
我制作了一个非常小的测试集版本,看是否是问题所在。不。
我下载并安装了另一个朴素贝叶斯软件包(而不是使用e1071)。同样的问题。
在测试过程中,我测试了所有可能想到的东西,然后偶然发现了答案。我为可重现的示例制作了火车并进行了设置,而该版本的测试版本将NA作为所有列名。因此,我尝试将其翻转(使用repro-train作为要预测的项目,因为它具有正常的列名称),并且肯定会失败。
然后我将我的测试集的列名设置为NA并运行它,并确保它起作用!
为什么?上帝只知道,我怀疑某个变量名中一定有一个奇怪的字符代码(这是来自我们数据库的数据,谁知道他们做了什么奇怪的废话),但是如果遇到相同的问题,请尝试删除列名。