将列表名称分配给模型矩阵

时间:2018-11-29 12:54:34

标签: r list dataframe matrix model

我有一个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中的每个数据帧创建一个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

0 个答案:

没有答案
相关问题