【问题标题】:Error in running randomForest : object not found运行 randomForest 时出错:找不到对象
【发布时间】:2016-05-06 14:27:33
【问题描述】:

所以我正在尝试为我的数据集拟合一个随机森林分类器。我对 R 很陌生,我想这是一个简单的格式问题。

我读入一个文本文件并将我的数据集转换为以下格式:(取出机密信息)

>head(df.train,2)

   GOLGA8A     ITPR3   GPR174  SNORA63    GIMAP8     LEF1    PDE4B LOC100507043    TGFB1I1    SPINT1
Sample1  3.726046 3.4013711 3.794364 4.265287 -1.514573 7.725775 2.162616    -1.514573 -1.5145732 -1.514573
Sample2 4.262779 0.9261892 4.744096 7.276971 -1.514573 4.694769 4.707387     2.031476 -0.8325444  2.615991
...
...
CD8B     FECH    PYCR1 MGC12916     KCNA3 resp
Sample1  -1.514573 2.099336 3.427928 1.542951 -1.514573    1
Sample2 -1.145806 1.204241 2.846832 1.523808  1.616791    1

本质上,列是我的特征,行是我的样本,最后一列是我的响应向量,它是一列因子。

然后我使用:

set.seed(1) #Set the seed in order to gain reproducibility

RF1 = randomForest(resp~., data=df.train,ntree=1000,importance=T,mtry=3)

只需尝试使用其他列作为特征来训练我的列 resp 上的 RF。

但我得到错误:

Error in eval(expr, envir, enclos) : object 'PCNA-AS1' not found

但是,查看我的训练集,我可以清楚地找到该列,例如:

sort(unique(colnames(df.train))

所以我真的不明白错误或从这里去哪里。如果我没有以正确的方式提出问题,我深表歉意,感谢您的任何帮助!

【问题讨论】:

  • 您能否将此作为可重现的示例(也就是提供导致错误的df.train 的示例数据)?

标签: r machine-learning random-forest


【解决方案1】:

我怀疑这是因为您的数据框中有一个非法的变量名。让我们考虑一个只有一个响应变量 resp 和一个名为 PCNA-AS1 的变量(非法)的数据框:

(dat <- structure(list(`PCNA-AS1` = c(1, 2, 3), resp = structure(c(2L, 2L, 1L), .Label = c("0", "1"), class = "factor")), .Names = c("PCNA-AS1", "resp"), row.names = c(NA, -3L), class = "data.frame"))
#   PCNA-AS1 resp
# 1        1    1
# 2        2    1
# 3        3    0

现在,当我们训练一个随机森林时,我们会得到指示的错误:

library(randomForest)
mod <- randomForest(resp~., data=dat)
# Error in eval(expr, envir, enclos) : object 'PCNA-AS1' not found

这个问题的一个自然解决方案是将你的变量名转换为合法的:

names(dat) <- make.names(names(dat))
dat
#   PCNA.AS1 resp
# 1        1    1
# 2        2    1
# 3        3    0
mod <- randomForest(resp~., data=dat)

现在模型训练没有错误。

【讨论】:

  • 感谢您的评论 Josilber,我尝试转换为合法名称,但这不是问题。错误实际上是我给了 randomForest 一个矩阵(而不是数据框),我认为这无关紧要,并且 randomForest 可以轻松地在两者之间转换。但是我错了,所以我现在解决了这个问题。
  • @AHawks 好的,那么您更有理由编辑您的问题以使其可重现! (也包括复制问题所需的代码和数据)。尝试将数据框中的列减少到可以重现问题的最小数量,然后发布该数据集(如果您还没有首先弄清楚发生了什么)。
  • 是的,你绝对正确,那会更好,我会为以后的问题这样做,只是习惯在堆栈溢出时在这里提出问题,所以谢谢你的建议!
【解决方案2】:

总之, 这是一个非常新手的错误,我输入的是矩阵而不是导致此错误的 data.frame。为什么它抱怨那个特定的专栏(这不是第一个)与另一个我仍然不明白的相比。 感谢所有的帮助。 干杯, 安东尼

【讨论】:

  • 创建/转换 data.frame 时,check.names=TRUE。因此,输入 data.frame 可以解决问题,因为非法的 col.names 会被编辑。一般来说,randomForest 给 data.frame 带来的问题比矩阵少得多
  • 这不是答案,而是对真实答案的评论,应标记为已接受。
猜你喜欢
  • 2015-12-28
  • 2020-06-03
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多