预测$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])
改成了这个:> predictions <- predict(model, data_test[,1:10, -10])
然后将我的结果保存到 csv 文件并以这种方式查看。
【讨论】:
以上是关于预测$class 中的错误:$ 运算符对原子向量无效的主要内容,如果未能解决你的问题,请参考以下文章
Python-RPy - “x$terms 中的错误:$ 运算符对原子向量无效”