R 编程中的 LOOCV(留一法交叉验证)
LOOCV(Leave One Out Cross-Validation)是一种交叉验证方法,其中每个观察值被视为验证集,其余(N-1)个观察值被视为训练集。在 LOOCV 中,模型的拟合完成并使用一个观察验证集进行预测。此外,将每个观察结果重复 N 次作为验证集。模型已拟合,模型用于预测观察值。这是K 折交叉验证的一种特殊情况,其中折数与观察数相同(K = N)。这种方法有助于减少偏差和随机性。该方法旨在降低均方误差率并防止过拟合。在 R 编程中执行 LOOCV 非常容易。
数学表达式
LOOCV 涉及每个观察一次,即每个观察本身都扮演验证集的角色。 (N-1) 个观察值扮演训练集的角色。使用最小二乘线性,单个模型的性能成本与单个模型相同。在 LOOCV 中,在实现 LOOCV 方法的同时可以避免模型的重新拟合。 MSE(均方误差)是通过拟合完整数据集来计算的。
在上面的公式中, h i表示一个观察对其自身拟合的影响有多大,即在 0 和 1 之间惩罚残差,因为它除以一个小数。它使残差膨胀。
R中的实现
数据集:
Hedonic 是波士顿人口普查区价格的数据集。它包括犯罪率、25,000平方英尺住宅用地比例、平均房间数、1940年以前建造的业主单位比例等共15个方面。它预装了 R 中的Eclat包。
R
# Installing the package
install.packages("Ecdat")
# Loading package
library(Ecdat)
# Structure of dataset in package
str(Hedonic)
R
# 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.mse$delta
# 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
输出:
对数据集执行留一交叉验证(LOOCV):
通过使用数据集中的特征或变量训练模型,在数据集上使用 Leave One Out Cross Validation (LOOCV)。
R
# 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.mse$delta
# 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
输出:
- 模型年龄.glm:
age.glm 模型有 505 个自由度,零偏差为 400100,残差为 120200。AIC 为 4234。
- 均方误差:
第一个错误 250.2985 是训练集的均方误差 (MSE) ,第二个错误 250.2856 是留一个交叉验证 (LOOCV)。生成的输出数几乎相等。
- 不同型号的误差:
误差不断增加。这表明高阶多项式在一般情况下是无益的。
LOOCV的优势如下:
- 在训练集和验证集上使用一些观察结果没有随机性。在验证集方法中,每个观察都被考虑用于训练和验证,因此无论运行多少次,由于没有随机性,它的变异性较小。
- 它比验证集方法具有更少的偏差,因为训练集的大小为 n-1。在整个数据集上。结果,与验证集方法相比,测试错误的高估减少了。
LOOCV的缺点如下:
- 如果数据集很大,训练模型 N 次会导致昂贵的计算时间。