Entscheidungsbaum mit rpart()

Methoden des maschinellen Lernens

Moderator: consuli

Antworten
daten_tim
Beiträge: 18
Registriert: Mo Mär 13, 2017 2:58 pm

Entscheidungsbaum mit rpart()

Beitrag von daten_tim » Do Nov 30, 2017 3:14 pm

Hallo,
ich versuche gerade meine Daten/Ergebnisse mit einem decision tree zu analysieren und ich bekomme es zwar mit einem Beispieldatensatz hin (viele nutzen immer das Titanic-Beispiel), aber nicht mit meinen Daten. Ich denke, es hat etwas mit dem Format meiner Daten zu tun. Komischerweise macht der erste Code einen interessanten tree mit entsprechenden leafs, aber der zweite nicht. Der einzige Unterschied ist die abhängige Variable:

Code: Alles auswählen

full_tree = rpart(results ~  Dens,
                              data = data_tree,[data_tree_training,], 
                              control=rpart.control(minsplit = 100, # atleast X in one node                           
                                                    cp = 0.0,    # puninge or unpruned                            
                                                    xval = 0)) #  without cross validation 
rpart.plot(full_tree)

full_tree = rpart(results_word ~  Dens,
                              data = data_tree,[data_tree_training,], 
                              control=rpart.control(minsplit = 100, # atleast X in one node                           
                                                    cp = 0.0,    # puninge or unpruned                            
                                                    xval = 0)) #  without cross validation 
rpart.plot(full_tree)

Hierbei ist results jeweils 1 oder 0 und results_word jeweils „Ja“ oder „Nein“ (is.factor(results) ist False und is.factor(results_Word) ist True). Dens ist eine Zahl – die Bevölkerungsdichte. Wenn ich method ="class" zufüge, bringt auch der erste tree keine Trennung mehr. Wieso ist das so?

Dann will ich natürlich auch meinen tree, also meinen full_tree der mir Ergebnisse geliefert hatte, der Trainings-Daten (full_tree) mit den restlichen Test-Daten vergleichen. Dafür nutze ich wie viele predict().

Code: Alles auswählen

prediction = predict(full_tree, data_tree,[data_tree_test,], type = "class") 
Aber hier bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

Error in predict.rpart(full_tree, data_tree,[data_tree_test,], type = "class") : 
  Invalid prediction for "rpart" object
In der Hilfe wird geschrieben: "The predictors referred to in the right side of formula(object) must be present by name in newdata. If missing, the fitted values are returned." Der Datensatz ist ja nur geteilt, z.B. 30 zu 70, also sind alle Eigenschaften gleich (columns etc.) Das kann es also nicht sein, oder? https://stat.ethz.ch/R-manual/R-devel/l ... rpart.html
Ich komme nicht dahinter?

Ich freue mich über Eure Erfahrungen.
Beste Grüße

bigben
Beiträge: 379
Registriert: Mi Okt 12, 2016 9:09 am

Re: Entscheidungsbaum mit rpart()

Beitrag von bigben » Do Nov 30, 2017 4:28 pm

Hallo daten_tim,
daten_tim hat geschrieben:
Do Nov 30, 2017 3:14 pm
Hierbei ist results jeweils 1 oder 0 und results_word jeweils „Ja“ oder „Nein“ (is.factor(results) ist False und is.factor(results_Word) ist True). Dens ist eine Zahl – die Bevölkerungsdichte.
Dazu schreibt die Hilfe von rpart:
if y is a factor then method = "class" is assumed, otherwise method = "anova" is assumed

Also findet rpart mit method = "anova" sinnvolle Unterteilungen, mit method = "class" aber keine sinnvollen Unterteilungen. Dafür gibt es ja verschiedene Methoden, damit man verschiedenes berechnen kann.
Wenn ich method ="class" zufüge, bringt auch der erste tree keine Trennung mehr. Wieso ist das so?
Möglicherweise ist unabhängig von der Bevölkerungsdichte immer "Ja" oder immer "Nein" das wahrscheinlichste? Schwer zu sagen, ohne die Daten zu kennen.

Code: Alles auswählen

prediction = predict(full_tree, data_tree,[data_tree_test,], type = "class") 
Was genau willst Du mit dem Argument in eckigen Klammern erreichen? In Deinem Link findet man folgende Argumentfolge von predict.rpart:

Code: Alles auswählen

predict(object, newdata,
       type = c("vector", "prob", "class", "matrix"),
       na.action = na.pass, ...)
Bei Deinem Aufruf wäre also object=full_tree, newdata=data_tree und an dritter Stelle, wo das Argument "type" erwartet wirst, schreibst Du "[data_tree_test,]"??

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte

daten_tim
Beiträge: 18
Registriert: Mo Mär 13, 2017 2:58 pm

Re: Entscheidungsbaum mit rpart()

Beitrag von daten_tim » Fr Dez 01, 2017 4:45 pm

Hallo Bernhard,
vielen Dank. Ich will mal zwei Dinge erklären:
Zu predict(): Da habe ich einen Tipfehler. Es soll heissen

Code: Alles auswählen

prediction = predict(full_tree, data_tree[data_tree_test,], type = "class") 
Da war ein Komma zu viel.

Code: Alles auswählen

data_tree[data_tree_test,]
ist natürlich mein Testdatensatz aus data_tree, also das ist sozusagen newdata. Das hat aber nichts mit dem Fehler zu tun. das ist einfach hier falsch von mir hier angegeben. In meinem code ist es richtig gewesen. Von daher weiss ich immer noch nicht, warum die Fehlermeldung kommt.

Für rpart(): OK, also nutzt er dann anova, wenn ich nicht class angebe. Das ist aber eigentlich nicht richtig, denn meine abhängige Variable (results bzw. results_Word) ist ja categorical. Siehe: "The method-argument can be switched according to the type of the response variable. It is “class”“ for categorial, "anova”“ for numerical, "poisson”“ for count data and "exp”“ for survival data." https://www.r-bloggers.com/trees-with-t ... t-package/
Also findet rpart mit method = "anova" sinnvolle Unterteilungen, mit method = "class" aber keine sinnvollen Unterteilungen. Dafür gibt es ja verschiedene Methoden, damit man verschiedenes berechnen kann.
Wie gesagt, meine abhängige Variable ist jeweils gleich, nur einmal in 1 und 0 (results) und das anderes mal in "Ja" und "Nein" (results_Word). Wieso trennt er aber auch mit anova bei beiden den oberen full_tree mit results, den aber mit results_Word nicht? Beides ist gleich - nur einmal in 1 und 0 (results) und das anderes mal in "Ja" und "Nein" (results_Word). Und: ist ANOVA dann wirklich falsch?

Beste Grüße
tim

bigben
Beiträge: 379
Registriert: Mi Okt 12, 2016 9:09 am

Re: Entscheidungsbaum mit rpart()

Beitrag von bigben » Fr Dez 01, 2017 5:13 pm

daten_tim hat geschrieben:
Fr Dez 01, 2017 4:45 pm
Das hat aber nichts mit dem Fehler zu tun. das ist einfach hier falsch von mir hier angegeben. In meinem code ist es richtig gewesen.
Doch, das hat was mit dem Fehler zu tun, denn das überzählige Komma steht nicht nur in dem Aufruf, sondern auch in der Fehlermeldung. Bitte poste den neuen Aufruf und die neue Fehlermeldung im Wortlaut.

Für rpart(): OK, also nutzt er dann anova, wenn ich nicht class angebe. Das ist aber eigentlich nicht richtig, denn meine abhängige Variable (results bzw. results_Word) ist ja categorical.


Richtig. Es geht also um die Frage, warum mit der Methode für kategoriale Fälle keine Unterteilungen gefunden werden. Dafür bieten sich zunächst zwei einfache Erklärungen an: Entweder ist im gegebenen Datensatz das eine Ergebnis immer wahrscheinlicher als das andere, oder vielleicht ist auch Deine Untergrenze von mindestens 100 Fällen pro Zweig einfach ein bisschen hoch angesetzt.

Du bist herzlich eingeladen, neben dem Originallaut der Fehlermeldung auch den Plot für beide Regressionbäume mal hoch zu laden, deutlich besser noch wäre ein reproduzierbares Beispiel.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte

daten_tim
Beiträge: 18
Registriert: Mo Mär 13, 2017 2:58 pm

Re: Entscheidungsbaum mit rpart()

Beitrag von daten_tim » Mi Dez 06, 2017 2:31 pm

Hallo Bernhard,
ich habe mich jetzt wieder ransetzen können

1)
Doch, das hat was mit dem Fehler zu tun, denn das überzählige Komma steht nicht nur in dem Aufruf, sondern auch in der Fehlermeldung. Bitte poste den neuen Aufruf und die neue Fehlermeldung im Wortlaut.
Nein, hat es nicht, denn das war einfach von mir copy and paste. Mein code ist komplexer und vielleicht auch umständlicher beschriftet, weil ich alles für meherer Szenarien und Datensätze rechne. Dadurch nenne ich die Codes hier leicht anders und es ist ein typo entstanden. Nun aber trotzdem mein Code - unten jedoch mehr:

Code: Alles auswählen

newdata = data_tree[data_tree_test,]
prediction2 = predict(full_tree, newdata, type = "class")
Error in predict.rpart(full_tree, newdata, type = "class") : 
  Invalid prediction for "rpart" object
2)
vielleicht ist auch Deine Untergrenze von mindestens 100 Fällen pro Zweig einfach ein bisschen hoch angesetzt.
Damit habe ich natürlich auch rumgespielt. Das scheint nach meiner Meinung keinen Einfluss zu haben.
Es geht also um die Frage, warum mit der Methode für kategoriale Fälle keine Unterteilungen gefunden werden.
Genau, ich habe nun mal Daten hochgeladen. Vielleicht hilft das und hier auch mein Code:

Code: Alles auswählen

# load data

tree =  read.csv("daten_forum.csv", header=TRUE, dec=".", sep=";")

colnames(tree)


set.seed(568)

# data in training und test teilen


tree_training  <- sample(x=1:nrow(tree), size=0.7*nrow(tree), replace=F)
tree_training
length(tree_training)
tree_test <- (1:nrow(tree))[-tree_training]
length(tree_test)
length(tree_training)+length(tree_test)

# tree with Dependent_1 - integer/classes?
full_tree_1 = rpart(Dependent_1 ~  Independent,
                              data = tree[tree_training,], method ="class")
                           

rpart.plot(full_tree_1)

# tree with Dependent_2 - factors
full_tree_2 = rpart(Dependent_2 ~  Independent,
                    data = tree[tree_training,], method ="class")


rpart.plot(full_tree_2)


# tree with Dependent_1 - integer/classes?, method = anova
full_tree_3 = rpart(Dependent_1 ~  Independent,
                    data = tree[tree_training,], method ="anova")


rpart.plot(full_tree_3)


# tree with Dependent_2 - factors, , method = anova
full_tree_4 = rpart(Dependent_2 ~  Independent,
                    data = tree[tree_training,] , method ="anova")


rpart.plot(full_tree_4)

# tree with Dependent_1 - integer/classes?, , method = anova, weitere Bedingungen
full_tree_5 = rpart(Dependent_1 ~  Independent,
                    data = tree[tree_training,], method ="anova",
                    control=rpart.control(minsplit = 500,                            
                                          cp = 0.0,                            
                                          xval = 5)) 

rpart.plot(full_tree_5)


# tree with Dependent_1 - integer/classes? , method = class, weitere Bedingungen
full_tree_6 = rpart(Dependent_1 ~  Independent,
                    data = tree[tree_training,], method ="class",
                    control=rpart.control(minsplit = 500,                            
                                          cp = 0.0,                            
                                          xval = 5)) 

rpart.plot(full_tree_6)


# tree with Dependent_2 - factors, method = anova, weitere Bedingungen
full_tree_7 = rpart(Dependent_2 ~  Independent,
                    data = tree[tree_training,], method ="anova",
                    control=rpart.control(minsplit = 500,                            
                                          cp = 0.0,                            
                                          xval = 5)) 

rpart.plot(full_tree_7)


# tree with Dependent_2 - factors, method = class, weitere Bedingungen
full_tree_8 = rpart(Dependent_2 ~  Independent,
                    data = tree[tree_training,], method ="class",
                    control=rpart.control(minsplit = 500,                            
                                          cp = 0.0,                            
                                          xval = 5)) 

rpart.plot(full_tree_8)

# tree with Dependent_1 - integer/classes?, method = anova, weitere Bedingungen
full_tree_9 = rpart(Dependent_1 ~  Independent,
                    data = tree[tree_training,], 
                    control=rpart.control(minsplit = 500,                            
                                          cp = 0.0,                            
                                          xval = 0)) 

rpart.plot(full_tree_9)


# tree with Dependent_2 - factors, method = anova, weitere Bedingungen
full_tree_10 = rpart(Dependent_2 ~  Independent,
                    data = tree[tree_training,], 
                    control=rpart.control(minsplit = 500,                            
                                          cp = 0.0,                            
                                          xval = 0)) 

rpart.plot(full_tree_10)

#Vorhersage

newdata = tree[tree_test,]	

prediction = predict(full_tree_9, newdata, type = "class") 
Was ich nach der prediction() erwarte ist eigentlich, dass er mir zeigt, wie oft ich mit meinem Baum richtig liege. Also richtig oder falsch für jeden Fall, dass es eine 1 (Ja) oder 0 (Nein) ist.

Beste Grüße
tim
Dateianhänge
daten_forum.csv
(161.95 KiB) 4-mal heruntergeladen

bigben
Beiträge: 379
Registriert: Mi Okt 12, 2016 9:09 am

Re: Entscheidungsbaum mit rpart()

Beitrag von bigben » Mi Dez 06, 2017 3:04 pm

Ok, das sind doch mal Beispieldaten, mit denen man was anfangen kann. Simpel gestrickt, wie ich nunmal bin, mache ich eine Tabelle und plotte ich mir ganz einfach die Daten:

Code: Alles auswählen

> table(tree$Dependent_2)

  Ja Nein 
 910 5881 
Also 6,5 Mal so viele Nein wie Ja.

Dann der Plot:

Code: Alles auswählen

plot(jitter(tree$Dependent_1,2) ~ tree$Independent)
Da erkenne ich mit bloßem Auge, dass es keine Stelle von Independent gibt, an der die 1 häufiger als die 0 wäre. Es ist so, wie ich oben vermutet habe, dass unabhängig von der Ausprägung von Independent,die beste Vorhersage immer 0 ist.

Wenn man rpart jetzt laufen lässt, dann kommt auch sowohl mit "anova" als auch mit "class" genau das gleiche Ergebnis heraus und zwar das, das aufgrund des o. g. Plots auch zu vermuten war.


Dein Problem entsteht in dem Moment, wo Du R freundlich um Overfitting bittest, nämlich das Pruning ausschaltest. Leider steht im Hilfetext zu rpart.control und dem Argument cp ein kurzer Bezug zu anova und keiner zu class. Augenscheinlich reagiert method="anova" sensibler auf cp, method="class" aber sensibler auf minsplit. Jedenfalls ist es gar kein Problem, Deinen Datensatz auch mit method="class" ohne Pruning in unzählige, wahrscheinlich zufällige, Branches zu zerlegen:

Code: Alles auswählen

> rpart(Dependent_1 ~  Independent,
+                     data = tree[tree_training,], method ="class",
+                     control=rpart.control(minsplit = 5, cp=0))
n= 4753 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

    1) root 4753 645 0 (0.86429623 0.13570377)  
      2) Independent>=395.2198 2113 231 0 (0.89067676 0.10932324)  
        4) Independent< 4126.739 2078 222 0 (0.89316651 0.10683349)  
          8) Independent>=1692.566 789  65 0 (0.91761724 0.08238276) *
          9) Independent< 1692.566 1289 157 0 (0.87820016 0.12179984)  
           18) Independent< 1604.854 1238 144 0 (0.88368336 0.11631664)  
             36) Independent>=1298.211 130   7 0 (0.94615385 0.05384615) *
             37) Independent< 1298.211 1108 137 0 (0.87635379 0.12364621)  
               74) Independent< 728.6449 588  56 0 (0.90476190 0.09523810) *
               75) Independent>=728.6449 520  81 0 (0.84423077 0.15576923)  
                150) Independent>=742.1836 513  75 0 (0.85380117 0.14619883)  
                  300) Independent>=754.2029 484  65 0 (0.86570248 0.13429752)  
                    600) Independent>=968.9426 268  30 0 (0.88805970 0.11194030)  
                     1200) Independent< 1149.242 119   6 0 (0.94957983 0.05042017) *
                     1201) Independent>=1149.242 149  24 0 (0.83892617 0.16107383)  
                       2402) Independent>=1156.25 139  18 0 (0.87050360 0.12949640)  
                         4804) Independent< 1164.824 17   0 0 (1.00000000 0.00000000) *
                         4805) Independent>=1164.824 122  18 0 (0.85245902 0.14754098)  
                           9610) Independent>=1170.25 118  14 0 (0.88135593 0.11864407) *
                           9611) Independent< 1170.25 4   0 1 (0.00000000 1.00000000) *
                       2403) Independent< 1156.25 10   4 1 (0.40000000 0.60000000) *
                    601) Independent< 968.9426 216  35 0 (0.83796296 0.16203704) *
                  301) Independent< 754.2029 29  10 0 (0.65517241 0.34482759) *
                151) Independent< 742.1836 7   1 1 (0.14285714 0.85714286) *
           19) Independent>=1604.854 51  13 0 (0.74509804 0.25490196) *
        5) Independent>=4126.739 35   9 0 (0.74285714 0.25714286) *
      3) Independent< 395.2198 2640 414 0 (0.84318182 0.15681818)  
        6) Independent< 287.647 2335 319 0 (0.86338330 0.13661670)  
         12) Independent< 85.88508 387  26 0 (0.93281654 0.06718346) *
         13) Independent>=85.88508 1948 293 0 (0.84958932 0.15041068)  
           26) Independent>=86.43065 1940 288 0 (0.85154639 0.14845361)  
             52) Independent< 163.2027 1036 134 0 (0.87065637 0.12934363)  
              104) Independent>=117.6199 564  63 0 (0.88829787 0.11170213)  
                208) Independent< 122.814 81   2 0 (0.97530864 0.02469136) *
                209) Independent>=122.814 483  61 0 (0.87370600 0.12629400)  
                  418) Independent>=125.9543 448  51 0 (0.88616071 0.11383929)  
                    836) Independent< 132.9431 111   5 0 (0.95495495 0.04504505) *
                    837) Independent>=132.9431 337  46 0 (0.86350148 0.13649852)  
                     1674) Independent>=144.1668 218  21 0 (0.90366972 0.09633028) *
                     1675) Independent< 144.1668 119  25 0 (0.78991597 0.21008403)  
                       3350) Independent< 142.0451 90  13 0 (0.85555556 0.14444444) *
                       3351) Independent>=142.0451 29  12 0 (0.58620690 0.41379310)  
                         6702) Independent< 142.864 16   5 0 (0.68750000 0.31250000) *
                         6703) Independent>=142.864 13   6 1 (0.46153846 0.53846154) *
                  419) Independent< 125.9543 35  10 0 (0.71428571 0.28571429)  
                    838) Independent< 125.4155 24   5 0 (0.79166667 0.20833333) *
                    839) Independent>=125.4155 11   5 0 (0.54545455 0.45454545)  
                     1678) Independent>=125.8038 8   3 0 (0.62500000 0.37500000) *
                     1679) Independent< 125.8038 3   1 1 (0.33333333 0.66666667) *
              105) Independent< 117.6199 472  71 0 (0.84957627 0.15042373)  
                210) Independent< 114.8143 427  56 0 (0.86885246 0.13114754)  
                  420) Independent>=96.04583 282  31 0 (0.89007092 0.10992908) *
                  421) Independent< 96.04583 145  25 0 (0.82758621 0.17241379)  
                    842) Independent< 94.93683 127  18 0 (0.85826772 0.14173228) *
                    843) Independent>=94.93683 18   7 0 (0.61111111 0.38888889)  
                     1686) Independent>=95.83646 6   1 0 (0.83333333 0.16666667) *
                     1687) Independent< 95.83646 12   6 0 (0.50000000 0.50000000)  
                       3374) Independent>=95.3382 5   2 0 (0.60000000 0.40000000) *
                       3375) Independent< 95.3382 7   3 1 (0.42857143 0.57142857) *
                211) Independent>=114.8143 45  15 0 (0.66666667 0.33333333)  
                  422) Independent>=116.9833 31   7 0 (0.77419355 0.22580645) *
                  423) Independent< 116.9833 14   6 1 (0.42857143 0.57142857) *
             53) Independent>=163.2027 904 154 0 (0.82964602 0.17035398)  
              106) Independent>=163.7328 897 148 0 (0.83500557 0.16499443)  
                212) Independent>=276.3971 48   2 0 (0.95833333 0.04166667) *
                213) Independent< 276.3971 849 146 0 (0.82803298 0.17196702)  
                  426) Independent< 201.1325 345  50 0 (0.85507246 0.14492754)  
                    852) Independent>=189.6392 135   9 0 (0.93333333 0.06666667) *
                    853) Independent< 189.6392 210  41 0 (0.80476190 0.19523810)  
                     1706) Independent< 173.9241 127  16 0 (0.87401575 0.12598425) *
                     1707) Independent>=173.9241 83  25 0 (0.69879518 0.30120482)  
                       3414) Independent>=180.772 38   6 0 (0.84210526 0.15789474) *
                       3415) Independent< 180.772 45  19 0 (0.57777778 0.42222222)  
                         6830) Independent< 177.5194 15   4 0 (0.73333333 0.26666667) *
                         6831) Independent>=177.5194 30  15 0 (0.50000000 0.50000000)  
                          13662) Independent>=179.2229 21   9 0 (0.57142857 0.42857143) *
                          13663) Independent< 179.2229 9   3 1 (0.33333333 0.66666667) *
                  427) Independent>=201.1325 504  96 0 (0.80952381 0.19047619)  
                    854) Independent>=222.623 374  55 0 (0.85294118 0.14705882) *
                    855) Independent< 222.623 130  41 0 (0.68461538 0.31538462)  
                     1710) Independent< 207.3438 79  20 0 (0.74683544 0.25316456)  
                       3420) Independent>=204.6478 31   2 0 (0.93548387 0.06451613) *
                       3421) Independent< 204.6478 48  18 0 (0.62500000 0.37500000)  
                         6842) Independent< 203.1207 40  12 0 (0.70000000 0.30000000) *
                         6843) Independent>=203.1207 8   2 1 (0.25000000 0.75000000) *
                     1711) Independent>=207.3438 51  21 0 (0.58823529 0.41176471)  
                       3422) Independent>=210.3682 40  15 0 (0.62500000 0.37500000) *
                       3423) Independent< 210.3682 11   5 1 (0.45454545 0.54545455) *
              107) Independent< 163.7328 7   1 1 (0.14285714 0.85714286) *
           27) Independent< 86.43065 8   3 1 (0.37500000 0.62500000) *
        7) Independent>=287.647 305  95 0 (0.68852459 0.31147541)  
         14) Independent>=302.5464 211  52 0 (0.75355450 0.24644550)  
           28) Independent< 363.2511 125  22 0 (0.82400000 0.17600000)  
             56) Independent>=346.814 47   1 0 (0.97872340 0.02127660) *
             57) Independent< 346.814 78  21 0 (0.73076923 0.26923077)  
              114) Independent< 334.3451 59  10 0 (0.83050847 0.16949153)  
                228) Independent>=325.5767 16   0 0 (1.00000000 0.00000000) *
                229) Independent< 325.5767 43  10 0 (0.76744186 0.23255814)  
                  458) Independent< 315.6446 34   4 0 (0.88235294 0.11764706) *
                  459) Independent>=315.6446 9   3 1 (0.33333333 0.66666667) *
              115) Independent>=334.3451 19   8 1 (0.42105263 0.57894737) *
           29) Independent>=363.2511 86  30 0 (0.65116279 0.34883721)  
             58) Independent>=367.1229 70  20 0 (0.71428571 0.28571429) *
             59) Independent< 367.1229 16   6 1 (0.37500000 0.62500000) *
         15) Independent< 302.5464 94  43 0 (0.54255319 0.45744681)  
           30) Independent< 295.6871 61  20 0 (0.67213115 0.32786885)  
             60) Independent>=295.1765 18   1 0 (0.94444444 0.05555556) *
             61) Independent< 295.1765 43  19 0 (0.55813953 0.44186047)  
              122) Independent< 291.7578 27  10 0 (0.62962963 0.37037037) *
              123) Independent>=291.7578 16   7 1 (0.43750000 0.56250000) *
           31) Independent>=295.6871 33  10 1 (0.30303030 0.69696970) *
Das ist doch kein ganz kleiner Baum. Ein paar Blätter mehr werden es noch, wenn Du minsplit auf 1 statt auf 5 setzt.



Fazit zu Problem 1: Dass rpart Deinen Datensatz nicht weiter zerlegt, ist richtig. Der Unterschied zwischen method="class" und method="anova" scheint zu sein, dass die Argumente für die Pruning-Kontrolle unterschiedlich funktionieren. Das ist unbefriedigend in der Hilfe erläutert, im Grundsatz aber zu erwarten gewesen. Was Du Dir von einem Klassifikationsbaum ohne Pruning erwartest, weiß ich nicht.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte

bigben
Beiträge: 379
Registriert: Mi Okt 12, 2016 9:09 am

Re: Entscheidungsbaum mit rpart()

Beitrag von bigben » Mi Dez 06, 2017 3:23 pm

Zu Problem 2: Wenn man die Pruning-Parameter so einstellt, dass ein Baum entsteht, und damit predict aufruft, dann lassen sich damit auch mühelos predictions generieren:

Code: Alles auswählen

classtree <- rpart(Dependent_2 ~  Independent,
                   data = tree[tree_training,], method ="class",
                   control=rpart.control(minsplit = 50, cp=0))
head( predict(classtree, newdata, type="class"), 100)
führt zu:

Code: Alles auswählen

> head( predict(classtree, newdata, type="class"), 100)
   2    6    9   14   21   26   29   35   36   45   47   52   56   57   62   69   70 
  Ja Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein 
  71   73   76   77   83   86   90   98  101  107  108  115  116  121  123  129  130 
Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein 
 132  134  136  142  144  149  151  177  183  187  188  189  203  213  216  220  221 
Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein 
 225  226  236  241  244  245  247  248  251  256  257  258  259  263  264  267  276 
Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein 
 281  287  288  291  293  301  302  304  305  308  312  317  318  320  321  324  327 
Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein 
 331  335  336  342  344  345  348  349  351  353  357  359  362  363  373 
Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein Nein 
Levels: Ja Nein
> length(predict(classtree, newdata, type="class"))
[1] 2038
Was die komische Numerierung der Ja/Nein-Antworten ist weiß ich nicht. Ich vermute aber, es ist die Nummer des Blattes, mit dem dieses Ergebnis vorhergesagt wurde. Das zu prüfen überlasse ich dann mal Dir.

Beachte bitte, dass "Ja" und "Nein" hier, wie in einem R Faktor üblich, mit 1 und 2 codiert sind, nicht mit 1 und 0!
Das ist zum Beispiel in folgender Übersicht deutlich:

Code: Alles auswählen

x <- data.frame(Independent = seq(from=0, to = 4500, by = .01))
y <- predict(classtree, x, type="class")
plot(x$Independent, as.numeric(y))
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast