【问题标题】:Predicting chunks with M models in R在 R 中使用 M 个模型预测块
【发布时间】:2018-08-11 19:24:42
【问题描述】:

我有数据集 (HEART)。我把它分成几块。我想用他 (M=3) 以前的模型来预测每个块。在这种情况下,我想预测块号 10 - 模型为 7、8、9。块 9 - 模型 6,7,8... 块 4 - 模型 1,2,3。 这是我的代码:

library(caret)
dat1 <- read.csv(url("http://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data"), header = FALSE,sep = ",")
colnames(dat1) <- c(LETTERS[1:(ncol (dat1)-1)],"CLA")
dat1$CLA<-as.factor (dat1$CLA)

chunk <- 30
n <- nrow(dat1)
r  <- rep(1:floor(n/chunk),each=chunk)[1:n]
d <- split(dat1,r)

N<-floor(n/chunk)
cart.models <- list()
for(i in 1:N){cart.models[[i]]<-rpart(CLA~ ., data = d[[i]]) }
for (i in (1+M):N) { k=0
  for (j in (i-M):(i-1)) { 
    k=k+1
    d[[i]][,(ncol(d[[i]])+k)]<-(predict(cart.models[[j]], d[[i]][,c(-14)], type = "class") )
    } 
     }

我收到以下错误:

Error in `[<-.data.frame`(`*tmp*`, , (ncol(d[[i]]) + k), value = c(1L,  : 
  new columns would leave holes after existing columns 

【问题讨论】:

    标签: r loops predict rpart


    【解决方案1】:

    您的问题有点令人费解,您加载caret 时没有使用其中的任何函数。目标看起来像是一个时间序列分析,但不是建立在一个块上并预测它之后的那个,你有一个更复杂的愿望,所以来自caretcreateTimeSlices 不会成功。 您可以使用trainControl 中的indexindexOut 参数在插入符号中创建自定义折叠,但这最终会导致创建的模型(准确地说是21 个)比提出的目标(9)所需的模型多。所以我相信循环是一种合适的方式:

    创建模型:

    library(rpart)
    
    N <- 9
    cart.models <- list()
    for(i in 1:N){
      cart.models[[i]] <- rpart(CLA~ ., data = d[[i]])
    }
    

    N 可以是9,因为以后不会使用10

    创建一个矩阵来存储值:

    cart.predictions <- matrix(nrow = chunk, ncol = length(4:10)*3)
    

    它应该具有与每个块中的预测相同的行数(因此 30),并且它应该具有与预测一样多的列(4:10 块的三个模型)。

    k <- 0 #as a counter
    for (j in 4:10) { #prediction on chunks 4:10
      p <- j-3  
      pred <- list()
      for(i in p : (p+2)) { #using models (chink - 3) : (chunk - 1)
        k = k + 1 
        predi <- predict(cart.models[[i]], d[[j]], type = "class")
        cart.predictions[,k] <- predi
      }
    } 
    

    这将为预测创建一个数字矩阵。默认情况下,当 R 将因子转换为数字时,它会为它们提供数字:1 到第一级,2 到第二级等 - 所以要获得级别 (0:4),您可以:

    cart.predictions <- as.data.frame(cart.predictions - 1)
    

    创建列名:

    names <- expand.grid(3:1, 4:10)
    names$Var1 <- with(names, Var2 - Var1) 
    
    colnames(cart.predictions) <- make.names(paste0(names$Var1,"_", names$Var2))
    

    让我们检查它是否正确:

    从模型 5 对块 6 的预测转换为数字

    as.numeric(as.character(predict(cart.models[[5]], d[[6]], type = "class")))
    

    应该等于

    cart.predictions[["X5_6"]] #that's how the names were designed
    
    all.equal(as.numeric(as.character(predict(cart.models[[5]], d[[6]], type = "class"))),
              cart.predictions[["X5_6"]])
    #output
    TRUE
    

    或者你可以先创建一个字符矩阵:

    cart.predictions <- matrix(data = NA_character_, nrow = chunk, ncol = length(4:10)*3)
    
    k <- 0 #as a counter
    for (j in 4:10) { 
      p <- j-3
      pred <- list()
      for(i in p : (p+2)) {
        k = k + 1 
        predi <- predict(cart.models[[i]], d[[j]], type = "class")
        cart.predictions[,k] <- predi
      }
    } 
    
    cart.predictions <- as.data.frame(cart.predictions)
    

    如果类是某些“名称”,这应该是首选方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2022-11-26
      • 2023-04-09
      相关资源
      最近更新 更多