模型比较的交叉验证
Posted
技术标签:
【中文标题】模型比较的交叉验证【英文标题】:Cross-validation for model comparison 【发布时间】:2013-12-08 20:31:02 【问题描述】:我有一个相对大的数据:
超过 370,000 个观测值,250 个级别的分类因变量,10 个自变量,包括数值变量和分类变量。
我想为模型比较执行 10 折交叉验证(包括 'rpart' 中的分类树模型、'e1071' 包中的 svm、'kknn' 包中的 kknn、'adabag' 包中的 boosting 和 bagging)
看了这些模型的手册后,我尝试写模型执行的代码,但我真的不知道如何执行10倍CV。
其实我已经尝试过了,但我是 R 新手。 我真的需要 10-folds CV 的代码或功能的帮助。
这是我的代码:
w <- read.csv('D:/R code/animal2.csv',header = T)
names(w)
[1] "cluster_ward" "AAT0" "ARIDITY" "TOPO" "TMAX"
[6] "PREMAX" "PREMIN" "AMT" "SU_CODE90" "T_OC"
[11] "ELEMAX"
nrow(w)
[1] 370827
w$TOPO <- as.factor(w$TOPO)
w$SU_CODE90 <- as.factor(w$SU_CODE90)
library(rpart.plot)
fit1 <- rpart(cluster_ward ~., w)
pred1 <- predict(fit1, w, type="class")
library(e1071)
fit2 <-svm(cluster_ward~., data=w, kernal="sigmoid")
pred2 <- predict(a, w)
library(kknn)
set.seed(1000)
fit3 <- kknn(cluster_ward~., train=w, test=w)
pred3 <- fit3$fit
library(adabag)
set.seed(1000)
fit4 <- boosting(cluster_ward~., w)
pred4 <- predict(fit4,w)$class
library(adabag)
set.seed(1000)
fit5 <- bagging(cluster_ward~., w)
pred5 <- predict(fit5,w)$class
有人告诉我包'cvTools'或'caret'可以执行k-folds CV,但我仍然无法使用这些包或功能成功执行。
【问题讨论】:
【参考方案1】:我通常更喜欢自己实现 CV,因为它相对容易,并且让您可以控制可以使用的算法和评估指标。
k = 10 # Number of k-folds
id = sample(1:k,nrow(data),replace=TRUE)
list = 1:k
for (i in 1:k)
trainingset = subset(data, id %in% list[-i])
testset = subset(data, id %in% c(i))
# Training
fit.glm = glm(cluster_ward ~ ., data=trainingset)
# Testing
pred = predict(fit.glm, testset, type="response")
real = testset$cluster_ward
rmse = sqrt(sum((pred - real) ^ 2))/length(real)
【讨论】:
谢谢Mingot,你给了我很大的帮助,因为我不擅长编码。是时候学习它了。 @Mingot,我不认为 sample 可以保证给你相同大小的折叠,我认为这是交叉验证所必需的?引用***:“在 k 折交叉验证中,原始样本被随机划分为 k 个大小相等的子样本”。 对于大量的差异并不重要(请注意,如果示例数不是 k 的倍数,您将永远无法拥有相等的分区)。【参考方案2】:kahlo 给出的答案很好,但它没有给出相同大小的折叠。这里我介绍一下我的工作方法
k = 10 # For k-folds
data$class<-sample(1:nrow(data),nrow(data),replace=FALSE)
len.data <- length(data$class)
for(i in 1:k)
data$class[data$class <= i*len.data/k & data$class > (i-1)*len.data/k]<-i
list = 1:k
for (i in 1:k)
train.set = subset(data, class %in% list[-i])
test.set = subset(data, class %in% i))
## Train using train.test
## Test using test.set
【讨论】:
以上是关于模型比较的交叉验证的主要内容,如果未能解决你的问题,请参考以下文章