2013-05-14 51 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