У меня есть b
, который представляет собой список фреймов данных:
> b[[1]]
$`6`
V1 V2 V3 V4 V5 V6 V7 V8 V9
1: M 0.49 0.465 0.125 0.5225 0.235 0.13 0.141 7
$`8`
V1 V2 V3 V4 V5 V6 V7 V8 V9
1: I 0.235 0.160 0.04 0.048 0.0185 0.0180 0.015 5
2: I 0.185 0.135 0.04 0.027 0.0105 0.0055 0.009 5
3: M 0.175 0.125 0.04 0.024 0.0095 0.0060 0.005 4
....
> class (b)
[1] "list"
> class (b[[1]]$`6`)
[1] "data.table" "data.frame"
Я хотел бы создать для каждого фрейма данных в b
a NaiveBayes
модель:
NB_TRAIN_model[[k,i]]<- naiveBayes(V1 ~ ., data = b[[i]][[k]])
Например, b[[6,1]] <- <- naiveBayes(V1 ~ ., data = b[[i]]$'
6 ')
Так что каждый столбец - это дерево №.и каждая строка - это имя терминального узла.Где i - номер дерева (1..rf$ntree
), а k - имя кадра данных в b[[i]]
(это имя конечного узла).
require(party)
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")
### each `b[i]` holds the rows for each terminal node for tree number `i`
b<-list()
max_no_terminalnodes<- length (split(train, train_nodes[,1]) )
for (i in 1:(rf$ntree))
{
b[[i]]<-split(train, train_nodes[,i])
if ( max_no_terminalnodes < length (split(train, train_nodes[,i]) ) ) {
max_no_terminalnodes <- length (split(train, train_nodes[,i]) ) }
}
### Holds the naiveBayes models per terminal node per tree
NB_TRAIN_model<-matrix(list(), nrow=max_no_terminalnodes, ncol=rf$ntree)
k=0
for (i in 1:(rf$ntree))
{
for (j in as.numeric (names( b[[i]]))){
k=k+1
NB_TRAIN_model[[k,i]]<- naiveBayes(V1 ~ ., data = b[[i]][[k]] )
}
k=0
}
Как видно из моего кодаЯ теряю настоящее имя b
.