2017-03-21 11 views
0

私はパーティーキットパッケージのctree分類決定木を訓練しました。私は、葉のノードだけでなくサブツリーの分類確率を計算する必要があります。 リーフ1(120観測):0.45 葉2(160観測):0.49 リーフ3(190観測):0.83R partykit substreeの分類確率を計算する

ため だから、例えばサブツリーは、以下の確率で3つのリーフ・ノードで構成されている場合この仮説的なサブツリーは、 120 * 0.42 + 160 * 0.49 + 190 * 0.83 /(120 + 160 + 190)= 0.507

などとなります。私はctreeオブジェクトをトラバースしてすべてを計算する必要があります再帰的に各ノードの重み付き確率を計算する。

私はこのコードを持っている:木の上にトラバース

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) 
    } 

はpartykitオブジェクトでは動作しません。葉ノードのみのため、すべてのporbabilities一覧表示されます、私はこのコードを持っている一方、 :PARTYKITオブジェクトに横断し、この加重平均を計算するコードにこれら2つの断片を結合する

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

任意の提案を高く評価しています

+0

投稿されたコードにいくつかのエラーが含まれているため、正確に何をしたいのかはわかりません。しかし、私はこの答えは、あなたが望むことを(またはより正確な質問をするのに役立つと思う):http://stackoverflow.com/questions/41968910/r-extracting-inner-node-information-and-splits-from -ctree-partykit/41976697#41976697 –

答えて

0

私はpartykitに慣れていないんだけど、このシンプルな機能がctreeを歩くと、すべての内部および末端ノードの確率を抽出します。

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))) 
    } 

0関数を呼び出す

は確率の次のベクトルを生成します。

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

一番左の値は、次によって検証人口値である:

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

値の残りがしようとしています左から右に順番に並ぶ。 1秒と0秒が予想通りに並んでいることがわかります。

+0

この実装では、各リーフ/端末ノードの観測数を考慮していますか? – NRG

+0

はい、内部ノードの確率は、サブツリー全体の確率です。 – Zelazny7

+0

awesome、thanks – NRG