首页 > 解决方案 > 朴素贝叶斯预测的“下标越界”错误?(训练/测试中的相同级别)

问题描述

我正在尝试对我的数据运行朴素贝叶斯,这是一个包含 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”而放弃了一些逻辑回归这些变量的因素)。

所以这不可能是水平。我什至用 sapply 为火车组执行了命令droplevels()并将其通过 diffchecker,仍然没有。因此,贝叶斯的内部下降也不是这样做的。

有任何想法吗?

我不能发布数据或变量名,但如果有帮助,这里有一个 str 用于其中一个:

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 ...

标签: rpredictionnaivebayes

解决方案


因此,根据@MrFlick 的建议,我创建了一个可重现的示例。这个可重现的例子奏效了,因此我比以前更加困惑。

所以我试图凭直觉预测我的火车组,它甚至无法预测我的火车组。

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

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

下线,我测试了我能想到的所有东西,然后我偶然发现了答案。我为可重现的示例制作了一个火车并设置了一组,其测试版本的所有列名都为 NA。因此,我尝试翻转运行它(使用 repro-train 作为要预测的项目,因为它具有正常的列名),果然,它失败了。

然后我将我的测试集的列名设置为 NA 并运行它,瞧它工作了!

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


推荐阅读