Regressionsbaum Testes mit predict

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
Kramer
Beiträge: 16
Registriert: Fr Nov 02, 2018 12:29 pm

Regressionsbaum Testes mit predict

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Regressionsbaum Testes mit predict

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Kramer
Beiträge: 16
Registriert: Fr Nov 02, 2018 12:29 pm

Re: Regressionsbaum Testes mit predict

Beitrag 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.
Zuletzt geändert von jogo am Do Nov 15, 2018 3:10 pm, insgesamt 1-mal geändert.
Grund: Formatierung verbessert. http://forum.r-statistik.de/viewtopic.php?f=20&t=29
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Regressionsbaum Testes mit predict

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Regressionsbaum Testes mit predict

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Regressionsbaum Testes mit predict

Beitrag 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 ;)
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Kramer
Beiträge: 16
Registriert: Fr Nov 02, 2018 12:29 pm

Re: Regressionsbaum Testes mit predict

Beitrag von Kramer »

Super vielen Dank für die Hilfe und alle weiteren Tipps. Klappt jetzt so wie ich es haben möchte :D
Antworten