预测$class 中的错误:$ 运算符对原子向量无效

Posted

技术标签:

【中文标题】预测$class 中的错误:$ 运算符对原子向量无效【英文标题】:Error in predictions$class : $ operator is invalid for atomic vectors 【发布时间】:2016-01-29 18:22:15 【问题描述】:

我正在尝试对我自己的数据使用朴素贝叶斯方法,该方法根据 9 个特征预测乳腺癌的诊断。我正在尝试使用 70% 的训练数据和 30% 的测试数据。

这是我的代码:

> BCD <- read.csv("H:/BCD.csv")
>   View(BCD)
> trainIndex <- createDataPartition(BCD$Diagnosis, p=0.70, list=FALSE)
> data_train <- BCD[ trainIndex,]
> data_test <- BCD[-trainIndex,]
#train a naive bayes model
> model <- naiveBayes(Diagnosis~., data=data_train)
#make predictions
> predictions <- predict(model, data_test[,1:9])
#summarize results
> confusionMatrix(predictions$class, data_test$Diagnosis)

我收到以下错误:

Error in predictions$class : $ operator is invalid for atomic vectors

知道这意味着什么或如何解决吗?

以下是我的数据示例,希望对您有所帮助:

> dput(head(BCD))
structure(list(Clump.Thickness = c(5L, 5L, 3L, 6L, 4L, 8L), Uniformity.of.Cell.Size = c(1L, 
4L, 1L, 8L, 1L, 10L), Uniformity.of.Cell.Shape = c(1L, 4L, 1L, 
8L, 1L, 10L), Marginal.Adhesion = c(1L, 5L, 1L, 1L, 3L, 8L), 
    Single.Epithelial.Cell.Size = c(2L, 7L, 2L, 3L, 2L, 7L), 
    Bare.Nuclei = c(1L, 10L, 2L, 4L, 1L, 10L), Bland.Chromatin = c(3L, 
    3L, 3L, 3L, 3L, 9L), Normal.Nucleoli = c(1L, 2L, 1L, 7L, 
    1L, 7L), Mitoses = c(1L, 1L, 1L, 1L, 1L, 1L), Diagnosis = c(1L, 
    1L, 1L, 1L, 1L, 2L)), .Names = c("Clump.Thickness", "Uniformity.of.Cell.Size", 
"Uniformity.of.Cell.Shape", "Marginal.Adhesion", "Single.Epithelial.Cell.Size", 
"Bare.Nuclei", "Bland.Chromatin", "Normal.Nucleoli", "Mitoses", 
"Diagnosis"), row.names = c(NA, 6L), class = "data.frame")

【问题讨论】:

无论如何我都不是这方面的专家,但在示例中,您给出的对象“预测”是空的。 那么错误一定是predict(model, data_test[,1:9])呢? 您的预测似乎没有像您预期的那样生成,但我不知道为什么。 【参考方案1】:

请试试这个:

BCD$Diagnosis = as.factor(BCD$Diagnosis)
trainIndex <- createDataPartition(BCD$Diagnosis, p=0.70, list=FALSE)
data_train <- BCD[ trainIndex,]
data_test <- BCD[-trainIndex,]
#train a naive bayes model
model <- naiveBayes(Diagnosis~., data=data_train)
#make predictions
predictions <- predict(model, data_test[,1:9])
#summarize results
confusionMatrix(predictions, data_test$Diagnosis)

更改是您必须将类特征设置为因素(第一行),并在最后一行将 predictions$class 调整为仅 predictions

【讨论】:

【参考方案2】:

$ 运算符对原子向量无效

这个错误的真正含义:

R 运行时尝试对根本不支持 $ 行为的对象执行 $ 操作。例如,单个字符串或整数。看到这个 R 终端输出:

> s="Gucci Mane"
> s$artistName
Error in s$artistName : $ operator is invalid for atomic vectors
> t=list(artistName="Gucci Mane", realName="Radric Davis")
> t$artistName
[1] "Gucci Mane"

如果您收到此错误,很可能是您执行了一些返回错误对象的查找操作。

是什么让这个错误超级混乱:

您会看到类似“未找到属性 s$artistName”的错误。但是运行时甚至没有尝试解析 $.它发现有问题的对象根本不支持 $ 操作,并将其报告为错误。 “原子”在整个开发人员世界中的意思是“永远不会被线程或进程上下文切换中断的操作”,但在 R 中,哦,天哪,它意味着类似于“不支持收集行为的原始数据类型” 您在 google 上找到的一些帮助主题表明此错误与递归有关,这是无稽之谈。充其量你的递归返回了错误的东西。

@R 语言的开发人员,功能请求:带有-some-上下文的错误消息,说明您做错了什么以及在哪里做错了,这将节省大量时间!

【讨论】:

【参考方案3】:

我最终通过这种方式解决了这个问题:

我把这个:> predictions <- predict(model, data_test[,1:9]) 改成了这个:&gt; predictions &lt;- predict(model, data_test[,1:10, -10])

然后将我的结果保存到 csv 文件并以这种方式查看。

【讨论】:

以上是关于预测$class 中的错误:$ 运算符对原子向量无效的主要内容,如果未能解决你的问题,请参考以下文章

Python-RPy - “x$terms 中的错误:$ 运算符对原子向量无效”

R:lts回归:$运算符对原子向量无效

“子集”和“$ 运算符对原子向量无效”

Visual Studio 手表中的向量“无运算符“[]”与这些操作数匹配错误

在 C++ 中将(预定义的)原子值添加到向量

如果我们同时从向量中追加和读取数据,我们是不是需要锁定?(无修改)