Возникает ошибка, когда в моем тестовом наборе есть данные, которых нет в моих данных поезда? - PullRequest
0 голосов
/ 02 октября 2018

У меня есть набор данных, и я разбил его на набор train (80%) и test (20%).Первым шагом является настройка дерева решений, а затем я прогнозирую использование моего тестового набора.

tree <- rpart(train$number ~ ., train, method = "class")
pred <- predict(tree,test, type ="class")

После запуска я получаю ошибку :

Ошибка в model.frame.default (Условия, новые данные, na.action = na.action, xlev = attr (object,: Faktor 'orderland' hat neue Stufen Zypern

Это означает, что у меня есть земля "Zypern" в моем тестовом наборе, но не в моем наборе поездов.Чтобы справиться с этой проблемой, я прибегнул к гуглу и испытал ее, установив равные уровни коэффициентов.

train$orderland <- factor(train$orderland, levels=levels(test$orderland))

Сводка данных испытаний и поездов:

> summary(train)
 number             orderland      lenkung          transmission IntervalRange
 Length:54616       NA's:54616   Length:54616       Length:54616       1: 7893      
 Class :character                Class :character   Class :character   2:39528      
 Mode  :character                Mode  :character   Mode  :character   3: 7195 

> summary(test)
 number              orderland           lenkung          transmission IntervalRange
 Length:13655       Length:13655       Length:13655       Length:13655       1:1959       
 Class :character   Class :character   Class :character   Class :character   2:9904       
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   3:1792

НоЯ получаю ту же ошибку ... есть идеи, почему?

1 Ответ

0 голосов
/ 02 октября 2018

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

Один из способов это сделать:

train_test = function(x,train_per=0.7){
  smp_size = floor(train_per*nrow(x))

  train_ind = sample(seq_len(nrow(x)),size = smp_size)

  re = list()
  re$train = x[train_ind,]
  re$test = x[-train_ind,]
  return(re)
}
splitted_data = split(data,data$lekung)
new_list = lapply(splitted_data,train_test) 

Здесь мы определили функциюкоторый разбивает фрейм данных (x) на поезд и тестовый набор.Мы также используем функцию split(), чтобы разделить ваши исходные данные на несколько фреймов данных, каждый из которых содержит только одно из возможных значений lekung.Допустим, значения могут быть «A», «B» или «C».В этом случае splitted_data будет список с 3 кадрами данных, первый из которых содержит все наблюдения, где lekung = "A", второй - все наблюдения с lekung = "B" и т. Д. *

Затем,мы применяем к splitted_data функцию, которую мы определили выше.Теперь new_list содержит 2 фрейма данных для каждого возможного значения lekung, поезда и тестового.

Итак, наконец, нам просто нужно связать строки каждого фрейма данных поезда и сделать то же самое для тестовых фреймов данных..

train = new_list[[1]][[1]]
test = new_list[[1]][[2]]
for(i in 2:length(a)){  # Then we use this loop to bind the data together
  train = rbind(train,new_list[[i]][[1]])
  test = rbind(test,new_list[[i]][[2]])
}

new_list представляет собой список списков из 2 кадров данных.Поэтому мы используем new_list[[1]] для доступа к 2 фреймам данных, соответствующим первому значению lekung, и new_list[[1]][[1]] для доступа к первому фрейму данных.

Хотя, вероятно, есть лучший способ сделать это.

...