从k折到自助法:常用交叉验证方法的优缺点

简介: 为了评估和改进机器学习(ML)算法的可靠性和泛化能力,交叉验证已被广泛采用[1]。交叉验证是一种在有限数据集上评估和比较不同模型性能的方法,其通过分割数据集为训练集和测试集以验证模型的性能。通过使用交叉验证,研究人员可以避免对单一实验的依赖,因此可以更好地评估模型的泛化能力。

一、引言



为了评估和改进机器学习(ML)算法的可靠性和泛化能力,交叉验证已被广泛采用[1]。交叉验证是一种在有限数据集上评估和比较不同模型性能的方法,其通过分割数据集为训练集和测试集以验证模型的性能。通过使用交叉验证,研究人员可以避免对单一实验的依赖,因此可以更好地评估模型的泛化能力。


然而,交叉验证不是单一的准则,而是一系列不同的技术和方法的集合。其中,k折交叉验证、留一交叉验证和自助法交叉验证是最常见的三种方法。此外,重复k折交叉验证和流式交叉验证也被广泛应用于某些特定的领域和问题。虽然这些交叉验证方法都可以帮助我们评估模型性能,但它们的优缺点和适用场景却有所不同。因此,选择适当的交叉验证方法对于得到可靠的模型评估结果和良好的泛化性能非常重要。


本文将深入分析这些交叉验证方法的细节、优点和缺点,并在一个房价预测案例中进行比较实验以展示这些方法的效果。通过对比各种方法的性能和适用场景,本文旨在提供一个指南,帮助研究人员选择正确的交叉验证方法,以提高模型的泛化能力和预测性能。


二、k折交叉验证



2.1 描述和原理


k折交叉验证(k-fold cross validation)是一个常用的机器学习算法模型评估方法,是将数据集分成k个大小相同的互斥子集,每个子集都作为验证数据集来验证模型,其他k-1个子集作为训练数据集来训练模型。


具体步骤如下:

  1. 将原始数据集平均分成k份
  2. 针对每一份数据,以其它k-1份数据作为训练集,剩下的一份数据作为验证集,即k次训练和验证
  3. 将k次的评估指标平均作为最后一次模型评估的结果


2.2 代码示例


# 引入数据集
data(mtcars)
# 导入所需的包
library(caret)
library(randomForest)
# 设置参数和训练集、测试集分割
set.seed(123)
k <- 5
train.index <- createDataPartition(mtcars$mpg, p = .8, list = FALSE)
train <- mtcars[train.index, ]
test <- mtcars[-train.index, ]
# k-fold 交叉验证
fit.control <- trainControl(method = "cv", number = k)
fit.rf <- train(mpg ~ ., data = train, method = "rf", trControl = fit.control)
print(fit.rf$results)
# 使用测试集测试模型性能
test.pred <- predict(fit.rf, test, type = "response")
test.actual <- test$mpg
test.results <- cbind(actual = test.actual, predicted = test.pred)


2.3 优点和缺点


k折交叉验证的优点包括:

  1. 可以使用所有数据进行训练和验证。
  2. 可以减少模型方差。
  3. 验证结果往往比留出法更可靠。


k折交叉验证的缺点包括:

  1. 计算量较大,特别是在大数据集上。
  2. 对于某些数据集,某些数据子集可能在训练集和测试集中重复出现,而其他数据子集则可能完全缺失,这可能会影响模型评估指标。


2.4 适用场景和特点


  1. 在训练和验证模型时,数据集很少或没有留出部分用作测试集,或者在基准测试时,需要经常测试分类器的性能。
  2. 可以通过减少抽样误差来对单独估计得到的每个模型的性能进行统计显著性测试,并帮助选择一种得分较高的模型。 可用于比较不同算法的性能,以便帮助选择最佳模型。
  3. k折交叉验证被广泛应用于数据科学和机器学习中,例如用于回归,分类,聚类等任务。在LeCun等人的论文[2]中,就使用了k折交叉验证评估多层神经网络的性能。


三、留一交叉验证



3.1 描述和原理


留一交叉验证(Leave-One-Out Cross Validation,简称 LOOCV)是一种特殊的 k 折交叉验证,其中 k 等于数据集中样本数。它的流程是将原始数据集中的一个样本作为测试集,其他样本作为训练集,重复该过程直到每个样本都被用来作为测试集。LOOCV常见于小数据集的训练,以对模型进行有效的评估。具体步骤如下:


  1. 对于数据集中的每个样本 i,将其从数据集中剔除后,使用剩下的样本作为训练集,然后使用样本 i 作为测试集,记录评估指标;
  2. 重复上述步骤直到每个样本都作为测试集。


3.2 代码示例


# 引入相关包和数据集
library(caret)
library(randomForest)
data(mtcars)
# 对每个样本执行留一交叉验证
loo <- trainControl(method="LOOCV")
fit_RFmodel <- train(mpg ~.,data=mtcars,method="rf", trControl=loo)
# 输出留一馀差
print(paste("留一馀差为 ", round(fit_RFmodel$results[1],2)))


3.3 优点和缺点


与其他交叉验证方法相比,留一交叉验证真正考虑了每个样本的信息。由于它的测试集仅包括单个样本,因此可以获得更高的置信度和确定性。然而,由于需要训练和评估大量的模型,它的计算成本相当高昂。


3.4 适用场景和特点


LOOCV适合用于小规模数据集,每个样本都非常重要的情况下进行评估。它能够更稳定地评价模型的表现,但需要消耗较多的计算资源。因此,LOOCV通常用于需要高精度评估模型的领域,比如人脸识别、语音识别、手写数字识别等领域。


留一交叉验证的应用很广泛,可以用来评估各种不同类型的模型。例如,在Tang等人的论文[3]中,使用 LOOCV 评估了基于机器学习的地雷探测系统的性能。在García-Sellart等人的论文[4]中,他们也使用 LOOCV 来构建人步态识别模型。


四、自助法交叉验证



4.1 描述和原理


自助法交叉验证(Bootstrap Cross Validation)是一种数据重采样方法。首先,我们从原始样本数据集中有放回地抽取若干个样本形成新的数据集;然后使用新的数据集进行训练和测试,这个过程可以重复多次,最后计算评价指标的均值和方差。自助法交叉验证的原理是通过使用自主抽样的方法,能够有效地减小训练集和测试集之间的相关性,从而更准确地评估模型的性能。


具体步骤如下:

  1. 对于给定的数据集,随机从中有放回地抽取 n 个样本,组成训练集;
  2. 使用从训练集中随机抽取的 n 个样本进行模型训练;
  3. 使用剩下的 m - n 个样本作为测试集;
  4. 重复上述步骤 t 次,最后将 t 个结果组合起来,计算平均值和标准差。


4.2 代码示例


# 引入相关包和数据集
library(caret)
data(mtcars)
# 进行10次Bootstrap Cross Validation
set.seed(123)
cv_boot <- trainControl(method='boot', number=10, allowParallel=T)
fit_linear <- train(mpg ~ ., data=mtcars, method='lm', trControl=cv_boot)
# 输出结果
print(paste("平均RMSE: ", round(mean(fit_linear$results$RMSE), 2)))
print(paste("标准差: ", round(sd(fit_linear$results$RMSE), 2)))


4.3 优点和缺点


自助法交叉验证具有一个很大的优点是使用重复样本有放回采样的方式,可以使得得到的模型更为稳健。此外,自主抽样几乎可以抽出任何大小的样本,不受小样本数量限制。另外,它也可以处理因数据偏斜而导致的样本数量不均衡的问题。


缺点是自助法训练集和测试集在数据集中的样本数可达到给定数据集的样本数,这使得自助法交叉验证中的每个分类器都使用某些重复样本进行训练,数据集的相关性被高估,因此在某些情况下会导致模型过拟合,并降低其泛化能力。


4.4 适用场景和特点


自助法交叉验证适用于小样本数据集和大量新建特性数据的情况。它的弹性能力很强,可以处理现实数据收集过程中产生的噪声和错误。自助法交叉验证可以在不改变原始数据集的分布的情况下,利用数据多次重采样得到新的子集,从而可以更好地评估模型的表现。


在实际应用中,自助法交叉验证被广泛应用于机器学习、数据挖掘和模式识别等领域。例如,在Wang等人的论文[5]中,他们使用 Bootstrapped 交叉验证方法进行轴承故障诊断。Yu等人在论文[6]中也使用了自助法交叉验证来评估旋转机械故障诊断模型的性能。


五、重复 k 折交叉验证



5.1 描述和原理


重复 k 折交叉验证(Repeated k-Fold Cross Validation)是对 k 折交叉验证的一种扩展,它通过重复执行 k 折交叉验证 n 次,来更准确地评估模型的性能。重复 k 折交叉验证的方式是多次运行 k 折交叉验证,每次随机划分数据集,并将多个结果的平均值作为评估指标。其基本流程如下所示:


  1. 将原始数据集分成 k 个大小相等的子集;
  2. 选择一个子集作为测试集,其余部分作为训练集;
  3. 训练和测试模型;
  4. 重复上述步骤 k 次,每次选择不同的子集作为测试集;
  5. 重复上述步骤 n 次,并将所有结果组合起来,计算平均值和标准差。


5.2 代码示例


# 引入相关包和数据集
library(caret)
data(mtcars)
# 进行10次重复5折交叉验证
set.seed(123)
cv_repeat <- trainControl(method='repeatedcv', number=5, repeats=10)
fit_linear <- train(mpg ~ ., data=mtcars, method='lm', trControl=cv_repeat)
# 输出结果
print(paste("平均RMSE: ", round(mean(fit_linear$results$RMSE), 2)))
print(paste("标准差: ", round(sd(fit_linear$results$RMSE), 2)))


5.3 优点和缺点


与标准 k 折交叉验证相比,重复 k 折交叉验证能够获得更加稳定和可靠的模型评估,减少随机因素对模型评估结果的影响。通过多次对数据集的划分,可以更充分地评估模型的泛化能力和鲁棒性。


然而,重复 k 折交叉验证需要执行多次 k 折交叉验证,计算成本较高。在数据集较大的情况下,可能会消耗大量的计算资源。此外,如果模型本身过于简单或者复杂,可能会导致在重复 k 折交叉验证中出现欠拟合或过拟合的情况。


5.4 适用场景和特点


重复 k 折交叉验证适用于对模型性能进行严格评估和比较的场景。它不仅能够帮助我们充分评估模型的表现,还能够帮助我们对不同模型进行比较选择。重复 k 折交叉验证通常用于中小型数据集的模型选择和评估,以及对算法的探索研究中。


在实际应用中,重复 k 折交叉验证被广泛应用于机器学习、数据挖掘和模式识别等领域。例如,在Hao等人的论文[7],他们使用了重复 k 折交叉验证来评估不同机器学习方法在电力变压器故障诊断方面的应用效果。


六、流式交叉验证



6.1 描述和原理


流式交叉验证(Streamline Cross Validation)是一种用于处理连续数据的交叉验证方法。流式交叉验证通常用于处理数据流,并在学习过程中动态地改变数据分布。


在流式交叉验证中,我们首先划分数据集为训练集和测试集。然后,我们将训练数据集分为 n 个等长的连续子集,每次使用一个子集作为测试集,其他子集作为训练集。与 k-Fold 交叉验证不同的是,每个样本只用一次且按照时间顺序使用。该过程会重复执行直到所有的数据子集都被用于训练和测试,得出所有结果的平均值作为最终的评估指标。


6.2 代码示例


# 引入相关包和数据集
library(caret)
data(mtcars)
# 进行流式交叉验证
set.seed(123)
cv_stream <- trainControl(method='timeslice', initialWindow=10, horizon=1, fixedWindow=TRUE)
fit_linear <- train(mpg ~ ., data=mtcars, method='lm', trControl=cv_stream)
# 输出结果
print(paste("平均RMSE: ", round(mean(fit_linear$results$RMSE), 2)))
print(paste("标准差: ", round(sd(fit_linear$results$RMSE), 2)))


6.3 优点和缺点


与其他传统的交叉验证方法相比,流式交叉验证具有以下优点:


  1. 能够更好地模拟真实数据流环境,充分考虑了时间分布的特殊性;
  2. 在处理数据流时,实时评估模型的性能,从而达到动态调整学习器的效果;
  3. 流式交叉验证能够避免对数据的重复使用,增加模型的准确度和稳定性。


不过,流式交叉验证也存在以下缺点:


  1. 流式交叉验证要求数据集必须满足时序特性,对于非时序数据无法应用;
  2. 流式交叉验证可能受到数据流中的噪声、缺失、离群值等因素的影响,导致模型偏差和方差的增加;
  3. 流式交叉验证需要随着数据的流式到达而不断更新模型,如果数据流量过大,可能会导致计算成本较高。


6.4 适用场景和特点


流式交叉验证适用于数据流的情况,尤其是网络数据挖掘和预测等领域。流式交叉验证通常用于在线学习和增量学习,可以动态地检测和更新模型。此外,流式交叉验证也常用于面向实时数据的任务,例如股票预测和交通流量预测等。


在实际应用中,流式交叉验证被广泛应用于机器学习、数据挖掘和模式识别等领域。例如,Pei等人在论文[8]中提出了一些概率建模方法,并使用流式交叉验证进行模型性能评估。另一方面,Yao等人在[9]中介绍了几种在线学习方法,并使用流式交叉验证来评估在线学习模型的效果。


七、结论



在实际应用中使用交叉验证,需要根据数据集的具体情况和实验目的进行选择和比较,并结合其他评价指标来评估模型的性能。而在选择交叉验证方法的时,需要综合多方面考虑,包括数据集大小、性能评估指标、模型选择等因素。


参考文献:



[1] Bias in error estimation when using cross-validation for model selection.

[2] Efficient backprop. In Neural networks, Tricks of the trade (pp. 9-50). Springer, Berlin, Heidelberg.

[3] Reliable and sensitive detection of unexploded ordnance in complex environments

[4] Transfer Learning for Cross-Dataset Gait Recognition: A comprehensive evaluation

[5] A comparative study of convolutional neural network based fault diagnosis for roller bearings

[6] A comprehensive survey of computational intelligence techniques in fault diagnosis of rotating machinery

[7] Application of Machine Learning Methods for Fault Diagnosis of Power Transformer

[8] Stream data mining: A survey on probabilistic modeling

[9] A Review of Online Learning in Statistical Machine Translation

目录
相关文章
|
6月前
|
机器学习/深度学习 数据可视化 算法
机器学习中的分类问题:如何选择和理解性能衡量标准
机器学习中的分类问题:如何选择和理解性能衡量标准
机器学习中的分类问题:如何选择和理解性能衡量标准
|
6月前
|
机器学习/深度学习 算法
低门槛实战线性回归模型
本文是学习线性回归模型的总结,以图文相结合的方式,分享线性回归模型的技术原理,以及用代码实现验证,供大家参考。
98 0
|
5月前
|
机器学习/深度学习 数据采集 前端开发
深入探讨模型泛化能力的概念、重要性以及如何通过交叉验证来有效评估和提升模型的泛化能力
【6月更文挑战第13天】本文探讨了机器学习中模型泛化能力的重要性,它是模型对未知数据预测的准确性。过拟合和欠拟合影响泛化能力,而交叉验证是评估模型性能的有效工具。通过K折交叉验证等方法,可以发现并优化模型,提高泛化能力。建议包括调整模型参数、选择合适模型、数据预处理、特征选择和集成学习。Python中可利用scikit-learn的cross_val_score函数进行交叉验证。
481 7
构建一个分类模型,如何选择合适的损失函数和评估指标
构建一个分类模型,如何选择合适的损失函数和评估指标
|
4月前
精简模型,提升效能:线性回归中的特征选择技巧
在本文中,我们将探讨各种特征选择方法和技术,用以在保持模型评分可接受的情况下减少特征数量。通过减少噪声和冗余信息,模型可以更快地处理,并减少复杂性。
53 5
精简模型,提升效能:线性回归中的特征选择技巧
|
3月前
|
SQL 自然语言处理
评估数据集CGoDial问题之TKK框架提升模型泛化能力的问题如何解决
评估数据集CGoDial问题之TKK框架提升模型泛化能力的问题如何解决
|
4月前
|
人工智能 算法 调度
优化问题之如何选择合适的优化求解器
优化问题之如何选择合适的优化求解器
|
6月前
|
算法
KNN算法及其优缺点
KNN算法及其优缺点
257 0
|
6月前
|
机器学习/深度学习 人工智能 测试技术
【机器学习】R-squared系数有什么缺点?如何解决?
【5月更文挑战第20天】【机器学习】R-squared系数有什么缺点?如何解决?
|
6月前
|
机器学习/深度学习 分布式计算 算法
大模型开发:你如何确定使用哪种机器学习算法?
在大型机器学习模型开发中,选择算法是关键。首先,明确问题类型(如回归、分类、聚类等)。其次,考虑数据规模、特征数量和类型、分布和结构,以判断适合的算法。再者,评估性能要求(准确性、速度、可解释性)和资源限制(计算资源、内存)。同时,利用领域知识和正则化来选择模型。最后,通过实验验证和模型比较进行优化。此过程涉及迭代和业务需求的技术权衡。
106 2