2012-02-15 36 views
12

Tôi sử dụng gói GBM R có lẽ là lựa chọn đầu tiên của tôi cho mô hình dự đoán. Có rất nhiều điều tuyệt vời về thuật toán này nhưng thuật toán "xấu" là tôi không thể dễ dàng sử dụng mã mô hình để ghi dữ liệu mới bên ngoài R. Tôi muốn viết mã có thể được sử dụng trong SAS hoặc hệ thống khác (tôi sẽ bắt đầu bằng SAS (không có quyền truy cập vào IML)).Thế hệ quy tắc GBM - Tư vấn mã hóa

phép nói rằng tôi có tập dữ liệu sau đây (từ GBM bằng tay) và mã model:

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 

Bây giờ tôi có thể nhìn thấy cây cối cá nhân sử dụng pretty.gbm.tree như trong

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

trong đó sản lượng

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 

Trang hướng dẫn 18 hiển thị như sau:

enter image description here

Dựa trên hướng dẫn, chia đầu tiên xảy ra trên biến thứ 3 (không có trụ sở tại đầu ra này) mà là gbm1$var.names[3] "X3". Biến là yếu tố đặt hàng.

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

types[3] 

Vì vậy, chia tay là 1,5 có nghĩa là giá trị 'd và c' levels[[3]][1:2.5] (còn số không dựa) chia tách đến nút trái và những người khác levels[[3]][3:4] đi về bên phải.

Tiếp theo, sự cai trị tiếp tục với một sự chia rẽ tại gbm1$var.names[2] như được biểu thị bởi SplitVar = 1 ở hàng lập chỉ mục 1.

Có ai viết bất cứ điều gì để di chuyển qua cấu trúc dữ liệu này (cho mỗi cây), xây dựng các nguyên tắc như :

"Nếu X3 trong ('d', 'c') và X2 < 1,0309565491 và X3 trong ('d') sau đó scoreTreeOne = -,0102671518"

đó là cách tôi nghĩ rằng sự cai trị đầu tiên từ này cây đọc.

Hoặc có lời khuyên nào về cách thực hiện tốt nhất điều này?

+0

Tôi nghĩ rằng IML trong SAS có thể cung cấp giải pháp. Tuy nhiên, tôi không thực sự hiểu R ở đây. Bạn có thể giải thích rõ hơn về mô hình? –

+0

Xin chào Robbie- Không có quyền truy cập vào IML. Đang tìm bước dữ liệu. Tôi đã thêm mô tả nội dung cột cho pretty.gbm.tree. –

+0

Có thể bạn có thể xem [rattle] (http://cran.r-project.org/web/packages/rattle/index.html) để thực hiện chức năng như vậy cho cây quyết định (như được thảo luận trong [Cross Validated] (http://stats.stackexchange.com/a/12089/930)). Tôi đã không kiểm tra bản thân mình nếu điều này sẽ áp dụng với đầu ra 'gbm'. – chl

Trả lời

0

Đây là câu trả lời rất chung chung về cách thực hiện điều này.

Thêm một số mã R để ghi đầu ra vào một tệp. https://stat.ethz.ch/R-manual/R-devel/library/base/html/sink.html

Sau đó, thông qua SAS, truy cập khả năng để thực hiện R với: http://support.sas.com/documentation/cdl/en/hostunx/61879/HTML/default/viewer.htm#a000303551.htm (Bạn sẽ cần phải biết được nơi thực thi R của bạn là để chỉ mã R bạn đã viết ở trên vào thực thi)

Từ đó bạn sẽ có thể thao tác đầu ra bên trong SAS để thực hiện bất kỳ điểm nào bạn có thể cần.

Nếu chỉ đơn giản là chấm điểm một lần và không phải là một quy trình, hãy bỏ qua việc thực thi SAS của R và chỉ cần phát triển mã SAS để phân tích cú pháp thông qua tệp đầu ra R.

1

Gói mlmeta có chức năng gbm2sas xuất mô hình GBM từ R sang SAS.

Các vấn đề liên quan