2017-06-05 3 views
0

J'ai créé un arbre de décision constparty (règles de division personnalisées) et j'imprime le résultat de l'arborescence. Le résultat ressemble à ceci:R extrait des informations du nœud terminal à partir de l'arbre de décision de la compilation

Fitted party: 
[1] root 
| [2] value.a < 1651: 0.067 (n = 1419, err = 88.6) 
| [3] value.a >= 1651: 0.571 (n = 7, err = 1.7) 

Je suis en train d'extraire les informations de nœud terminal (le yval: 0,067 et 0,571; n sur chaque nœud: 1419 et 7; et err: 88,6 et 1,7) et mettez-les dans une liste en ayant l'identifiant de noeud correspondant (ID de noeud 2 et 3) afin que je puisse utiliser ces informations plus tard.

J'ai regardé dans des fonctions de partykit pendant un certain temps et n'a pas pu trouver une fonction qui pourrait m'aider à extraire ces informations que je viens énumérées.

Quelqu'un pourrait-il m'aider? Je vous remercie!

Répondre

1

Comme d'habitude, il existe plusieurs approches pour obtenir l'information que vous recherchez. Le moyen technique pour extraire le info stocké dans un node particulier est d'utiliser nodeapply(object, ids, info_node)info_node renvoie une liste d'informations stockées dans le nœud respectif.

Cependant, dans les nœuds terminaux de constparty objets il n'y a rien stocké. Au lieu de cela, la distribution entière de la réponse par noeud ajusté est stockée et peut être extraite par fitted(object). Celui-ci contient une trame de données avec le nœud (response) observé (fitted) et l'observation (weights) (le cas échéant). Et vous pouvez facilement utiliser tapply() ou aggregate() ou quelque chose comme ça pour calculer des moyens de sage noeud etc.

Vous pouvez convertir l'objet constparty à un objet simpleparty qui stocke les informations imprimées dans les noeuds et l'extraire.

A travaillé par exemple pour les deux stratégies est un simple arbre de régression pour les données cars:

library("partykit") 
data("cars", package = "datasets") 
ct <- ctree(dist ~ speed, data = cars) 

Ensuite, vous pouvez facilement calculer nœud sage mean s par

with(fitted(ct), tapply(`(response)`, `(fitted)`, mean)) 
##  3  4  5 
## 18.20000 39.75000 65.26316 

Bien sûr, vous pouvez remplacez mean par toute autre statistique récapitulative qui vous intéresse.

Le nodeapply() pour t il simpleparty peut être obtenu par:

nodeapply(as.simpleparty(ct), ids = nodeids(ct, terminal = TRUE), info_node) 
## $`3` 
## $`3`$prediction 
## [1] 18.2 
## 
## $`3`$n 
## n 
## 15 
## 
## $`3`$error 
## [1] 1176.4 
## 
## $`3`$distribution 
## NULL 
## 
## $`3`$p.value 
## NULL 
## 
## 
## $`4` 
## $`4`$prediction 
## [1] 39.75 
## ... 
+0

Merci beaucoup pour la réponse! Vous êtes le roi de DT sur R! J'apprécie vraiment tout ce que vous m'avez aidé en ce qui concerne le sujet et j'espère pouvoir continuer à apprendre de vous! –

+0

@RichardLi Je ne suis pas sûr si elle se qualifie pour la noblesse, mais je suis heureux si notre logiciel est utile pour vous! ;-) –

+0

Puis-je poser une question de suivi concernant le sujet? J'ai extrait l'information using nodeapply (info_node), et je voudrais automatiser le processus, par exemple: créer une fonction pour extraire l'information de noeud d'une série de noeud, mais je n'ai pas réussi à faire ainsi au sein de la fonction. L'extraction nécessitait la notation "nodeinfo $' nodeid' $ distribution "à titre d'exemple, mais dans la fonction, si je définissais j comme identifiant de noeud, la fonction ne pouvait pas reconnaître la notation de nodeinfo $' j' $ distribution. Avez-vous une solution pour cela? Merci beaucoup!! –