R语言 LOOCV(Leave One Out Cross-Validation)
LOOCV(Leave One Out Cross-Validation) 是一种交叉验证方法,其中每个观察值被视为验证集,其余(N-1)观察值被视为训练集。在LOOCV中,模型的拟合和预测是使用一个观察验证集完成的。此外,对每个观测值重复N次,作为验证集。模型被拟合,模型被用来预测一个观察值。这是 K-折交叉验证 的一个特例,其中折的数量与观察的数量相同(K=N)。这种方法有助于减少 偏差 和 随机性。 该方法旨在减少平均平方误差率并防止过度拟合。在R编程中执行LOOCV是非常容易的。
数学表达式
LOOCV涉及到每个观测值的一个折叠,即每个观测值本身就扮演着验证集的角色。(N-1)个观测值起着训练集的作用。在最小二乘法线性中,单个模型的性能成本与单个模型相同。在LOOCV中,在实现LOOCV方法时可以避免模型的重新拟合。 MSE(Mean squared error) 是通过对完整数据集的拟合来计算的。
在上述公式中,**h i **代表一个观测值对其自身拟合的影响程度,即在0和1之间,它惩罚了残差,因为它除以一个小数字。它使残差膨胀。
R语言 的实现
数据集
Hedonic是一个关于波士顿人口普查区价格的数据集。它包括犯罪率、25,000平方英尺的住宅地段的比例、平均房间数、1940年以前建造的业主单位的比例等共15个方面。它预装了R语言中的 Eclat 软件包。
# Installing the package
install.packages("Ecdat")
# Loading package
library(Ecdat)
# Structure of dataset in package
str(Hedonic)
输出
对数据集进行留一交叉验证(LOOCV)
通过使用数据集中的特征或变量训练模型,在数据集上使用留一交叉验证(LOOCV)。
# Installing Packages
install.packages("Ecdat")
install.packages("boot")
install.packages("dplyr")
install.packages("ggplot2")
install.packages("caret")
# Loading the packages
library(Ecdat)
library(boot)
library(dplyr)
library(ggplot2)
library(caret)
# Model Building
age.glm <- glm(age ~ mv + crim + zn + indus
+ chas + nox + rm + tax + dis
+ rad + ptratio + blacks + lstat,
data = Hedonic)
age.glm
# Mean Squared Error
cv.mse <- cv.glm(Hedonic, age.glm)
cv.msedelta
# Generating error of
# Different models
cv.mse = rep(0,5)
for (i in 1:5)
{
age.loocv <- glm(age ~ mv + poly(crim, i)
+ zn + indus + chas + nox
+ rm + poly(tax, i) + dis
+ rad + ptratio + blacks
+ lstat, data = Hedonic)
cv.mse[i] = cv.glm(Hedonic, age.loocv)delta[1]
}
cv.mse
输出
- 模型age.glm
age.glm模型有505个自由度,空值偏差为400100,残值偏差为120200。AIC为4234。
- 平均平方误差
第一个误差250.2985是训练集的 平均平方误差(MSE) ,第二个误差250.2856是留一交叉验证(LOOCV)。产生的输出数字几乎相等。
- 不同模型的误差
误差在不断增加。这说明高阶多项式在一般情况下是不利的。
LOOCV的优点如下
- 它没有将一些观测值用于训练与验证集的随机性。在验证集方法中,每个观测值都被考虑用于训练和验证,所以无论运行多少次都没有随机性,变异性较小。
- 由于训练集的大小为n-1,所以它的偏差比验证集方法小。在整个数据集上。因此,与验证集方法相比,对测试误差的高估减少了很多。
LOOCV的缺点如下
- 如果数据集很大,训练N次模型会导致昂贵的计算时间。