2015-07-22 6 views
5

Ich bin mit dem rpart Paket wie folgt:Verwenden von rpart: Wie erhalten Sie mehr Variabilität bei Vorhersagen?

model <- rpart(totalUSD ~ ., data = df.train) 

Ich stelle fest, dass mehr als 80k Zeilen, rpart ist verallgemeinern es Prognosen ist in nur drei verschiedene Gruppen wie unten im Bild gezeigt:

enter image description here

Ich sehe mehrere configuration options for the rpart method; aber ich verstehe sie nicht ganz.

Gibt es eine Möglichkeit, rpart so zu konfigurieren, dass es erstellt mehr Vorhersagen (statt nur drei); nicht so starke Gruppen, aber mehr Ebenen dazwischen?

Der Grund, warum ich frage, ist, weil mein Kostenschätzer ziemlich einfach aussieht, da es nur eine von drei Zahlen zurückgibt! Hier

ist ein Beispiel für meine Daten:

structure(list(totalUSD = c(9726.6, 730.14, 750, 200, 60.49, 
310.81, 151.23, 145.5, 3588.13, 400), durationDays = c(730, 724, 
730, 189, 364, 364, 364, 176, 730, 1095), familySize = c(4, 1, 
2, 1, 3, 2, 1, 1, 4, 4), serviceName = c("Service5", 
"Service6", "Service9", "Service4", 
"Service1", "Service2", "Service1", "Service3", 
"Service7", "Service8"), homeLocationGeoLat = c(37.09024, 
10.691803, 37.09024, 35.86166, 55.378051, 35.86166, 51.165691, 
-30.559482, -30.559482, 41.87194), homeLocationGeoLng = c(-95.712891, 
-61.222503, -95.712891, 104.195397, -3.435973, 104.195397, 10.451526, 
22.937506, 22.937506, 12.56738), hostLocationGeoLat = c(55.378051, 
37.09024, 55.378051, 55.378051, 37.09024, 1.352083, 55.378051, 
37.09024, 23.424076, 1.352083), hostLocationGeoLng = c(-3.435973, 
-95.712891, -3.435973, -3.435973, -95.712891, 103.819836, -3.435973, 
-95.712891, 53.847818, 103.819836), geoDistance = c(6838055.10555534, 
4532586.82063172, 6838055.10555534, 7788275.0443749, 6838055.10555534, 
3841784.48282769, 1034141.95021832, 14414898.8246973, 6856033.00945242, 
10022083.1525388)), .Names = c("totalUSD", "durationDays", "familySize", 
"serviceName", "homeLocationGeoLat", "homeLocationGeoLng", "hostLocationGeoLat", 
"hostLocationGeoLng", "geoDistance"), row.names = c(25601L, 6083L, 
24220L, 20235L, 8372L, 456L, 8733L, 27257L, 15928L, 24099L), class = "data.frame") 
+0

können Sie uns eine Datenprobe oder ein reproduzierbares Beispiel geben? – roman

+0

Ja, ich habe es zu meiner Frage hinzugefügt. Vielen Dank. – user1477388

+1

Ok, ich habe ein wenig mit deinen Daten gespielt. Es ist schwierig, das Problem neu zu erstellen, da der zu erstellende Baum viel mehr Daten benötigt. Ich nehme an, dass die Parameter so eingestellt sind, dass Sie zwei Splits in Ihrem Baum haben (zwei erklärende Variablen von Bedeutung), was zu 3 Endknoten führt. Der Baum sagt den Mittelwert in den Regionen an jedem Endknoten voraus. Wenn Sie genauere Vorhersagen wünschen, sollten Sie etwas wie zufällige Gesamtstrukturen ausprobieren oder einen einzelnen Baum anpassen, anstatt ihn anzupassen. Dann können Sie mit der Kreuzvalidierung die Anzahl der gemittelten Bäume (zufällige Wälder) oder den Schrumpfungsparameter (Boosting) einstellen. – roman

Antwort

3

Wenn Sie wirklich eine komplexe Baumstruktur wollen, versuchen Sie dies:

library(rpart) 
fit = rpart(totalUSD ~ ., data = df.train, control = rpart.control(cp = 0)) 

Grundsätzlich ist jede Spaltung versucht wird, wenn cp = 0, unabhängig von Verbesserungen in spaltet. Sie erhalten damit ein wirklich komplexes Modell, aber Sie haben 80k Beobachtungen, also setzen Sie oder minbucket auf eine Nummer, mit der Sie sich wohl fühlen.

Ich habe diese Strategie in einer zufälligen Gesamtstrukturimplementierung verwendet, in der ich arbeite. Achten Sie darauf, dass die Rechenzeit stark zunimmt.

Verwandte Themen