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:
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ć?
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? –
Witaj Robbie- Brak dostępu do IML. Szukam etapu danych. Dodałem opis zawartości kolumny dla pretty.gbm.tree. –
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