2016-05-25 8 views
1

Ich bin ein CART-Regressionsbaummodell in R mit Party-Paket erstellen, aber ich habe Fehlermeldung, sagen Ebenen nicht übereinstimmen, wenn ich versuche, das Modell mit Test-Dataset anzuwenden.Entscheidung Tree Party Paket Vorhersagefehler - Ebenen stimmen nicht überein

Ich habe die letzte Woche damit verbracht, die Threads im Forum zu lesen, konnte aber immer noch nicht die richtige Lösung für mein Problem finden. Ich wiederhole diese Frage hier anhand gefälschter Beispiele, die ich erfunden habe. Kann jemand helfen, die Fehlermeldung zu erklären und eine Lösung anzubieten?

Mein Trainingsdatensatz hat ungefähr 1000 Datensätze und der Testdatensatz hat ungefähr 150. Es gibt keine NA oder leere Felder in beiden Datensätzen.

mein CART Modell ctree unter dem Party-Paket verwendet, ist:

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

data_train Beispiel:

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 Beispiel:

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 

Ich habe versucht, auf das gleiche Niveau zu setzen unter Verwendung der folgenden Codes:

>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)) 

aber wenn ich versuche, Vorhersage auf dem Testdatensatz zu laufen, bekomme ich folgende Fehlermeldung:

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

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

Ich habe auch versuchte die folgende Methode, aber es ändert die Felder meines Testdatensatzes ... :

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

Die data_test Tabelle geändert:

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

Antwort

1

Sie mig Versuchen Sie, Ihre Faktoren mithilfe vergleichbarer Ebenen neu zu erstellen, anstatt bestehenden Faktoren neue Ebenen zuzuweisen. Hier ist ein Beispiel:

# 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

Große Arbeit um. Funktioniert wie Magie. – yiyisue

Verwandte Themen