尝试使用“bnlearn”实现一个简单的朴素贝叶斯分类器。不断收到错误“变量必须是数字、因子或有序因子”

Posted

技术标签:

【中文标题】尝试使用“bnlearn”实现一个简单的朴素贝叶斯分类器。不断收到错误“变量必须是数字、因子或有序因子”【英文标题】:Trying to implement a simple Naive Bayes classifier using "bnlearn". Keep getting error "variables must be either numeric, factors or ordered factors" 【发布时间】:2016-02-11 14:50:09 【问题描述】:

我正在尝试通过重新创建给我的数据结果来在 R 中实现一个 NB 分类器。现在我只是对训练数据本身进行测试,看看准确度如何。

数据集中有 29 个变量,其中一个称为“状态”。它有两个值,赢和输。我将训练数据分成大约 2/3 的训练和 1/3 的测试。目标是确定 Status 预测输赢的准确性。

我想我理解错误,因为“赢”和“输”不是数值,但据我了解,它们不是因素吗?我将在下面发布我的代码。我正在使用来自http://www.bnlearn.com/documentation/man/naive.bayes.html 的 bnlearn 示例作为我的基础。如果有更好的例子,请告诉我。

#Read in training data
trainingdata <- read.csv("C:\\.....filepath.csv", header=T)

#Split data into training and test sets
training.set = trainingdata[1:1200, ]
test.set = trainingdata[1201:1860, ]

#Train model
bn = naive.bayes(training.set, "Status") 
fitted = bn.fit(bn, training.set)

#Predict
pred = predict(fitted, test.set)
table(pred, test.set[, "Status"])

我开始从bn = naive.bayes(training.set, "Status") 行得到错误。具体错误说"Error in data.type(x) : variables must be either numeric, factors or ordered factors

有没有办法让 bnlearn 认识到“状态”是一个因素。

【问题讨论】:

尝试查看str(trainingdata) 以查看您的变量是否属于适当的类型。 我的猜测是“状态”是一个字符向量。 @Cotton.Rockwood 如果我这样做,它表示所有变量都是具有不同级别的因子,除了其中两个是整数。会不会是两个 int 导致问题? 您应该向reproducible example 提供示例输入,我们可以运行它来查看发生了什么。 我猜是这样。在naive.bayes 的文档中,它说数据框中的所有变量都必须是因子。您可以添加trainingdata &lt;- lapply(trainingdata, as.factor)。这假设所有变量都可以合理地转换为因子,如果您打算将它们与naive.bayes 一起使用,无论如何都应该是这种情况。 【参考方案1】:

几年后回到今年,因为我意识到我从来没有用答案更新它,从那时起没有人发布解决方案让我接受。

Cotton.Rockwood 的假设是正确的。使用 bnlearn 的朴素贝叶斯分类器,所有变量都需要是因子,否则会遇到这个错误。

【讨论】:

以上是关于尝试使用“bnlearn”实现一个简单的朴素贝叶斯分类器。不断收到错误“变量必须是数字、因子或有序因子”的主要内容,如果未能解决你的问题,请参考以下文章

R中的多项朴素贝叶斯分类器

从头开始实现朴素贝叶斯算法

使用朴素贝叶斯情感分析实现 PoS

利用朴素贝叶斯实现简单的留言过滤

文末福利 | 一文实战朴素贝叶斯算法(附python演练)

使用朴素贝叶斯算法简单实现垃圾邮件过滤