简单易懂的10折交叉法

10折交叉验证

我们构建一个分类器,输入为运动员的身高、体重,输出为其从事的体育项目-体操、田径或篮球。
一旦构建了分类器,我们就可能有兴趣回答类似下述的问题:
1. 该分类器的精确率怎么样?
2. 该分类器到底有多好?
3. 和其他分类器相比较,该分类器表现如何?
我们把每个数据集分成两个子集
    - 一个用于构建分类器,该数据集称为训练集(training set)
    - 另一个数据集用于评估分类器,该数据集称为测试集(test set)
    训练集和测试集是数据挖掘中的常用术语。

下面以近邻算法为例来解释为什么不能使用训练数据来测试。如果上述例子中的篮球运动员Marissa Coleman在训练数据中存在,那么身高6英尺1英寸体重160磅的她就会与自己最近。因此,如果对近邻算法进行评估时,若测试集是训练数据的子集,那么精确率总是接近于100%。更一般地,在评估任意数据挖掘算法时,如果测试集是训练数据的子集,那么结果就会十分乐观并且过度乐观。因此,这种做法看起来并不好。

那么我们将数据集分成两部分。较大的那部分用于训练,较小的那部分用于评估。事实表明这种做法也存在问题。在进行数据划分时可能会极端不走运。例如,所有测试集中的篮球运动员都比较矮(像Debbie Black的身高只有5英尺3英寸,体重只有124磅),他们会被分成马拉松运动员。而测试集中所有的田径运动员就像Tatyana Petrova(俄罗斯马拉松运动员,身高5英尺3英寸,体重108磅)一样较矮、体重较轻,可能会被分成体操运动员。如果测试集像上面一样,分类器的精确率会很差。另一方面,有时候测试集的选择又会十分幸运。测试集中的每个人都有所从事项目的标准身高和体重,此时分类器精确率接近100%。两种情况下,精确率都依赖于单个的测试集,并且该测试集可能并不能反映分类器应用于新数据的真实精确率。

上述问题的一种解决方法是重复多次上述过程并对结果求平均。例如,我们可以将数据分成两半:Part 1和Part 2。

 

我们可以使用Part 1的数据来训练分类器,而利用Part 2的数据对分类器进行测试。然后,我们重复上述过程,这次用Part 2训练而用Part 1测试。最后我们将两次的结果进行平均。但是,这种方法的问题在于我们每次只使用了一半数据进行训练。然而,我们可以通过增加划分的份数来解决这个问题。例如,我们可以将数据划分成3部分,每次利用2/3的数据训练而在其余1/3的数据上进行测试。因此,整个过程看起来如下:

第一次迭代 使用Part 1和Part 2训练,使用Part 3测试

第二次迭代 使用Part 1和Part 3训练,使用Part 2测试

第三次迭代 使用Part 2和Part 3训练,使用Part 1测试

对上述结果求平均。

在数据挖掘中,最常用的划分数目是10,这种方法称为……

10折交叉验证(10-fold Cross Validation)

使用这种方法,我们将数据集随机分成10份,使用其中9份进行训练而将另外1份用作测试。该过程可以重复10次,每次使用的测试数据不同。

10折交叉验证的例子

第1步,将数据等分到10个桶中。

我们会将50名篮球运动员和50名非篮球运动员分到每个桶中。每个桶当中放入了100人的信息。

第2步,下列步骤重复10次。

(1)每一次迭代中留存其中一个桶。第一次迭代中留存桶1,第二次留存桶2,其余依此类推。

(2)用其他9个桶的信息训练分类器(第一次迭代中利用从桶2到桶10的信息训练分类器)。

(3)利用留存的数据来测试分类器并保存测试结果。在上例中,这些结果可能如下:

35个篮球运动员被正确分类;

29个非篮球运动员被正确分类。

第3步,对上述结果汇总。

通常情况下我们会将结果放到与下表类似的表格中:

在所有500名篮球运动员中,有372人被正确分类。可能需要做的一件事是将右下角的数字也加上去,也就是说1000人当中有652(372+280)人被正确分类。因此得到的精确率为65.2%。与2折或3折交叉验证相比,基于10折交叉验证得到的结果可能更接近于分类器的真实性能。之所以这样,是因为每次采用90%而不是2折交叉验证中仅仅50%的数据来训练分类器。

 

有个问题
如果10折交叉验证之所以好只是因为采用了90%数据的话
那么为什么不用n折交叉验证?(n是数据集中样本的数目)

例如,如果数据集中包含1000个样本,我们可以在999个样本上训练分类器
然后在另外一个样本上测试分类器,这个过程可以重复1000次
利用这种最大可能的交叉验证次数,可能会得到更精确的分类器

 

1|0留一法(Leave-One-Out)

 

在机器学习领域,n折交叉验证(n是数据集中样本的数目)被称为留一法。我们已经提到,留一法的一个优点是每次迭代中都使用了最大可能数目的样本来训练。另一个优点是该方法具有确定性。

确定性的含义

假设Lucy集中花费了80个小时来编写一个新分类器的代码。现在是周五,她已经筋疲力尽,于是她请她的两个同事(Emily和Li)在周末对分类器进行评估。她将分类器和相同的数据集交给每个人,请她们做10折交叉验证。周一,她问两人的结果……

嗯,她们得到了不同的结果。她们俩可能是谁犯错了吗?未必如此。在10折交叉验证中,我们随机将数据分到桶中。由于随机因素的存在,有可能Emily和Li的数据划分结果并不完全一致。实际上,她们划分一致的可能性微乎其微。因此,她们在训练分类器时,所用的训练数据并不一致,而在测试时所用的数据也不完全一致。因此,她们得到不同的结果是很符合逻辑的。该结果与是否由两个不同的人进行评估毫无关系。即使Lucy自己进行两次10折交叉验证,她得到的结果也会有些不同。之所以不同的原因在于将数据划分到桶这个过程具有随机性。由于10折交叉验证不能保证每次得到相同的结果,因此它是一种非确定性的方法。与此相反,留一法是确定性的。每次应用留一法到同一分类器及同一数据上,得到的结果都一样。这是件好事!

1|1留一法的缺点

 

 留一法的主要不足在于计算的开销很大。
考虑一个包含1000个实例的中等规模的数据集,需要一分钟来训练分类器。
对于10折交叉验证来说,我们将花费10分钟用于训练。而对于留一法来说,训练时间需要16个小时。
如果数据集包含百万样本,那么花费在训练上的总时间将接近两年。我的天哪!
留一法的另一个缺点与分层采样(stratification)有关。

2|0分层采样(Stratification)

 

回到上一章的例子,即构建分类器来确定女运动员所从事的体育项目(篮球、体操或田径)。
当训练分类器时,我们希望训练数据能够具有代表性,并且包含所有3类的数据。
假设采用完全随机的方式将数据分配到训练集,则有可能训练集中不包含任何篮球运动员。
正因为如此,最终的分类器对篮球运动员分类时效果不佳。
或者,考虑构建一个100个运动员的数据集。
首先我们去WNBA的网站获得33个女子篮球运动员的信息,然后去维基百科网站获得33名参加2012年奥运会的女子体操运动员的信息,最后我们再次去维基百科网站获得34名参加奥运会田径项目的女运动员的信息。
因此,最终我们的数据如下所示:

下面开始做10折交叉验证。我们从上表的第一行开始,每10个人放入一个桶。
于是,第一个桶和第二个桶只有篮球运动员。第三个桶既有篮球运动员也有体操运动员。第四、第五个桶只包含体操运动员,其余桶的情况可以依此类推。
任何一个桶都不能代表整个数据集,你认为上述划分会导致有偏差的结果,这种想法是对的。
我们期望的方法是将实例按照其在整个数据集的相同比例分到各个桶中,即桶中的类别比例(篮球运动员、体操运动员、马拉松运动员)和整个数据集中的类别比例是一样的。
由于整个数据集的1/3是篮球运动员,因此每个桶中应该包含1/3的篮球运动员。同样,该桶中也应包含1/3的体操运动员和1/3的马拉松运动员。
上述做法称为分层采样,是一种好的方法。
留一法评估的问题在于测试集中只有一个样本,因此它肯定不是分层采样的结果。
总而言之,留一法可能适用于非常小的数据集,到目前为止10折交叉测试是最流行的选择。


 

__EOF__

作  者:Conan
出  处:https://www.cnblogs.com/BlameKidd/p/9735102.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

标签: 小知识点总结

好文要顶 关注我 收藏该文  

 

Conan_1996
关注 - 64
粉丝 - 91

+加关注

0

0

请先登录

« 上一篇:Frobenius norm(Frobenius 范数)
» 下一篇:百度网盘满速下载器:pandownload

posted @ 2018-10-01 17:31 Conan_1996 阅读(2658) 评论(0) 编辑 收藏

刷新评论刷新页面返回顶部

注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。

 

10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)

Copyright ©2019 Conan_1996 

【事实并非理所当然❤️世界总是欲盖弥彰】

【❤️ 认清了生活的真相后还依然热爱它 ❤️】

This blog has running : 290 d 13 h 32 m 57 sღゝ◡╹)ノ♡

- Theme Authors:菜花君° -

<think>嗯,用户之前问了关于用Postman测试同时包含文件和对象参数的接口,现在他们问的是机器学习中的交叉验证。我需要先理解他们为什么突然换到这个话题。可能他们正在学习后端开发,同时也在接触机器学习,或者是项目需要整合这两个方面。交叉验证是机器学习中的一个重要概念,尤其是在模型评估和选择阶段。 用户可能对交叉验证的基本概念和应用不太清楚,或者想了解如何正确使用它来提升模型性能。他们可能已经了解过一些基本的机器学习流程,但想深入理解如何避免过拟合,如何更准确地评估模型。需要解释清楚交叉验证的不同方,比如k交叉验证、留一等,以及它们的优缺点。 还要注意用户的技术水平,之前的Postman问题显示他们对工具使用有一定了解,但交叉验证可能属于更理论的部分,需要用通俗易懂的语言解释。可能需要举例说明,比如用k交叉验证的具体步骤,以及为什么它比简单的训练测试分割更可靠。 另外,用户可能想知道交叉验证在实际项目中的应用场景,比如在调参、模型选择中的作用,以及如何通过交叉验证来确保模型的泛化能力。同时,可能还要提到常见的错误,比如数据泄露问题,以及交叉验证如何帮助防止这种情况。 需要确保回答结构清晰,分点说明,便于用户理解。可能还要对比交叉验证与其他评估方的区别,强调其优势。最后,总结交叉验证的重要性,并给出应用建议,比如在数据量较少时的使用等。</think>在机器学习中,**交叉验证(Cross-Validation)** 是一种评估模型性能和泛化能力的关键技术,其核心思想是**重复利用数据**,通过多次划分训练集和验证集,减少因数据划分随机性导致的评估偏差。以下是交叉验证的详细介绍: --- ### **为什么需要交叉验证?** - **避免过拟合**:传统的训练集/测试集分割(如 80% 训练,20% 测试)可能因数据划分不同导致模型评估不稳定。 - **数据利用率低**:单次分割浪费部分数据(测试集仅用一次),尤其在小数据集上问题更明显。 - **超参数调优**:帮助更可靠地选择模型参数,防止参数在特定数据划分下“过拟合”。 --- ### **常见的交叉验证** #### 1. **K交叉验证(K-Fold Cross-Validation)** - **步骤**: 1. 将数据集随机均分为 **K 个子集**(K 通常取 5 或 10)。 2. 依次选择 1 个子集作为验证集,其余 K-1 个子集合并为训练集。 3. 重复训练和验证 K 次,最终取 **K 次评估结果的平均值**(如准确率、F1 分数等)。 - **优点**:平衡计算成本和评估稳定性。 - **缺点**:数据分布不均匀时,某些子集可能类别分布差异大。 ![K-Fold示意图](https://miro.medium.com/v2/resize:fit:1400/1*J2B_bcbd1-s1kpWOu_FZrg.png) --- #### 2. **留一交叉验证(Leave-One-Out, LOO)** - **原理**:K交叉验证的极端情况(K = 样本数 N),每次用 N-1 个样本训练,1 个样本验证。 - **优点**:充分利用数据,适合极小数据集。 - **缺点**:计算成本极高,尤其在大数据集上不实用。 --- #### 3. **分层交叉验证(Stratified K-Fold)** - **改进点**:在 K 基础上,**保持每个子集的类别分布与原数据集一致**。 - **适用场景**:分类任务中类别不平衡时(如正负样本比例 1:9)。 --- #### 4. **时间序列交叉验证(Time Series Split)** - **原理**:按时间顺序划分数据,避免未来信息泄露到过去。 - **适用场景**:时间序列预测(如股票价格、销量预测)。 --- ### **交叉验证的核心用途** 1. **模型评估**:更可靠地估计模型在未知数据上的表现。 2. **超参数调优**:结合网格搜索(Grid Search),选择最佳参数组合。 3. **模型选择**:对比不同算(如随机森林 vs SVM)的泛化能力。 --- ### **代码示例(Python)** 使用 `scikit-learn` 实现 5 交叉验证: ```python from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier # 假设已有数据 X 和标签 y model = RandomForestClassifier() scores = cross_val_score(model, X, y, cv=5, scoring="accuracy") print("5交叉验证准确率:", scores.mean()) ``` --- ### **注意事项** 1. **数据分布**:若数据存在明显分组(如不同用户群体),需使用分组交叉验证(`GroupKFold`)。 2. **数据泄露**:确保预处理(如归一化、缺失值填充)在每次训练集上独立进行,而非全局处理。 3. **计算效率**:K 值越大,评估越稳定,但计算时间越长。 --- ### **总结** 交叉验证是机器学习中验证模型稳定性和避免过拟合的基石技术。合理选择交叉验证(如 K、分层、时间序列等),能够显著提升模型在实际场景中的可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值