《写给程序员的数据挖掘实践指南》——5.2. 10折交叉验证的例子

5.2. 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%的数据来训练分类器。

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

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

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

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

留一法的另一个缺点与分层采样(stratification)有关。

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

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

时间: 2024-08-31 01:58:01

《写给程序员的数据挖掘实践指南》——5.2. 10折交叉验证的例子的相关文章

《写给程序员的数据挖掘实践指南》——第5章 分类的进一步探讨—算法评估及kNN

第5章 分类的进一步探讨-算法评估及kNN 写给程序员的数据挖掘实践指南 回到上一章中关于运动员的例子.在那个例子中我们构建了一个分类器,输入为运动员的身高.体重,输出为其从事的体育项目-体操.田径或篮球. 因此,左图的Marissa Coleman身高6英尺1英寸,体重160磅.我们的分类器能够将她正确判断为篮球运动员: >>> cl = Classifier('athletesTrainingSet.txt') >>> cl.classify([73, 160])

《写给程序员的数据挖掘实践指南》——1.4本书体例

1.4本书体例 本书秉承践行学习法.我建议大家用书中提供的Python代码来进行习题练习和实验,而不是被动地阅读本书.多多实验.深入代码并在多个不同数据集上尝试本书中的方法是真正理解技术的关键. 我努力做到如下两个方面之间的平衡:一方面,我详细介绍实用的数据挖掘Python代码以便读者可以使用并对其进行修改:另一方面,读者也能了解背后的数据挖掘技术.为防止读者阅读理论.数学及Python代码时大脑的思维停滞,我加入插图和图片来刺激大脑的另一部分. Google研究院院长彼得·诺维德(Peter

《写给程序员的数据挖掘实践指南》导读

前言 写给程序员的数据挖掘实践指南 在你面前是一个学习基本的数据挖掘技术的工具.绝大多数数据挖掘教材关注数据挖掘的基础理论知识,因此众所周知给读者带来理解上的困难.当然,不要误解我的意思,那些书中的知识相当重要.但是,如果你是一名想学习一点数据挖掘知识的程序员,你可能会对入门者实用手册感兴趣.而这正是本书的宗旨所在. 本书内容采用"做中学"的思路来组织.我希望读者不是被动地阅读本书,而是通过课后习题和本书提供的Python代码进行实践.我也希望读者积极参与到数据挖掘技术的编程当中.本书

《写给程序员的数据挖掘实践指南》——第1章 数据挖掘简介及本书使用方法

第1章 数据挖掘简介及本书使用方法写给程序员的数据挖掘实践指南假想150年前一个美国小镇的生活情形:大家都互相认识:百货店某天进了一批布料,店员注意到这批布料中某个特定毛边的样式很可能会引起Clancey夫人的高度兴趣,因为他知道Clancey夫人喜欢亮花纹样:于是他在心里记着等Clancey夫人下次光顾时将该布料拿给她看看:Chow Winkler告诉酒吧老板Wilson先生,他考虑将多余的雷明顿(Renmington)1来福枪出售:Wilson先生将这则消息告诉Bud Barclay,因为他

《写给程序员的数据挖掘实践指南》——5.3混淆矩阵

5.3混淆矩阵 到目前为止,通过计算下列精确率百分比,我们对分类器进行评估: 有时,我们可能希望得到分类器算法的更详细的性能.能够详细揭示性能的一种可视化方法是引入一个称为混淆矩阵(confusion matrix)的表格.混淆矩阵的行代表测试样本的真实类别,而列代表分类器所预测出的类别. 它之所以名为混淆矩阵,是因为很容易通过这个矩阵看清楚算法产生混淆的地方.下面以女运动员分类为例来展示这个矩阵.假设我们有一个由100名女子体操运动员.100名WNBA篮球运动员及100名女子马拉松运动员的属性

《写给程序员的数据挖掘实践指南》——5.1训练集和测试集

5.1训练集和测试集 前一章的最后部分中,我们使用了3个不同的数据集:女子运动员数据集.Iris数据集以及汽车MPG数据集.我们把每个数据集分成两个子集,一个用于构建分类器,该数据集称为训练集(training set).另一个数据集用于评估分类器,该数据集称为测试集(test set).训练集和测试集是数据挖掘中的常用术语. 数据挖掘领域的人永远不会在用于训练系统的数据上进行测试!下面以近邻算法为例来解释为什么不能使用训练数据来测试.如果上述例子中的篮球运动员Marissa Coleman在训

《写给程序员的数据挖掘实践指南》——5.4一个编程的例子

5.4一个编程的例子 回到上一章当中提到的来自卡内基梅隆大学的汽车MPG数据集,该数据集的格式如下: 下面试图基于气缸的数目.排水量(立方英寸).功率.重量和加速时间预测汽车的MPG.我将所有392个实例放到mpgData.txt文件中,然后编写了如下的短Python程序,该程序利用分层采样方法将数据分到10个桶中(数据集及Python代码都可以从网站guidetodatamining.com下载). import random def buckets(filename, bucketName,

《写给程序员的数据挖掘实践指南》——1.3TB级挖掘是现实不是科幻

1.3TB级挖掘是现实不是科幻 20世纪末,100万词的数据集被认为很大.20世纪90年代我在读研究生时(是的,我有那么老)在Greek New Testament做了一年程序员.大约20万单词的分析就大到不能放在主机内存里而不得不把结果缓存在磁带上,因此必须要安装磁带机. Barbara Friberg依据该结果写成Analytical Greek New Testament一书并公开出版(可以从亚马逊网站上订购).我是当时在明尼苏达大学完成该项目的3名程序员之一. 现在在数T信息上进行数据挖

《写给程序员的数据挖掘实践指南》——5.6近邻算法的改进

5.6近邻算法的改进 一个普通的分类器的例子是Rote分类器,它只记忆所有的训练集,仅当实例与训练样本精确匹配时才对实例进行分类.如果只在训练集上进行评估,那么Rote分类器的精确率一直是100%.在实际中,由于有些待分类的实例不在训练集中出现,因此Rote分类器并不是一个好的选择.我们可以将前面介绍的近邻分类器看成是Rote分类器的一个扩展.与Rote分类器寻找精确匹配不同的是,近邻方法寻找近似的匹配.Pang Ning Tan.Michael Steinbach和Vipin Kumar在他们

《写给程序员的数据挖掘实践指南》——5.7一个新数据集及挑战

5.7一个新数据集及挑战 现在到考察一个新数据集的时候了,该数据集是美国国立糖尿病.消化和肾脏疾病研究所(United States National Institute of Diabetes and Digestive and Kidney Diseases,简称NIDDK)所开发的皮马印第安人糖尿病数据集(Pima Indians Diabetes Data Set). 令人吃惊的是,有超过30%的皮马人患有糖尿病.与此形成对照的是,美国糖尿病的患病率为8.3%,中国为4.2%. 数据集中