一、数据
从网页https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/regression/mg获取mg数据,该数据有1个因变量和6个自变量。
将数据复制进excel,选中第一列,数据->分列->分隔符号->空格,将数据进行分列。
将数据中的x:删去(可以使用替换功能)
最后在第一行加入变量名,另存为csv文件,即可以在R中正常载入。
二、思想
十折交叉验证的方法用于判断实验结果的可靠性。
其基本实现方法是:将所有数据划分为十份,依次选取一份数据作为测试集,其余九份做训练集,共建立十个模型,可分别得到10个标准化的均方误差(NMSE),求出10次平均的NMSE。
对于训练集来说,其NMSE=1-R²,对于测试机来说,NMSE与回归得到的R²没有太大关系。交叉验证主要关心的是测试集的NMSE。
三、实现
rm(list=ls())
#setwd("") #设置路径
#随机选择Z折下标集的函数,n样本量,seed随机种子
CV=function(n,Z=10,seed=888){
z=rep(1:Z,ceiling(n/Z))[1:n]
set.seed(seed)
z=sample(z,n)
mm=list()
#mm[[i]]为第i个下标集
for (i in 1:Z) mm[[i]]=(1:n)[z==i];return(mm)
}
#数据导入
w=read.csv("mg.csv")
n=nrow(w);Z=10;mm=CV(n,Z);D=1
MSE=rep(0,Z) #建立一个向量储存结果
for(i in 1:Z){ #循环十次
m=mm[[i]];
M=mean((w[m,D]-mean(w[m,D]))^2)
a=lm(y~.,w[-m,]) #简单线性回归,[-m]为训练集下标集合
MSE[i]=mean((w[m,D]-predict(a,w[m,]))^2)/M #求测试集NMSE
}
mean(MSE)
也可以对数据集进行更多的划分,改变Z值
Netceor 发布了75 篇原创文章 · 获赞 7 · 访问量 1万+ 私信 关注