📜  R 编程中的 LOOCV(留一法交叉验证)

📅  最后修改于: 2022-05-13 01:55:11.603000             🧑  作者: Mango

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。

  • 均方误差:

MSE

第一个错误 250.2985 是训练集的均方误差 (MSE) ,第二个错误 250.2856 是留一个交叉验证 (LOOCV)。生成的输出数几乎相等。

  • 不同型号的误差:

不同型号的误差

误差不断增加。这表明高阶多项式在一般情况下是无益的。

LOOCV的优势如下:

  • 在训练集和验证集上使用一些观察结果没有随机性。在验证集方法中,每个观察都被考虑用于训练和验证,因此无论运行多少次,由于没有随机性,它的变异性较小。
  • 它比验证集方法具有更少的偏差,因为训练集的大小为 n-1。在整个数据集上。结果,与验证集方法相比,测试错误的高估减少了。

LOOCV的缺点如下:

  • 如果数据集很大,训练模型 N 次会导致昂贵的计算时间。