2013-05-14 76 views
0

我想在R中使用随机森林方法。我需要读取一个txt文件(训练集)。阅读表和R中的随机森林

dataset<- read.table(path1,header=TRUE,sep=",") 

列名是数字(即1005_at),所以它们自动转换,加上X,R(即X1005_at)。为了解决这个问题,我做的事:

colnames(dataset)<-gsub("^[X](.*)","\\1",colnames(dataset)) 

现在的名称是好的,但是当我运行随机森林:

model.rf <- randomForest(class ~ ., data=dataset, importance=TRUE,keep.forest=T, ntree=5, do.trace=T) 

我有这样的错误:

Error in eval(expr, envir, enclos) : object '1005_at' not found 

虽然如果我在原始数据集上运行随机森林(不修改名称,所以使用X1005_at),则不会发生此错误。为什么?我该如何解决它?

+0

我不能肯定地说,但我估计它有一个事实,即'randomForest'正在评估一个公式组合列的非标名的人。我敢肯定,如果你看看代码,'.'会翻译成某个地方的替代语句(或等价物),这可能是'dataset'列的**名称列表**。该函数很可能不会为非标准名称进行分配(不需要为什么它应该,因为它具有对用户的期望),因此错误 – 2013-05-14 10:46:23

+2

为什么不简单地将名称解析为最后一步? – 2013-05-14 10:47:37

+0

我在列名中使用下划线的数据框上使用aggregate()时遇到过这个问题。网络搜索到目前为止没有提出任何好的解释。但是,如果它与转换后的名称一起工作 - 正如里卡多所说,为什么不直接使用这些名称并在最后修复名称? – neilfws 2013-05-14 10:51:44

回答

0

使用read.csv,因为它已经有适当的默认值headersep并使用check.names=FALSE参数来避免弄乱名称。

formula方法randomForest将不接受输入数据框中的非语法名称。改为使用默认方法。

因此,我们有:

> # dataset <- read.csv(path1, check.names = FALSE) 
> 
> # next few lines are to make example similar to the one in the question 
> dataset <- CO2 
> names(dataset) <- c(paste(1:4, names(dataset[1:4]), sep = "_"), "class") 
> names(dataset) 
[1] "1_Plant"  "2_Type"  "3_Treatment" "4_conc"  "class"  
> 
> i <- match("class", names(dataset)) # i is index of class column 
> fm <- randomForest(dataset[-i], dataset[[i]] 
+ # other arguments - in this example none 
+) 
> fm 

Call: 
randomForest(x = dataset[-i], y = dataset[[i]]) 
       Type of random forest: regression 
        Number of trees: 500 
No. of variables tried at each split: 1 

      Mean of squared residuals: 26.43385 
        % Var explained: 77.13 
> fm$importance 
      IncNodePurity 
1_Plant   2105.779 
2_Type   1529.527 
3_Treatment  557.300 
4_conc   2265.724 
+0

按照您的建议使用randomForest方法:model.rf < - randomForest(dataset [-i],data = dataset [[i]],importance = TRUE,keep.forest = T,ntree = 5,do.trace = T)不起作用。它会立即结束(而原始参数需要几分钟时间),并且不会打印精度。 – 2013-05-14 13:11:27

+0

我修改了它以提供完整的model.matrix。 – 2013-05-14 17:35:10

+0

我在RF执行结束时仍然有相同的错误:错误if(var.class ==“character”| var.class ==“factor”| var.class ==: 参数的长度为零 – 2013-05-15 09:31:50