ESL-chapter7-交叉验证

本章有两个重要的内容,一个是交叉验证,一个是bootsrtap。本文主要介绍交叉验证。

交叉验证的基本思想见书。直接来看7.10.2节。错误的使用交叉验证。

该节的内容代码如下:

CV.sample.x<- matrix(rnorm(50*5000),50,5000)#生成样本集
CV.sample.y <- c(rep(0,25),rep(1,25))#生成类标签
CV.sample <- cbind(CV.sample.x,CV.sample.y)#生成类
CV.cor <- c()
for(i in 1:5000)#计算每个预测变量和类标签的相关度
    {
       CV.cor <- c(CV.cor,abs(cor(CV.sample.x[,i],CV.sample.y)))
    }
top.100 <- order(CV.cor, decreasing = TRUE)[1:100]#取出前一百个最相关的
library(class)
#然后用交叉验证的方法来预测错误率。fold=10, k=1
vknn = function(v,data,cl,k){
# 分割原始数据,先是水平划分,然后用采样的方法打乱顺序。
grps = cut(1:nrow(data),v,labels=FALSE)[sample(1:nrow(data))]
# 对每份数据分别运行KNN函数
pred = lapply(1:v,function(i,data,cl,k){
omit = which(grps == i)
pcl = knn(data[-omit,],data[omit,],cl[-omit],k=k)
},data,cl,k)
# 整合预测结果
wh = unlist(pred)
table(wh,cl[order(grps)])
}
vknn(10,CV.sample.x[,top.100],CV.sample.y,1)

结果证明,交叉验证的预测错误率非常低。fold=10时,错误率为0。fold=5时,约为2%。

修改一下代码。


#按照书上的方法,采用正确的方法来进行交叉验证。
CV.top.100 <-function(x,y)
    {
        CV.cor <- c()
        for(i in 1:5000)
        {
          CV.cor <- c(CV.cor,abs(cor(x[,i],y)))
        }
         top.100 <- order(CV.cor, decreasing = TRUE)[1:100]
        return(top.100)
    }
vknn.correct = function(v,data,cl,k){
# 分割原始数据,先是水平划分,然后用采样的方法打乱顺序。
grps = cut(1:nrow(data),v,labels=FALSE)[sample(1:nrow(data))]
# 对每份数据分别运行KNN函数
pred = lapply(1:v,function(i,data,cl,k){
omit = which(grps == i)
top.100 <- CV.top.100(data[-omit,],cl[-omit])#在训练集中找最相关的变量
pcl = knn(data[-omit,top.100],data[omit,top.100],cl[-omit],k=k)
},data,cl,k)
# 整合预测结果
wh = unlist(pred)
table(wh,cl[order(grps)])
}
vknn(5,CV.sample.x,CV.sample.y,1)

结果表明,预测错误率在50%左右,和真正的结果吻合。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值