我构建了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模型进行预测。
例如,对于测试的第一行,我将为终端节点9
运行与第一棵树相关的NB模型。
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))
}