2017-03-21 5 views
0

J'ai formé un arbre de décision de classification de ctree de paquet de partykit et j'ai besoin de calculer des probabilités de classification pour le sub tree (pas seulement pour des nœuds de feuille). Ainsi, par exemple si un arbre secondaire est constitué par 3 noeuds de feuille avec les probabilités suivantes: feuille 1 (120 observations): 0,45 feuille 2 (160 observations): 0,49 feuille 3 (190 observations): 0,83R partykit calculer les probabilités de classification sur sub stree

pour ce sous-arbre hypothétique la probabilité moyenne pondérée serait 120 * 0,42 + 160 * 0,49 + 190 * 0,83/(120 + 160 + 190) = 0,507

et ainsi de suite je dois traverser sur l'objet ctree et calculer tout probabilités pondérées pour chaque nœud récursivement.

Je possède ce 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) 
    } 

qui traversent sur l'arbre ne fonctionne pas sur l'objet de partykit. D'autre part, j'ai ce code, qui énumère tous les porbabilities pour les nœuds de feuilles seulement:

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

Toute suggestion de combiner ces 2 extraits à un code qui traversera sur un objet PARTYKIT et calculer cette moyenne pondérée sont appréciés

+0

Ce n'est pas très clair pour moi ce que je veux exactement faire car le code tel qu'il est posté contient quelques erreurs. Cependant, je pense que cette réponse vous aidera à faire ce que vous voulez (ou poser une question plus précise): http://stackoverflow.com/questions/41968910/r-extracting-inner-node-information-and-splits-from -ctree-partykit/41976697 # 41976697 –

Répondre

0

Je ne suis pas familier avec partykit mais cette fonction simple promenades et un ctree extrait la probabilité pour chaque noeud interne et terminal:

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

L'appel de la fonction produit le vecteur des probabilités suivantes:

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

La plus grande valeur de gauche est la valeur de la population vérifiée par ce qui suit:

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

Le reste des valeurs vont être en ordre de gauche à droite. Vous pouvez voir que les 1 et les 0 s'alignent où prévu.

+0

Est-ce que cette implémentation prend en compte le nombre d'observations pour chaque feuille/noeud terminal? – NRG

+0

Oui, les probabilités de nœud interne sont les probabilités de l'ensemble du sous-arbre. – Zelazny7

+0

génial, merci – NRG