Прогнозирование модели по дереву для каждого конечного узла - PullRequest
0 голосов
/ 29 ноября 2018

Я строю RandomForest, который состоит из 10 деревьев.Для каждого из 10 деревьев для каждого конечного узла в поезде строится модель NaiveBayes.Например, для первого дерева RF у меня есть 23 различных терминальных узла.train_nodes[,1] - первое дерево в примере.

> unique (train_nodes[,1]) ### All the terminal nodes of train_tree no. 1 of RF
 [1] 36 32 47 35 41 53 22  9 44 49 58 12  8 55 56 21 17 24 40 48  6 30 20 38 46 59 42 23 50 51

Теперь я нахожу прогноз терминального узла в каждой из строк теста.Я получаю:

> head (test_nodes)
   1  2  3  4  5  6  7  8  9 10
1  9 17 32 35 20 35 41 40  9 48
2  9 14  8  8 16 16 14 13  4  9
3 24 17 21 35 20 35 33 48  9 48
4  9 14  8  8 16 16 14 13  4  9
5  9 30  8  8 16 16 14 20  4  9
6 42 38  6 12 50 13 36 44 51 13

Это означает, что в первой строке есть терминальный узел 9 для первого дерева.Я хотел бы взять модель NaiveBayes для первого дерева

Я хотел бы взять прогноз узлов RF-деревьев и для каждого конечного узла (для каждого дерева) для выполнения в строке соответствующей модели NB (NB_TRAIN_model и добавьте к test$RF_NB[1..10] прогноз, основанный на соответствующей модели NB.

Например, для первой строки в тесте я буду запускать модель NB, соответствующую первому дереву для терминального узла 9.

require (data.table)
require (e1071)
require (randomForest)
dat1 <- fread('https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data',stringsAsFactors=T)

## split data to train and test
set.seed(123)
dat1 <- subset(dat1, !is.na(V1))
smp_size<-100
train_ind <- sample(seq_len(nrow(dat1)), size = smp_size)
train <- dat1[train_ind, ]
test <- dat1[-train_ind, ]

rf <- randomForest(V1 ~ ., data = train, ntree = 10, keep.inbag = TRUE)

rf_train<-predict(rf,train[,V2:V9], nodes=TRUE)
train_nodes<-attr(rf_train,"nodes")

rf_test<-predict(rf,test[,V2:V9], nodes=TRUE)
test_nodes<-attr(rf_test,"nodes")


### Holds the naiveBayes models per terminal node per tree 
NB_TRAIN_model<-list()

for (i in 1:(rf$ntree))
{
  NB_TRAIN_model[i]<-lapply(split(train, train_nodes[,i]), function(x) naiveBayes(V1 ~ V2+V3+V4+V5+V6+V7+V8+V9, data = x))

}
...