2012-02-15 15 views
12

Używam pakietu GBM jako prawdopodobnie mój pierwszy wybór do modelowania predykcyjnego. Jest tak wiele wspaniałych rzeczy na temat tego algorytmu, ale jedynym "złym" jest to, że nie mogę łatwo użyć kodu modelu, aby zdobyć nowe dane poza R. Chcę napisać kod, który może być użyty w SAS lub innym systemie (zacznę od SAS (brak dostępu do IML)).Generacja reguł GBM - Porada dotycząca kodowania

Powiedzmy mam następujący zestaw danych (z GBM ręcznego) i kod modelu

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 

Teraz widzę pojedynczych drzew za pomocą pretty.gbm.tree jak w

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

który daje

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 

Podręcznik na stronie 18 przedstawia:

enter image description here

podstawie instrukcji, pierwszy rozłam wystąpi na 3 zmiennej (zero oparte na tym wyjściu), który jest gbm1$var.names[3] „X3”. Zmienna to współczynnik uporządkowany.

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

types[3] 

Więc podział jest na 1,5 oznacza wartość „d i c” levels[[3]][1:2.5] (również od zera) dzieli się lewym węźle i innych levels[[3]][3:4] iść na prawo.

Następnie reguła nadal z podziałem na gbm1$var.names[2] oznaczoną SplitVar = 1 w wierszu indeksowanych 1.

ktoś napisał coś, aby przejść przez ten struktury danych (dla każdego drzewa), takie jak zasady konstruowania :

"Jeśli w X3 ('d', 'c') i X2 i X3 < 1.0309565491 iN ('d') następnie scoreTreeOne = -0,0102671518"

który jest, jak myślę, że pierwszy przepis z tego drzewo czyta.

Czy masz porady, jak najlepiej to zrobić?

+0

Myślę, że IML w SAS może zaoferować rozwiązanie. Jednak tak naprawdę nie rozumiem R tutaj. Czy mógłbyś bardziej precyzyjnie interpretować wzór? –

+0

Witaj Robbie- Brak dostępu do IML. Szukam etapu danych. Dodałem opis zawartości kolumny dla pretty.gbm.tree. –

+0

Może mógłbyś rzucić okiem na [grzechotka] (http://cran.r-project.org/web/packages/rattle/index.html), która implementuje taką funkcjonalność dla drzew decyzyjnych (jak omówiono na [Cross Validated] (http://stats.stackexchange.com/a/12089/930)). Nie sprawdzałem siebie, czy dotyczyłoby to wyjścia 'gbm'. – chl

Odpowiedz

0

Oto bardzo ogólna odpowiedź na pytanie, jak można to zrobić.

Dodaj trochę kodu R, aby zapisać wynik do pliku. https://stat.ethz.ch/R-manual/R-devel/library/base/html/sink.html

Następnie przez SAS, dostęp zdolność do wykonywania badań z: http://support.sas.com/documentation/cdl/en/hostunx/61879/HTML/default/viewer.htm#a000303551.htm (Musisz wiedzieć, gdzie R wykonywalny jest wskazanie kodu R masz napisane powyżej w pliku wykonywalnego)

Stamtąd powinieneś być w stanie manipulować wynikami w SAS, aby uzyskać dowolną punktację, której możesz potrzebować.

Jeśli jest to po prostu jednorazowe ocenianie, a nie proces, pomiń wykonanie SAS R i po prostu opracuj kod SAS, aby przeanalizować plik wyjściowy R.

1

Pakiet mlmeta ma funkcję gbm2sas, która eksportuje model GBM z R do SAS.