2012-02-15 13 views
12

मैं अनुमानित मॉडलिंग के लिए शायद मेरी पहली पसंद के रूप में आर पैकेज जीबीएम का उपयोग करता हूं। इस एल्गोरिदम के बारे में बहुत सी महान चीजें हैं लेकिन एक "बुरा" यह है कि मैं आर के बाहर नए डेटा को स्कोर करने के लिए आसानी से मॉडल कोड का उपयोग नहीं कर सकता। मैं कोड लिखना चाहता हूं जिसका उपयोग एसएएस या अन्य सिस्टम में किया जा सकता है (मैं साथ शुरू करूंगा एसएएस (आईएमएल तक कोई पहुंच नहीं))।जीबीएम नियम जनरेशन - कोडिंग सलाह

चलें कहते हैं कि मैं निम्नलिखित डेटा सेट और मॉडल कोड (जीबीएम मैनुअल से):

library(gbm) 
set.seed(1234) 
N <- 1000 
X1 <- runif(N) 
X2 <- 2*runif(N) 
X3 <- ordered(sample(letters[1:4],N,replace=TRUE),levels=letters[4:1]) 
X4 <- factor(sample(letters[1:6],N,replace=TRUE)) 
X5 <- factor(sample(letters[1:3],N,replace=TRUE)) 
X6 <- 3*runif(N) 
mu <- c(-1,0,1,2)[as.numeric(X3)] 
SNR <- 10 # signal-to-noise ratio 
Y <- X1**1.5 + 2 * (X2**.5) + mu 
sigma <- sqrt(var(Y)/SNR) 
Y <- Y + rnorm(N,0,sigma) 
# introduce some missing values 
#X1[sample(1:N,size=500)] <- NA 
X4[sample(1:N,size=300)] <- NA 
X3[sample(1:N,size=30)] <- NA 
data <- data.frame(Y=Y,X1=X1,X2=X2,X3=X3,X4=X4,X5=X5,X6=X6) 
# fit initial model 

gbm1 <- gbm(Y~X1+X2+X3+X4+X5+X6, # formula 
data=data, # dataset 
var.monotone=c(0,0,0,0,0,0), # -1: monotone decrease, 
distribution="gaussian", 
n.trees=2, # number of trees 
shrinkage=0.005, # shrinkage or learning rate, 
# 0.001 to 0.1 usually work 
interaction.depth=5, # 1: additive model, 2: two-way interactions, etc. 
bag.fraction = 1, # subsampling fraction, 0.5 is probably best 
train.fraction = 1, # fraction of data for training, 
# first train.fraction*N used for training 
n.minobsinnode = 10, # minimum total weight needed in each node 
cv.folds = 5, # do 5-fold cross-validation 
keep.data=TRUE, # keep a copy of the dataset with the object 
verbose=TRUE) # print out progress 

अब मैं

pretty.gbm.tree(gbm1,i.tree = 1)[1:7] 

में जो

पैदावार के रूप में व्यक्तिगत pretty.gbm.tree का उपयोग कर पेड़ देख सकते हैं
SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight 
0   2 1.5000000000  1   8   15  983.34315 1000 
1   1 1.0309565491  2   6   7  190.62220 501 
2   2 0.5000000000  3   4   5  75.85130 277 
3  -1 -0.0102671518  -1  -1   -1  0.00000 139 
4  -1 -0.0050342273  -1  -1   -1  0.00000 138 
5  -1 -0.0076601353  -1  -1   -1  0.00000 277 
6  -1 -0.0014569934  -1  -1   -1  0.00000 224 
7  -1 -0.0048866747  -1  -1   -1  0.00000 501 
8   1 0.6015416372  9  10   14  160.97007 469 
9  -1 0.0007403551  -1  -1   -1  0.00000 142 
10  2 2.5000000000  11  12   13  85.54573 327 
11  -1 0.0046278704  -1  -1   -1  0.00000 168 
12  -1 0.0097445692  -1  -1   -1  0.00000 159 
13  -1 0.0071158065  -1  -1   -1  0.00000 327 
14  -1 0.0051854993  -1  -1   -1  0.00000 469 
15  -1 0.0005408284  -1  -1   -1  0.00000  30 

मैनुअल पृष्ठ 18 निम्नलिखित दिखाता है:

enter image description here

मैनुअल के आधार पर, पहले विभाजन 3 चर (शून्य इस उत्पादन में स्थित है), जो है gbm1$var.names[3] "X3" पर होता है। परिवर्तनीय आदेश कारक है।

types<-lapply (lapply(data[,gbm1$var.names],class), function(i) ifelse (strsplit(i[1]," ")[1]=="ordered","ordered",i)) 

types[3] 

तो, विभाजन मान 'घ और ग' levels[[3]][1:2.5] (भी आधारित शून्य) छोड़ दिया नोड और दूसरों के लिए विभाजन सही करने के लिए जाना levels[[3]][3:4] अर्थ 1.5 पर है।

इसके बाद, नियम के रूप में पंक्ति में SplitVar = 1 से निरूपित किया 1.

किसी को भी (हर एक पेड़ के लिए) इस डेटा संरचना के माध्यम से स्थानांतरित करने के लिए कुछ भी लिखा गया है अनुक्रमित gbm1$var.names[2] पर एक विभाजन के साथ जारी है, इस तरह के रूप नियमों का निर्माण :

"अगर में ('प', 'सी') और X2 < १.०३०९५६५४९१ और में ('प') X3 X3 तो scoreTreeOne = -०.०१०२६७१५१८"

है जो कि कैसे मैं इस से पहले नियम लगता है पेड़ पढ़ता है।

या कोई सलाह है कि यह कैसे करना है?

+0

मुझे लगता है कि एसएएस में आईएमएल समाधान प्रदान कर सकता है। हालांकि, मैं वास्तव में यहां आर को समझ नहीं पा रहा हूं। क्या आप पैटर्न के बारे में अधिक स्पष्ट रूप से व्याख्या कर सकते हैं? –

+0

हाय रॉबी- आईएमएल तक कोई पहुंच नहीं। एक डेटा कदम खोज रहे हैं। मैंने pretty.gbm.tree के लिए कॉलम सामग्री का विवरण जोड़ा। –

+0

शायद आप [rattle] (http://cran.r-project.org/web/packages/rattle/index.html) पर एक नज़र डालें जो निर्णय पेड़ के लिए ऐसी कार्यक्षमता लागू करता है (जैसा कि [क्रॉस मान्य] पर चर्चा की गई है] (http://stats.stackexchange.com/a/12089/930))। मैंने खुद को जांच नहीं लिया अगर यह 'जीबीएम' आउटपुट के साथ लागू होगा। – chl

उत्तर

0

यह एक बहुत ही सामान्य जवाब है कि यह कैसे किया जा सकता है।

फ़ाइल में आउटपुट लिखने के लिए कुछ आर कोड जोड़ें। https://stat.ethz.ch/R-manual/R-devel/library/base/html/sink.html

एसएएस के माध्यम से

फिर, के साथ आर पर अमल करने की क्षमता का उपयोग: http://support.sas.com/documentation/cdl/en/hostunx/61879/HTML/default/viewer.htm#a000303551.htm वहां से

(आप जानना चाहते हैं, जहां आपके आर निष्पादन आर कोड आप निष्पादन पर इसके बाद के संस्करण में लिखा है बात करने के लिए है की आवश्यकता होगी) आपको किसी भी स्कोरिंग के लिए एसएएस के भीतर आउटपुट में हेरफेर करने में सक्षम होना चाहिए।

यदि यह केवल एक बार स्कोरिंग और प्रक्रिया नहीं है, तो आर के एसएएस निष्पादन को छोड़ दें और आर आउटपुट फ़ाइल के माध्यम से विश्लेषण करने के लिए बस एसएएस कोड विकसित करें।

1

mlmeta पैकेज में एक फ़ंक्शन gbm2sas है जो आर से एसएएस तक एक जीबीएम मॉडल निर्यात करता है।

संबंधित मुद्दे