2013-05-14 5 views
0

Я пытаюсь использовать метод Random Forest в R. Мне нужно прочитать txt-файл (набор тренировок).Прочитать таблицу и случайный лес в R

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

Имена столбцов являются цифровыми (т.е. 1005_at), таким образом они автоматически преобразуются, добавляя X, с помощью R (т.е. X1005_at). Для того, чтобы решить эту проблему, я сделал:

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

Теперь имена в порядке, но когда я запускаю Random Forest:

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 

While если я запускаю Random Forest в исходном наборе данных (без изменения имен, поэтому с использованием X1005_at) эта ошибка не возникает. Зачем? Как я могу это исправить?

+0

Я не могу сказать наверняка, но я бы предположил, что это связано с нестандартным названием колонн в сочетании с тем фактом, что 'randomForest' оценивает формулу. Я уверен, что если вы посмотрите на код, этот '.' будет транслировать на замещающий оператор (или эквивалент) где-то, что, скорее всего, является списком ** имен ** столбцов' dataset'. Функция, скорее всего, не делает выделение для нестандартных имен (нет необходимости, почему она должна, так как она имеет ожидания пользователя) и, следовательно, ошибка –

+2

Почему бы просто не разрешить имена в качестве последнего шага? –

+0

Я столкнулся с этой проблемой при использовании aggregate() в кадрах данных с подчеркиванием в имени столбца. Веб-поиск пока не дает никаких хороших объяснений. Но если он работает с преобразованными именами, - сказал Рикардо, почему бы просто не использовать их и не исправить имена в конце? – neilfws

ответ

0

Использование read.csv, как это уже имеет соответствующие значения по умолчанию для header и sep и использовать check.names=FALSE аргумент, чтобы избежать коверкая имена.

Метод formularandomForest не принимает несинтаксические имена во входном кадре данных. Вместо этого используйте метод по умолчанию.

Таким образом, мы имеем:

> # 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 (набор данных [-i], data = набор данных [[i]], значение = TRUE, keep.forest = T, ntree = 5, do.trace = T), он не работает. Он заканчивается немедленно (в то время как исходные параметры занимают несколько минут), и точность не печатается. –

+0

Я пересмотрел его, чтобы предоставить полную model.matrix. –

+0

У меня все еще такая же ошибка в конце выполнения RF: Ошибка в if (var.class == "character" | var.class == "factor" | var.class ==: аргумент имеет нулевую длину –