在 R 中使用 M 模型预测块
Predicting chunks with M models in R
我有数据集 (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
你的问题有点令人费解,你加载了 caret
而没有使用它的任何功能。 objective 看起来像是一个时间序列分析,但不是建立在一个块上并预测其后的块,你有一个更复杂的需求,所以 caret
中的 createTimeSlices
不会'不要耍花招。
您可以在 trainControl
中使用 index
和 indexOut
参数在插入符号中创建自定义折叠,但这最终会导致创建比所呈现的 objective (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)
如果 类 是确定的 "names",这应该是首选方法。
我有数据集 (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
你的问题有点令人费解,你加载了 caret
而没有使用它的任何功能。 objective 看起来像是一个时间序列分析,但不是建立在一个块上并预测其后的块,你有一个更复杂的需求,所以 caret
中的 createTimeSlices
不会'不要耍花招。
您可以在 trainControl
中使用 index
和 indexOut
参数在插入符号中创建自定义折叠,但这最终会导致创建比所呈现的 objective (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)
如果 类 是确定的 "names",这应该是首选方法。