Просто возиться с данными о заболеваниях сердца 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
Я думаю, что это, вероятно, просто какая-то уникальность, которую я не ожидал от своего метода поднабора.
Спасибо