|
|
51CTO旗下网站
|
|
移动端

1.7 交叉验证

《大数据分析:数据挖掘必备算法示例详解》第1章数据分析绪论,本章主要介绍预备知识,即在进行数据分析前,读者需要了解的知识与背景。本节为大家介绍交叉验证。

作者:张重生来源:机械工业出版社|2017-12-13 17:25

1.7 交叉验证

在数据挖掘领域,训练分类模型时,通常将数据划分为训练数据和测试数据,考虑到上面的调参部分中提到的验证数据集,可以将整个数据划分为训练数据 Tr、验证数据 Va和测试数据集 Te。需要强调的是,进行科学研究时,通常假定是能看到测试数据的真实标签(真实类别)。而在数据挖掘竞赛或实际应用中,有时无法看到测试数据,测试数据的真实标签无法提前获知。因此,进行分类算法的实验验证时,Te只能使用一次。

如果像使用 Va一样使用 Te,就相当于看到了标准答案 (真实标签),然后不断地调参,以最接近标准答案,这其实是 “作弊”(trick)。在实际应用和真实场景中,是绝对不可能看到数据集的标签的。很多初学者都容易犯这个错误。总之,训练分类模型时,训练数据 Tr和验证数据 Va可以使用很多次;而 Te只能使用一次。进行科学研究时,Tr、Va、Te的实例个数 (NumberofInstances)的比例可以是 8∶1∶1,也可以是 7∶1∶2,或者是 6∶1∶3,以及 4∶1∶5。有时,为了验证在少数有标注的数据上学习到的分类模型的准确率,Tr+Va和 Te的比例也可以是 3∶7,甚至是 2∶8。尽管如此,Tr+Va和 Te常见的比例是 9∶1(8∶1∶1)、8∶2(7∶1∶2)和 7∶3(6∶1∶3)。需要说明的是,当没有真实测试数据 Te或其标签时,可以将 Va看作是测试数据,但该 Va可以多次使用。而 Te只能使用一次。

如上所述,需要学习分类模型的数据通常划分为 Tr+Va(以下合称为训练数据) 和 Te(测试数据)。进行科学研究时,为了避免训练数据和测试数据划分的随意性,可以用 “穷举训练和测试”的方法进行训练和测试,以保证结果的真实性和稳定性,科研人员通常都进行交叉验证 (Cross-Validation[1]),即多次改变训练数据和测试数据的组成实例。10轮(5轮)交叉验证是常用的做法,即 10次 (5次)改变训练数据和测试数据的组成实例。而改变训练数据和测试数据组成实例的方法,可以有两种。一种方法是随机方法,即每次随机地选择训练数据和测试数据的实例,共 10次 (5次);另一种方法是 K-fold交叉验证,该方法将数据等分为若干份 (如 4份、5份、10份),如图 1-1所示,每次都轮流选择其中的1份数据作为测试数据,其余的各份 (如 3份、4份、9份) 数据作为训练数据,共 K次(如,K=4、5、10)。相比起来,K-fold交叉验证更为常用,它的一个好处是每轮的训练数据和测试数据都能够固定和重现,方便其他研究人员重现对应的数据和实验结果。最后,K-fold交叉验证中,每轮验证的对应准确率相加,并求平均值,作为该算法最终的准确率。需要说明的是,K-fold交叉验证中,每轮中,一旦确定了训练数据和测试数据,该测试数据在该轮中仍然只能使用一次。

除了上述两种方法之外,还有一种更为简单、省时、也较为常用的方法,即 Hold-out验证方法,它不同于交叉验证。Hold-out验证方法首先将原始数据随机打乱,然后,随机挑选其中的一部分数据用于测试,另外一部分数据用于训练。该方法只有一轮,因此简单、省时。数据挖掘公开竞赛常用这种方法。

比较而言,K-fold交叉验证得到的准确率更加科学、稳定、可靠,但需要多倍 (如 4倍、5倍、10倍)于 Hold-out验证方法的时间;而 Hold-out验证方法更加简单、省时。两种方法都是常用的验证分类算法的方法,但交叉验证方法更常用。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码

 

51CTO读书频道活动讨论群:365934973
【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Absolute C++中文版(原书第2版)  

本书是讲解C++语言程序设计的优秀教程。全书围绕C++语言来组织,开始章节介绍编程的普通感念,接下来详细介绍C++中的继承、多态、异常处理...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊