2016-05-25 1 views
1

Я строю модель дерева регрессии CART в R, используя пакет партии, но я получил сообщение об ошибке, говорящее о том, что уровни не совпадают, когда я пытаюсь применить модель к набору данных тестирования.Ошибка предсказания пакета пакета Decission Tree - Уровни не совпадают

Я провел последнюю неделю, просматривая темы на форуме, но все еще не смог найти правильное решение моей проблемы. Поэтому я переписываю этот вопрос здесь, используя поддельные примеры, которые я составил. Может ли кто-нибудь помочь объяснить сообщение об ошибке и предоставить решение?

В моем учебном наборе данных имеется около 1000 записей, а набор данных для тестирования составляет около 150. В любом наборе данных нет NA или пустых полей.

моя CART модель с использованием Ctree под пакет партийном:

mytree<- ctree(Rate~Bank+Product+Salary, data=data_train)

data_train пример:

Rate Bank Product Salary  
1.5 A  aaa  100000 
0.6 B  abc  60000 
3  C  bac  10000 
2.1 D  cba  50000 
1.1 E  cca  80000 

data_test пример:

Rate Bank Product Salary 
2.0 A  cba  80000 
0.5 D  cca  250000 
0.8 E  cba  120000 
2.1 C  abc  65000 

levels(data_train$Bank) : A, B, C, D, E 

levels(data_test$Bank): A,D,E,C 

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

>is.factor(data_test$Bank) 

TRUE 
(Made sure Bank and Products are factors in both datasets) 
>levels(data_test$Bank) <-union(levels(data_test$Bank), levels(data_train$Bank)) 

> levels(data_test$product)<-union(levels(data_test$product),levels(data_train$product)) 

Однако, когда я пытаюсь запустить прогноз на тестирование набора данных, я получаю следующее сообщение об ошибке:

> fit1<- predict(mytree,newdata=data_test) 

Error in checkData(oldData, RET) : 
    Levels in factors of new data do not match original data 

Я также попробовал следующий метод, но он изменяет поля моего тестирования набора данных ... :

levels(data_test$Bank) <-levels(data_train$Bank)

data_test таблица изменена:

Rate Bank(altered) Bank (original) 
2.0 A    A  
0.5 B    D  
0.8 C    E  
2.1 D    C  

ответ

1

Вы МИГ ht попытайтесь восстановить ваши факторы, используя сопоставимые уровни, вместо того, чтобы назначать новые уровни существующим факторам. Вот пример:

# start the party 
library(party) 

# create training data sample 
data_train <- data.frame(Rate = c(1.5, 0.6, 3, 2.1, 1.1), 
         Bank = c("A", "B", "C", "D", "E"), 
         Product = c("aaa", "abc", "bac", "cba", "cca"), 
         Salary = c(100000, 60000, 10000, 50000, 80000)) 

# create testing data sample 
data_test <- data.frame(Rate = c(2.0, 0.5, 0.8, 2.1), 
         Bank = c("A", "D", "E", "C"), 
         Product = c("cba", "cca", "cba", "abc"), 
         Salary = c(80000, 250000, 120000, 65000)) 

# get the union of levels between train and test for Bank and Product 
bank_levels <- union(levels(data_test$Bank), levels(data_train$Bank)) 
product_levels <- union(levels(data_test$Product), levels(data_train$Product)) 

# rebuild Bank with union of levels 
data_test$Bank <- with(data_test, factor(Bank, levels = bank_levels)) 
data_train$Bank <- with(data_train, factor(Bank, levels = bank_levels)) 

# rebuild Product with union of levels 
data_test$Product <- with(data_test, factor(Product, levels = product_levels)) 
data_train$Product <- with(data_train, factor(Product, levels = product_levels)) 

# fit the model 
mytree <- ctree(Rate ~ Bank + Product + Salary, data = data_train) 

# generate predictions 
fit1 <- predict(mytree, newdata = data_test) 

> fit1 
    Rate 
[1,] 1.66 
[2,] 1.66 
[3,] 1.66 
[4,] 1.66 
+0

Отличная работа вокруг. Работает как магия. – yiyisue

Смежные вопросы