r - 朴素贝叶斯预测的“下标越界”错误?(训练/测试中的相同级别)
问题描述
我正在尝试对我的数据运行朴素贝叶斯,这是一个包含 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 ...
解决方案
因此,根据@MrFlick 的建议,我创建了一个可重现的示例。这个可重现的例子奏效了,因此我比以前更加困惑。
所以我试图凭直觉预测我的火车组,它甚至无法预测我的火车组。
我制作了一个非常小的测试集版本,以查看大小是否是问题所在。没有。
我下载并安装了一个不同的朴素贝叶斯包(而不是使用 e1071)。同样的问题。
下线,我测试了我能想到的所有东西,然后我偶然发现了答案。我为可重现的示例制作了一个火车并设置了一组,其测试版本的所有列名都为 NA。因此,我尝试翻转运行它(使用 repro-train 作为要预测的项目,因为它具有正常的列名),果然,它失败了。
然后我将我的测试集的列名设置为 NA 并运行它,瞧它工作了!
为什么?只有上帝知道,我怀疑某个变量名中一定有一个奇怪的字符代码(这是我们数据库中的数据,谁知道他们做了什么奇怪的废话),但如果您遇到同样的问题,请尝试删除列名。
推荐阅读
- xcode - Flutter XCode-build 错误无法构建模块'firebase_core'
- javascript - 为什么在 Next.js 中未定义解构的环境变量?
- python - py 计算矩阵中列之间的余弦相似度(仅考虑共享行)
- sql-server - 将带有特殊代码 µg 的 CSV 文件导入 SQL Server
- php - 如何使用php从包含特定字母的数组中获取值和键
- javascript - 如果正在与其子选择交互,如何检查单选按钮?
- javascript - 样式未加载,因为它在 React 应用程序中的 MIME 类型
- javascript - 如何使用 aws sns 在我的 express backen 上捕获我的所有端点令牌?
- python - 子进程运行 SSH Python3
- powerbi - 具有 Snowflake 数据源的 Power BI 模板