交叉验证(Cross Validation)

假设我们需要从某些候选模型中选择最适合某个学习问题的模型,我们该如何选择?以多元回归模型为例:,应该如何确定k的大小,使得该模型对解决相应的分类问题最为有效?如何在偏倚(bias)和方差(variance)之间寻求最佳的平衡点?更进一步,我们同样需要知道如何在加权回归模型中选择适当的波长参数,或者在基于范式的SVM模型中选择适当的参数C?

我们假设模型集合为有限集,我们的目的就是从这d个模型中,选择最有效的模型。

假设样本集为S,根据经验风险最小化原则(ERM),可能会使用这样的算法:

1.在S上训练每个模型,得到相应的假设函数

2.选择训练误差最小的假设函数,即为我们需要的函数。

然而,这样的算法实际上并不有效。以多元回归模型为例,指数越高,对样本集S的拟合就越准确,这样虽然保证了较低的训练误差,但是这种方法会使泛化误差变得很大,因此,这并不是一个好的方法。

简单交叉验证

下面介绍一种方法,称为简单交叉验证(simple cross validation)

随机将S分为(例如70%的样本)和(剩下30%的样本),这里称作简单交叉验证集;

1.在上训练每个模型,得到相应的假设函数

2.将每个假设函数通过交叉验证集进行验证,选择使得训练误差最小的

3.通过简单交叉验证,可以得到每个假设函数的真实的泛化误差,从而可以选择泛化误差最小的那个假设函数。

通常,预留1/4-1/3的样本作为交叉验证集,而剩下的作为训练集使用。

步骤3也可以替换成这样的操作:选择相应的模型,使得训练误差最小,然后在用对整个样本集S进行训练。使用这样的方法原因是有的学习算法对于初试的条件非常敏感,因此,他也许在上表现良好,但是在整个样本集中却存在很大的误差,因此需要再次带入整个样本集进行验证。

简单交叉验证的不足之处在于:此方法浪费了中的数据,即使我们将模型再次带入整个样本集,我们仍然只用了70%的样本建模。如果样本的采集非常的容易以致样本量非常之大,使用交叉验证方法没有什么问题;但如果样本非常稀缺,采集困难,那么我们就需要考虑一种能够充分利用样本的方法。

k-折交叉验证

k-折交叉验证将样本集随机划分为k份,k-1份作为训练集,1份作为验证集,依次轮换训练集和验证集k次,验证误差最小的模型为所求模型。具体方法如下:

1.随机将样本集S划分成k个不相交的子集,每个子集中样本数量为m/k个,这些子集分别记作

2.对于每个模型,进行如下操作:

for j=1 to k

作为训练集,训练模型,得到相应的假设函数

再将作为验证集,计算泛化误差

3.计算每个模型的平均泛化误差,选择泛化误差最小的模型

K-折交叉验证方法,每次留作验证的为总样本量的1/k(通常取k=10),因此每次用于训练的样本量相应增加了,
然而K-折交叉验证对于每个模型都需要运行k次,他的计算成本还是较高的。

还有一种k-折交叉验证的极端形式,当k=m时,即把样本集S划分为m个子集,其中的m-1个样本作为训练集,剩下1个样本作为验证集,如此循环m次,选取验证误差最小的模型。

以上介绍的各种交叉验证的方法,可用于模型的选择,但也可以针对单个算法和模型进行评价。

小结:交叉验证是一种模型选择方法,其将样本的一部分用于训练,另一部分用于验证。因此不仅考虑了训练误差,同时也考虑了泛化误差。从这里可以看出机器学习、数据挖掘与传统统计学的一个重要差别:传统统计学更注重理论,追求理论的完整性和模型的精确性,在对样本建立某个特定模型后,用理论去对模型进行各种验证;而机器学习/数据挖掘则注重经验,如交叉验证,就是通过不同模型在同一样本上的误差表现好坏,来选择适合这一样本的模型,而不去纠结理论上是否严谨。

时间: 2024-08-07 16:41:24

交叉验证(Cross Validation)的相关文章

交叉验证(Cross Validation)原理小结

交叉验证是在机器学习建立模型和验证模型参数时常用的办法.交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏.在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓"交叉". 那么什么时候才需要交叉验证呢?交叉验证用在数据不是很充足的时候.比如在我日常项目里面,对于普通适中问题,如果数据样本量小于一万条,我们就会采用交叉验证来训练优化选择模型.如果样本

R: Kriging interpolation and cross validation 克里金插值及交叉验证浅析

克里金插值的基本介绍可以参考ARCGIS的帮助文档[1]. 其本质就是根据已知点的数值,确定其周围点(预测点)的数值.最直观的方法就是找到已知点和预测点数值之间的关系,从而预测出预测点的数值.比如IDW插值方法,就是假设已知点和预测点的值跟它们相对距离成反比.克里金插值的精妙之处在于它不仅考虑了已知点和预测点的距离关系,还考虑了这些已知点之间的自相关关系. 如何衡量已知点之间的自相关关系呢?通常使用的就是半变异函数,其公式如下[1]: Semivariogram(distance h) = 0.

paper 35 :交叉验证(CrossValidation)方法思想

交叉验证(CrossValidation)方法思想简介 以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标.常见CV的方法如下: 1).Hold-Out Method 将原始数据随机分

cross validation交叉验证

交叉验证是一种检测model是否overfit的方法.最常用的cross validation是k-fold cross validation. 具体的方法是: 1.将数据平均分成k份,0,1,2,,,k-1 2.使用1~k-1份数据训练模型,然后使用第0份数据进行验证. 3.然后将第1份数据作为验证数据.进行k个循环.就完成了k-fold cross validation 这个交叉验证的方法的特点是:所有的数据都参与了验证,也都参与了训练,没有浪费数据.

交叉验证的缺陷及改进(Cross Validation done wrong)

本文主要是对我们使用交叉验证可能出现的一个问题进行讨论,并提出修正方案. 本文地址:http://blog.csdn.net/shanglianlm/article/details/47207173 交叉验证(Cross validation)在统计学习中是用来估计你设计的算法精确度的一个极其重要的工具.本文主要展示我们在使用交叉验证时可能出现的一个问题,并提出修正的方法. 下面主要使用 Python scikit-learn 框架做演示. 先验理论(Theory first) 交叉验证将数据集

用交叉验证改善模型的预测表现

预测模型为何无法保持稳定? 让我们通过以下几幅图来理解这个问题: 此处我们试图找到尺寸(size)和价格(price)的关系.三个模型各自做了如下工作: 第一个模型使用了线性等式.对于训练用的数据点,此模型有很大误差.这样的模型在初期排行榜和最终排行榜都会表现不好.这是"拟合不足"("Under fitting")的一个例子.此模型不足以发掘数据背后的趋势. 第二个模型发现了价格和尺寸的正确关系,此模型误差低/概括程度高. 第三个模型对于训练数据几乎是零误差.这是因

机器学习 libsvm交叉验证与网格搜索(参数选择)

首先说交叉验证. 交叉验证(Cross validation)是一种评估统计分析.机器学习算法对独立于训练数据的数据集的泛化能力(generalize), 能够避免过拟合问题. 交叉验证一般要尽量满足: 1)训练集的比例要足够多,一般大于一半 2)训练集和测试集要均匀抽样 交叉验证主要分成以下几类: 1)Double cross-validation Double cross-validation也称2-fold cross-validation(2-CV),作法是将数据集分成两个相等大小的子集

『cs231n』作业1问题1选讲_通过代码理解K近邻算法&交叉验证选择超参数参数

通过K近邻算法探究numpy向量运算提速 茴香豆的"茴"字有... ... 使用三种计算图片距离的方式实现K近邻算法: 1.最为基础的双循环 2.利用numpy的broadca机制实现单循环 3.利用broadcast和矩阵的数学性质实现无循环 图片被拉伸为一维数组 X_train:(train_num, 一维数组) X:(test_num, 一维数组) 方法验证 import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3]]) b

(数据挖掘-入门-6)十折交叉验证和K近邻

主要内容: 1.十折交叉验证 2.混淆矩阵 3.K近邻 4.python实现 一.十折交叉验证 前面提到了数据集分为训练集和测试集,训练集用来训练模型,而测试集用来测试模型的好坏,那么单一的测试是否就能很好的衡量一个模型的性能呢? 答案自然是否定的,单一的测试集具有偶然性和随机性.因此本文介绍一种衡量模型(比如分类器)性能的方法——十折交叉验证(10-fold cross validation) 什么是十折交叉验证? 假设有个数据集,需要建立一个分类器,如何验证分类器的性能呢? 将数据集随机均为