2017-03-21 5 views
0

Ich habe ein Partykit-Paket ctree Klassifizierung Entscheidungsbaum trainiert und ich muss Klassifikationswahrscheinlichkeiten für Unterbaum (nicht nur für Blattknoten) berechnen. So zum Beispiel, wenn ein Teilbaum besteht aus 3 Blattknoten mit den folgenden Wahrscheinlichkeiten: Blatt 1 (120 Beobachtungen): 0.45 Blatt 2 (160 Beobachtungen): 0,49 Blatt 3 (190 Beobachtungen): 0,83R Partykit berechnen Klassifikationswahrscheinlichkeiten auf Sub-stree

für In diesem hypothetischen Subbaum wäre die gewichtete Durchschnittswahrscheinlichkeit 120 * 0,42 + 160 * 0,49 + 190 * 0,83/(120 + 160 + 190) = 0,507

usw. Ich muss auf dem ctree-Objekt traversieren und alles berechnen gewichtete Wahrscheinlichkeiten für jeden Knoten rekursiv.

Ich habe diesen Code:

data(airquality) 
airq <- subset(airquality, !is.na(Ozone)) 
airct <- ctree(Ozone ~ ., data = airq, 
       controls = ctree_control(maxsurrogate = 3)) 
traverse <- function(treenode){ 
    if(treenode$terminal){ 
     bas=paste("Current node is terminal node with",treenode$nodeID,'prediction',treenode$prediction) 
     print(bas) 
     return(0) 
    } else { 
     bas=paste("Current node",treenode$nodeID,"Split var. ID:",treenode$psplit$variableName,"split value:",treenode$psplit$splitpoint,'prediction',treenode$prediction) 
     print(bas) 
    } 
    traverse(treenode$left) 
    traverse(treenode$right) 
    } 

, die auf dem Baum durchqueren nicht auf partykit Objekt arbeiten. Auf der anderen Seite ich diesen Code haben, der nur alle porbabilities für Blattknoten enthält:

preds.ls <- list(predict(airct , type = "prob"))[1] 
pred.probs.df <- unique(as.data.frame((preds.ls[[1]]))) 

Irgendwelche Vorschläge, diese 2-Schnipsel zu einem Code zu kombinieren, die auf einem PARTYKIT Objekt durchlaufen wird und diese gewichtete Durchschnitt berechnen werden geschätzt

+0

Es ist mir nicht ganz klar, was genau zu tun ist, da der gepostete Code einige Fehler enthält. Ich denke jedoch, dass diese Antwort Ihnen helfen wird, das zu tun, was Sie wollen (oder eine genauere Frage stellen): http://stackoverflow.com/questions/41968910/r-extracting-inner-node-information-and-splits-from -ctree-partykit/41976697 # 41976697 –

Antwort

0

ich bin nicht vertraut mit partykit aber diese einfache Funktion geht ein ctree und extrahiert die Wahrscheinlichkeit für jeden internen und Endknoten:

library(party) 

    set.seed(100) 
    dt <- ctree(factor(mpg > 20)~., data = mtcars, 
       control = ctree_control(minsplit=2, minbucket=1, mincriterion=0)) 

    traverse <- function(node) { 
     if (node$terminal) { 
     return(node$prediction[2]) 
     } 
     return(c(node$prediction[2], 
       traverse(node$left), traverse(node$right))) 
    } 

enter image description here

Funktion aufrufen erzeugt den folgenden Vektor von Wahrscheinlichkeiten:

> traverse([email protected]) 
[1] 0.4375000 1.0000000 0.1428571 0.4285714 0.7500000 0.0000000 0.0000000 

Der am weitesten links stehende Wert ist die Bevölkerung Wert durch die folgende verifiziert:

> mean(mtcars$mpg > 20) 
[1] 0.4375 

Die restlichen Werte werden zu in der Reihenfolge von links nach rechts sein. Sie können sehen, dass die 1s und 0s wo erwartet ausgerichtet sind.

+0

Berücksichtigt diese Implementierung die Anzahl der Beobachtungen für jeden Blatt-/Endknoten? – NRG

+0

Ja, die internen Knotenwahrscheinlichkeiten sind die Wahrscheinlichkeiten des gesamten Teilbaums. – Zelazny7

+0

awesome, thanks – NRG

Verwandte Themen