Seite 1 von 1

Regressionsbaum Testes mit predict

Verfasst: Do Nov 15, 2018 12:25 pm
von Kramer
Hallo zusammen,

Ich habe mit meinen Daten ein Regressionsbaum gebaut, dabei habe ich vorher die Daten In Lerndaten und Testdaten geteilt. Mit den Irisdaten haben ich das Prinzip hinbekommen, mit meinen Daten aber leider nicht, hier was ich gemacht habe:

Traindata beinhaltet folgende Spalten: a,b,c,d,e
Testdata beinhaltet folgende Spalten: a,b,c,d
wobei a,b,c,d numerische Werte sind (Teilweise mit NA) und e ist True/False

Baum<-rpart(e ~
a+
b+
c+
d)

print(Baum)

plot(Baum,uniform = T,compress = T, branch = 0.6)
text(Baum,all=T,use.n = T, cex=0.6)

#Testen

Vorhergesagt <- predict(Baum,TestData,type = 'class')

Kombination<- data.frame(TestData$EZBflag,Vorhergesagt)



Ich bekomme folgende Fehlermeldung für "Vorhergesagt":

Error in predict.rpart(Baum, TestData, type = "class") :
Invalid prediction for "rpart" object
In addition: Warning message:
'newdata' hat 753 Zeilen , aber die gefundenen Variablen haben 3010 Zeilen

Wie bekomme ich die beiden Fehler weg? Ich verstehe nicht warum warum ies mit den Irisdaten klappt aber mit meinen nicht, selbst wenn ich e von True/False auf Text umstelle "ja"/"Nein"

Beste Grüße

Re: Regressionsbaum Testes mit predict

Verfasst: Do Nov 15, 2018 12:37 pm
von bigben
Hallo Kramer,

es wäre viel einfacher, wenn Du ein reproduzierbares Beispiel einstellen könntest, also einen Trainings- und einen Testdatensatz, beispielsweise als Teil Deiner Originaldaten, gerne auch mit veränderten Zahlen, damit keiner von uns mit Deinen DAten irgendwas anderes anfangen kann als hier zu antworten.

Wenn Du das Englisch verstehst, lies mal hier: https://stackoverflow.com/help/mcve
Eine deutsche Variante davon erstellen wir gerade hier: viewtopic.php?f=20&t=11
Testdata beinhaltet folgende Spalten: a,b,c,d
und darüber hinaus wohl auch noch EZBFlag als Zielvariable?

LG,
Bernhard

Re: Regressionsbaum Testes mit predict

Verfasst: Do Nov 15, 2018 1:46 pm
von Kramer
Da hast du wohl recht, ich habe hier mal das ganze mit Beispieldaten:

Code: Alles auswählen

a<-runif(20,min=-1,max=1)
b<-runif(20,min=100,max=1000)
c<-runif(20,min=10,max=100)
d<-runif(20,min=10,max=100)
e<-c(FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE)

Training<- cbind(a,b,c,d,e)
Training<-as.data.frame(Training)

Baum<-rpart(Training$e ~
              Training$a+
              Training$b+
              Training$c+
              Training$d)


plot(Baum,uniform = T,compress = T, branch = 0.6)
text(Baum,all=T,use.n = T, cex=0.6)



a<-runif(10,min=-1,max=1)
b<-runif(10,min=100,max=1000)
c<-runif(10,min=10,max=100)
d<-runif(10,min=10,max=100)
e<-c(FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE)

Testen<- cbind(a,b,c,d,e)
Testen<-as.data.frame(Testen)

Vorhergesagt <- predict(Baum,Testen,type = 'class')


#Edit: Die Beispieldaten geben nicht immer einen echten Baum aus, einfach ein paar mal probieren bis echte Blätter am Baum entstehen.

Re: Regressionsbaum Testes mit predict

Verfasst: Do Nov 15, 2018 3:14 pm
von jogo
Kramer hat geschrieben: Do Nov 15, 2018 1:46 pm Da hast du wohl recht, ich habe hier mal das ganze mit Beispieldaten:
...
#Edit: Die Beispieldaten geben nicht immer einen echten Baum aus, einfach ein paar mal probieren bis echte Blätter am Baum entstehen.
Du könntest am Anfang

Code: Alles auswählen

set.seed(...)
aufrufen (und nachdem Du einige Varianten probiert hast, den konkreten Wert dort einsetzen). Dann können auch wir die gleichen Daten erzeugen :idea:

Und lies bitte viewtopic.php?f=20&t=29
und formatiere künftige Nachrichten besser :!:

Gruß, Jörg

Re: Regressionsbaum Testes mit predict

Verfasst: Do Nov 15, 2018 3:35 pm
von bigben
So geht es:

Code: Alles auswählen

library(rpart)

a<-runif(20,min=-1,max=1);b<-runif(20,min=100,max=1000)
c<-runif(20,min=10,max=100);d<-runif(20,min=10,max=100)
e<-c(FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE)

Training <- data.frame(a,b,c,d,e)

Baum <- rpart(e ~ a+b+c+d, data= Training, method="class")


a<-runif(10,min=-1,max=1);b<-runif(10,min=100,max=1000)
c<-runif(10,min=10,max=100);d<-runif(10,min=10,max=100)
e<-c(FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE)

Testen <- data.frame(a,b,c,d,e)

Vorhergesagt <- predict(Baum,Testen, type="class")
Erstmal muss man das Package laden, das fehlt in Deinem Beispiel. Dann verwendest Du ein cbind(). Danach sind aber aus allen TRUE und FALSE 0 und 1 geworden und woher soll rpart dann wissen, dass es einen Klassifikationsbaum und keinen Regressionsbaum rechnen soll? Ein method="class" hilft da. Wenn Du schon alle Daten in einen Dataframe tust, dann kannst Du in rpart auch das Argument data= verwenden, dann stimmen nämlich die Spaltennamen.
Beachte den Unterschied bei den Namen in:

Code: Alles auswählen

print(rpart(e ~ a+b+c+d, data= Training))
print(rpart(Training$e ~ Training$a+Training$b+Training$c+Training$d))
Genau deshalb hat predict dann auch Probleme, die Daten zuzuordnen.

LG,
Bernhard

Re: Regressionsbaum Testes mit predict

Verfasst: Do Nov 15, 2018 3:51 pm
von bigben
Nachtrag: Du wirst ja wahrscheinlich noch etwas öfter mit rpart arbeiten und brauchst dann für Dich selbst vielleicht auch ab und zu mal ein reproduzierbares Minimalbeispiel. So z. B. könnte eine Datenerstellung aussehen, die tatsächlich einen Baum mit Blättern erzeugt:

Hier in Code-Tags, mit Seed und Import des erforderlichen Packages:

Code: Alles auswählen

set.seed(50)
library(rpart)

a <- runif(500,min=-1,max=1);b<-runif(500,min=100,max=1000)
c <- runif(500,min=10,max=100);d<-runif(500,min=10,max=100)
e <- (a>.5&c<30)|(d>80)
print(table(e))

Daten <-data.frame(a,b,c,d,e)
Training <- Daten[1:300,]
Testen <- Daten[301:500,]

Modell <- rpart(e ~ a+b+c+d, data= Training, method="class")
plot(Modell)
text(Modell)

Vorhergesagt <- predict(Modell, Testen, type="class")

table(Testen$e, Vorhergesagt)
HTH ;)

Re: Regressionsbaum Testes mit predict

Verfasst: Do Nov 15, 2018 4:25 pm
von Kramer
Super vielen Dank für die Hilfe und alle weiteren Tipps. Klappt jetzt so wie ich es haben möchte :D