【模型比较与选择】交叉验证方法原理及R语言代码实现
2017-12-16 17:04
561 查看
交叉验证是进行模型比较的一种有效方法。
它的基本原理如下(Kohavi,1995):
(1)把原始数据集分解成 r个大小近似相等的子数据集。
(2)把第一个子数据集作为验证数据集,把其余r-1个子数据集合并后用于估计模型参数。基于该模型的参数对验证数据集的因变量进行预测,并计算预测误差的平方和。
(3)把第二个、第三个......直至第r个子数据集分别作为验证数据集,并把其余的r-1个子数据集合并后用于估计模型参数。基于验证数据集计算因变量预测误差的平方和。
(4)计算前述r个预测误差平方和的平均值,平均值最小的模型为最优模型。
注意,最优模型选定以后,模型的最终参数需要基于全体数据重新估计。
交叉验证的一个特例是将每个观察值作为一个子数据集,然后使用该观察值之外的其他所有观察值估计模型参数,并计算预测误差的平方。
表达式如下:
附带R语言实现代码:以数据集state.x77为例(R语言自带,以下代码可直接运行)
#R平方的k重交叉验证
#library(bootstrap) #crossval函数实现k重交叉验证
shrinkage <- function(fit,k=10){
require(bootstrap)
theta.fit <- function(x,y){lsfit(x,y)}
theta.predict <- function(fit,x){cbind(1,x)%*%fit$coef}
x <- fit$model[,2:ncol(fit$model)]
y <- fit$model[,1]
results <- crossval(x,y,theta.fit,theta.predict,ngroup = k)
r2 <- cor(y,fit$fitted.values)^2
r2cv <- cor(y,results$cv.fit)^2
cat("Original R-square =",r2,"\n")
cat(k,"Fold Cross-Validated R-square =",r2cv,"\n")
cat("Change =",r2-r2cv,"\n")
}
#对数据states所有预测变量进行回归,然后用shrinkage()函数做10重验证
states <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
fit0 <- lm(Murder~Population+Illiteracy+Income+Frost,data=states)
shrinkage(fit0)
它的基本原理如下(Kohavi,1995):
(1)把原始数据集分解成 r个大小近似相等的子数据集。
(2)把第一个子数据集作为验证数据集,把其余r-1个子数据集合并后用于估计模型参数。基于该模型的参数对验证数据集的因变量进行预测,并计算预测误差的平方和。
(3)把第二个、第三个......直至第r个子数据集分别作为验证数据集,并把其余的r-1个子数据集合并后用于估计模型参数。基于验证数据集计算因变量预测误差的平方和。
(4)计算前述r个预测误差平方和的平均值,平均值最小的模型为最优模型。
注意,最优模型选定以后,模型的最终参数需要基于全体数据重新估计。
交叉验证的一个特例是将每个观察值作为一个子数据集,然后使用该观察值之外的其他所有观察值估计模型参数,并计算预测误差的平方。
表达式如下:
附带R语言实现代码:以数据集state.x77为例(R语言自带,以下代码可直接运行)
#R平方的k重交叉验证
#library(bootstrap) #crossval函数实现k重交叉验证
shrinkage <- function(fit,k=10){
require(bootstrap)
theta.fit <- function(x,y){lsfit(x,y)}
theta.predict <- function(fit,x){cbind(1,x)%*%fit$coef}
x <- fit$model[,2:ncol(fit$model)]
y <- fit$model[,1]
results <- crossval(x,y,theta.fit,theta.predict,ngroup = k)
r2 <- cor(y,fit$fitted.values)^2
r2cv <- cor(y,results$cv.fit)^2
cat("Original R-square =",r2,"\n")
cat(k,"Fold Cross-Validated R-square =",r2cv,"\n")
cat("Change =",r2-r2cv,"\n")
}
#对数据states所有预测变量进行回归,然后用shrinkage()函数做10重验证
states <- as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
fit0 <- lm(Murder~Population+Illiteracy+Income+Frost,data=states)
shrinkage(fit0)
相关文章推荐
- 机器学习:交叉验证和模型选择与Python代码实现
- 机器学习(6)-交叉验证代码实现原理和图像均值化预处理
- ViewPager系列之ViewPager无限循环滑动原理、代码、2种实现方法比较
- 用选择的方式对数组进行排序,并写出对应的优化后的代码实现。(重点写思路、原理)
- machine learning in coding(python):使用交叉验证【选择模型超参数】
- php实现验证码识别原理和程序代码实例
- 代码混淆的实现原理与方法
- HTTP使用BASIC认证的原理及实现方法(还有NTLM方法,比较复杂)
- - (void)setValue:(id)value forKey:(NSString *)key方法,实现原理与验证
- Python实现比较两个文件夹中代码变化的方法
- 机器学习算法 原理、实现与实战——模型评估与模型选择
- 四种比较简单的图像显著性区域特征提取方法原理及实现
- 【翻译】eXpressAppFramework QuickStart 业务模型设计(十)——在代码中实现数据验证
- 【scikit-learn】交叉验证及其用于参数选择、模型选择、特征选择的例子
- 以调整复决定系数和AIC为模型选择标准,建立前进法、后退法、逐步回归法的r语言代码
- 安全性“依赖客户端验证”的测试方法和代码实现
- 交叉验证--模型参数选择
- 编译原理(一) Chomsky文法的判断方法及C++代码实现
- 一个简易的8位计算器,可实现加减乘除,testbench写的较为简易,代码覆盖率有点低。方法比较笨,综合之后的频率不高。
- C++ Builder下三种UDP通信实现方法的比较 选择自 findheart 的 Blog