如何在 r 中交叉验证模型性能


在统计学中,我们经常构建模型有两个原因:

  • 了解一个或多个预测变量与响应变量之间的关系
  • 使用模型来预测未来的观察结果。

交叉验证对于估计模型预测未来观察结果的能力非常有用。

例如,我们可以构建一个多元线性回归模型,使用年龄收入作为预测变量,默认状态作为响应变量。在这种情况下,我们可能希望将模型拟合到数据集,然后使用该模型根据新申请人的收入和年龄来预测他们拖欠贷款的可能性。

为了确定模型是否具有很强的预测能力,我们需要用它来对它以前从未见过的数据进行预测。这将使我们能够估计模型的预测误差

使用交叉验证来估计预测误差

交叉验证是指我们估计预测误差的不同方法。交叉验证的一般方法是:

1.在数据集中留出一定数量的观测值——通常占所有观测值的 15-25%。
2.根据我们在数据集中保存的观察结果拟合(或“训练”)模型。
3.测试模型对我们未用于训练模型的观察结果进行预测的能力。

衡量模型的质量

当我们使用拟合模型对新观测值进行预测时,我们可以使用几种不同的指标来衡量模型的质量,包括:

多重 R 平方:衡量预测变量和响应变量之间线性关系的强度。 R 平方倍数为 1 表示完美线性关系,而R 平方倍数为 0 表示没有线性关系。 R 平方倍数越高,预测变量预测响应变量的可能性就越大。

均方根误差 (RMSE):测量模型在预测新观测值时产生的平均预测误差。这是观测值的真实值与模型预测值之间的平均距离。 RMSE越低表明模型拟合越好。

平均绝对误差 (MAE):这是观测值的真实值与模型预测值之间的平均绝对差。该指标通常对异常值的敏感度低于 RMSE。 MAE 值越低表示模型拟合越好。

在 R 中实现四种不同的交叉验证技术

然后我们将解释如何在 R 中实现以下交叉验证技术:

1.验证集方法
2. k折交叉验证
3.抛开交叉验证
4.重复k折交叉验证

为了说明如何使用这些不同的技术,我们将使用mtcars内置 R 数据集的子集:

 #define dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#view first six rows of new data
head(data)

# mpg disp hp drat
#Mazda RX4 21.0 160 110 3.90
#Mazda RX4 Wag 21.0 160 110 3.90
#Datsun 710 22.8 108 93 3.85
#Hornet 4 Drive 21.4 258 110 3.08
#Hornet Sportabout 18.7 360 175 3.15
#Valiant 18.1 225 105 2.76

我们将使用 disp 、 hp 和 drat 作为预测变量,并使用 mpg作为响应变量来构建多元线性回归模型

验证集方法

验证集方法的工作原理如下:

1.将数据分为两组:一组用于训练模型(即估计模型参数) ,另一组用于测试模型。一般情况下,随机选择70-80%的数据生成训练集,剩下的20-30%的数据作为测试集。

2.使用训练数据集创建模型。
3.使用模型对测试集数据进行预测。
4.使用 R 平方、RMSE 和 MAE 等指标衡量模型质量。

例子:

以下示例使用我们上面定义的数据集。首先,我们将数据分为
一个训练集和一个测试集,使用80%的数据作为训练集,剩余20%的数据作为测试集。接下来,我们使用训练集构建模型。然后我们使用该模型对测试集进行预测。最后,我们使用 R 平方、RMSE 和 MAE 来衡量模型的质量

 #load dplyr library used for data manipulation
library(dplyr)

#load caret library used for partitioning data into training and test set
library(caret)

#make this example reproducible
set.seed(0)

#define the dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#split the dataset into a training set (80%) and test set (20%).
training_obs <- data$mpg %>% createDataPartition(p = 0.8, list = FALSE)

train <- data[training_obs, ]
test <- data[-training_obs, ]

# Build the linear regression model on the training set
model <- lm(mpg ~ ., data = train)

# Use the model to make predictions on the test set
predictions <- model %>% predict(test)

#Examine R-squared, RMSE, and MAE of predictions
data.frame(R_squared = R2(predictions, test$mpg),
           RMSE = RMSE(predictions, test$mpg),
           MAE = MAE(predictions, test$mpg))

#R_squared RMSE MAE
#1 0.9213066 1.876038 1.66614

比较不同的模型时,在测试集上产生最低 RMSE 的模型是首选模型。

这种方法的优点和缺点

验证集方法的优点是简单且计算效率高。缺点是该模型仅使用全部数据的一部分来构建。如果我们从训练集中遗漏的数据包含有趣或有价值的信息,则模型将不会考虑它。

k折交叉验证方法

k 折交叉验证方法的工作原理如下:

1.将数据随机分为 k 个“折叠”或子集(例如 5 或 10 个子集)。
2.在所有数据上训练模型,仅保留一个子集。
3.使用模型对遗漏子集中的数据进行预测。
4.重复此过程,直到 k 个子集中的每一个都已用作测试集。
5 .通过平均 k 个测试误差来衡量模型的质量。这是已知的
作为交叉验证错误。

例子

在这个例子中,我们首先将数据分为5 个子集。然后,我们使用除数据子集之外的所有数据来拟合模型。然后我们使用该模型对遗漏的子集进行预测并记录测试误差(使用 R 平方、RMSE 和 MAE)。我们重复这个过程,直到每个子集都被用作测试集。然后我们简单计算5次测试误差的平均值

 #load dplyr library used for data manipulation
library(dplyr)

#load caret library used for partitioning data into training and test set
library(caret)

#make this example reproducible
set.seed(0)

#define the dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#define the number of subsets (or "folds") to use
train_control <- trainControl(method = "cv", number = 5)

#train the model
model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control)

#Summarize the results
print(model)

#Linear Regression 
#
#32 samples
#3 predictor
#
#No pre-processing
#Resampling: Cross-Validated (5 fold) 
#Summary of sample sizes: 26, 25, 26, 25, 26 
#Resampling results:
#
# RMSE Rsquared MAE     
#3.095501 0.7661981 2.467427
#
#Tuning parameter 'intercept' was held constant at a value of TRUE

这种方法的优点和缺点

k 折交叉验证方法相对于验证集方法的优点在于,它每次使用不同的数据来多次构建模型,因此我们在构建模型时不必有机会遗漏重要数据

该方法的主观部分是选择 k 的值,即将数据划分为子集的数量一般来说,较低的 k 值导致较高的偏差但较低的变异性,而较高的 k 值导致较低的偏差但较高的变异性。

在实践中,k通常选择等于5或10,因为这个数量的子集往往会同时避免太多的偏差和太多的可变性。

留一交叉验证 (LOOCV) 方法

LOOCV 方法的工作原理如下:

1.使用数据集中除一个观测值之外的所有观测值构建模型。
2.使用模型预测缺失观测值的值。记录测试该预测的误差。
3.对数据集中的每个观测值重复此过程。
4.通过对所有预测误差求平均值来衡量模型的质量。

例子

以下示例演示了如何对前面示例中使用的同一数据集使用执行 LOOCV:

 #load dplyr library used for data manipulation
library(dplyr)

#load caret library used for partitioning data into training and test set
library(caret)

#make this example reproducible
set.seed(0)

#define the dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#specify that we want to use LOOCV
train_control <- trainControl( method = "LOOCV" )

#train the model
model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control)

#summarize the results
print(model)

#Linear Regression 
#
#32 samples
#3 predictor
#
#No pre-processing
#Resampling: Leave-One-Out Cross-Validation 
#Summary of sample sizes: 31, 31, 31, 31, 31, 31, ... 
#Resampling results:
#
# RMSE Rsquared MAE     
#3.168763 0.7170704 2.503544
#
#Tuning parameter 'intercept' was held constant at a value of TRUE

这种方法的优点和缺点

LOOCV 的优点是我们使用所有数据点,这通常会减少潜在的偏差。然而,由于我们使用模型来预测每个观测值,这可能会导致预测误差出现更大的变异性。

这种方法的另一个缺点是它必须适合大量模型,从而导致效率低下且计算量大。

重复k次交叉验证方法

我们可以通过简单地执行多次k 折交叉验证来执行重复的 k折交叉验证。最终的误差是重复次数的平均误差

以下示例执行 5 倍交叉验证,重复 4 次:

 #load dplyr library used for data manipulation
library(dplyr)

#load caret library used for partitioning data into training and test set
library(caret)

#make this example reproducible
set.seed(0)

#define the dataset
data <- mtcars[, c("mpg", "disp", "hp", "drat")]

#define the number of subsets to use and number of times to repeat k-fold CV
train_control <- trainControl(method = "repeatedcv", number = 5, repeats = 4 )

#train the model
model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control)

#summarize the results
print(model)

#Linear Regression 
#
#32 samples
#3 predictor
#
#No pre-processing
#Resampling: Cross-Validated (5 fold, repeated 4 times) 
#Summary of sample sizes: 26, 25, 26, 25, 26, 25, ... 
#Resampling results:
#
# RMSE Rsquared MAE     
#3.176339 0.7909337 2.559131
#
#Tuning parameter 'intercept' was held constant at a value of TRUE

这种方法的优点和缺点

重复 k 倍交叉验证方法的优点是,对于每次重复,数据将被分成略有不同的子集,这应该给出模型预测误差的更加公正的估计。这种方法的缺点是计算量很大,因为我们必须多次重复模型拟合过程。

交叉验证中如何选择折叠数

交叉验证最主观的部分是决定使用多少折叠(即子集)。一般来说,折叠次数越少,误差估计的偏差就越大,但变量也就越小。相反,折叠次数越多,误差估计的偏差越小,但变量也越大。

记住计算时间也很重要。对于每次折叠,您都需要训练一个新的模式,虽然这是一个缓慢的过程,但如果您选择大量折叠,则可能需要很长时间。

在实践中,交叉验证通常进行 5 或 10 倍,因为这可以在变异性和偏差之间提供良好的平衡,同时计算效率也很高。

进行交叉验证后如何选择模型

交叉验证用于评估模型的预测误差。这可以通过突出显示哪个模型具有最低的预测误差(基于 RMSE、R 平方等)来帮助我们在两个或多个不同模型之间进行选择。

一旦我们使用交叉验证来选择最佳模型,我们就会使用所有可用数据来拟合所选模型。我们不使用在最终模型的交叉验证过程中训练的实际模型实例。

例如,我们可以使用 5 折交叉验证来确定在两个不同的回归模型之间使用哪个模型更好。然而,一旦我们确定了最好使用哪个模型,我们就会使用所有数据来拟合最终模型。换句话说,在构建最终模型时我们不会忘记任何折叠。

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注