randomForest в R: может соответствовать модели и использовать ее для прогнозов без ошибок, но tuneRF дает ошибку длины diff - PullRequest
0 голосов
/ 11 сентября 2018

Просто возиться с данными о заболеваниях сердца UCI: https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data. Данные имеют формат:

A tibble: 6 x 14
    age   sex    cp trestbps  chol   fbs restecg thalach exang oldpeak
  <dbl> <dbl> <dbl>    <int> <int> <dbl>   <int>   <int> <int>   <dbl>
1    63     1     3      145   233     1       0     150     0     2.3
2    41     0     1      130   204     0       0     172     0     1.4

Выращивание / подгонка дерева на тренировочном наборе прекрасно работает, равно как и использование его для прогнозов на тестовом наборе. Однако tuneRF выдает ошибку:

Error in randomForest.default(x, y, mtry = mtryStart, ntree = ntreeTry,  : 
  length of response must be the same as predictors 

Это R 3.5.0 и randomForest 4.6-14.

Некоторые примечания, которые вы увидите в коде:

1) команда tuneRF использует подмножества одного и того же набора данных, поэтому метки классов одинаковы

2) переменная отклика "target" была преобразована в коэффициент перед разделением тренировки / теста

У меня такое ощущение, что это связано с тем, как я делаю поднаборы, что результаты могут быть списками, а не фреймами данных, может быть? Но я использовал тот же подход для более ранних шагов без ошибок. Я нашел SO вопрос по этому поводу раньше, но не могу найти его в моей истории / Google сейчас. Даже если бы я мог найти это, я не понимаю, как это применимо, так как я использовал тот же метод поднабора ранее без каких-либо проблем.

Сценарий:

library(tidyverse)
library(randomForest)

Я добавил венгерские данные после вменения пропущенных значений (и не хочу использовать ответ для вменения), выполнив:

hungar_heart <- cbind(impute(hungar_heart[,-14]),hungar_heart[,14])

Затем я добавляю colnames к Hungar_heart и добавляю его в данные Кливленда:

hungar_heart<-setNames(hungar_heart, c("age","sex","cp","trestbps","chol","fbs","restecg","thalach","exang","oldpeak","slope","ca","thal","target"))
heart_total<-rbind(heart_data,hungar_heart)

heart_total$target <- as.factor(heart_total$target)

#Partition new combined dataset into training and test sets after setting seed (123)
set.seed(123)
indicator <- sample(2, nrow(heart_total), replace = TRUE, prob = c(.7,.3))
train <- heart_total[indicator==1,]
test <- heart_total[indicator==2,]

#Fit random forest to training set, using default values to start.  
forest <- randomForest(target~., data=train)

#Use trained model on test set
predict_try <- predict(forest, test)

#so far so good.  now tuneRF gives error:

tune_RF <- tuneRF(train[,-14],train[,14],
   stepFactor = 0.5,
   plot = TRUE,
   ntreeTry = 300,
   improve = 0.05)

Error in randomForest.default(x, y, mtry = mtryStart, ntree = ntreeTry,  : 
length of response must be the same as predictors
In addition: Warning message:
In randomForest.default(x, y, mtry = mtryStart, ntree = ntreeTry,  :
  The response has five or fewer unique values.  Are you sure you want to do regression?

#FWIW, length:

length(train[,-14])
[1] 13

length(train[,14])
[1] 1

Я думаю, что это, вероятно, просто какая-то уникальность, которую я не ожидал от своего метода поднабора.

Спасибо

1 Ответ

0 голосов
/ 11 сентября 2018

Отлично - понял это благодаря некоторой помощи.

Я должен был явно указать в своем OP, что я использовал dplyr.

Оказывается, хотя randomForest и прогнозирование этого случайного леса отлично работают на tibbles, tuneRF (или, может быть, tuneRF после того, как я установил подмножество) ожидает фрейм данных и в противном случае выдает ошибку.

V простое исправление:

train <- as.data.frame(train)

Перед строкой tuneRF.

...