Ошибка отладки во фрейме $ yval2 [где, 1L + nclass + 1L: nclass, drop = FALSE]: индекс за пределами границ - PullRequest
0 голосов
/ 24 сентября 2019

Я использую библиотеку rpart для построения дерева регрессии со следующим кодом:

skillcraft <- read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/00272/SkillCraft1_Dataset.csv", header = T, sep =",")

skillcraft$LeagueIndex <- factor(skillcraft$LeagueIndex)
skillcraft <- skillcraft[-1]
skillcraft$Age <- as.numeric(levels(skillcraft$Age))[skillcraft$Age]
skillcraft$TotalHours <- as.numeric(
  levels(skillcraft$TotalHours))[skillcraft$TotalHours]
skillcraft$HoursPerWeek <- as.numeric(
  levels(skillcraft$HoursPerWeek))[skillcraft$HoursPerWeek]

skillcraft <- skillcraft[complete.cases(skillcraft),]

library(caret)
set.seed(133)

skillcraft_sampling_vector <- createDataPartition(
  skillcraft$LeagueIndex, p = 0.8, list = F)

skillcraft_train <- skillcraft[skillcraft_sampling_vector,] 
skillcraft_test <- skillcraft[-skillcraft_sampling_vector,]


library(rpart)
regtree <- rpart(LeagueIndex ~., data = skillcraft_train)

regtree_predictions <- predict(regtree, skillcraft_test)

В последней строке этого кода выдается ошибка:

Error in frame$yval2[where, 1L + nclass + 1L:nclass, drop = FALSE] : 
  subscript out of bounds

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

МожетКто-нибудь поможет?

Заранее спасибо!

1 Ответ

0 голосов
/ 25 сентября 2019

Мое лучшее предположение заключается в том, что проблема заключается в факторе LeagueIndex.Эта переменная была представлена ​​в виде порядковых данных (от бронзового до профессионального) и преобразована в символьный фактор "1", "2", "3" и т. Д. До "8".

В дополнение к вашей ошибке с rpart она выглядит каквы получаете предупреждение при разбиении данных на основе этого фактора:

В createDataPartition (skillcraft $ LeagueIndex, p = 0,8, list = F):
В некоторых классах нет записей (8) иони будут проигнорированы

Очевидно, что нет записей с LeagueIndex из 8. Похоже, что это произойдет после того, как вы выберете для завершенных дел здесь:

skillcraft <- skillcraft[complete.cases(skillcraft),]

И всеLeagueIndex=8 дел удаляются, так как в них будут отсутствовать данные для Age, HoursPerWeek и TotalHours (приведено к NA) при преобразовании через as.numeric.

skillcraft[which(skillcraft$LeagueIndex == 8), c("Age", "HoursPerWeek", "TotalHours")]
     Age HoursPerWeek TotalHours
3341   ?            ?          ?
3342   ?            ?          ?
3343   ?            ?          ?
...

Предполагается, что выЯ все еще хотел фактор, я полагаю, что если вы избавитесь от неиспользованного уровня факторов, это сработает, например:

skillcraft$LeagueIndex <- droplevels(skillcraft$LeagueIndex)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...