机器学习中数据训练集,测试集划分与交叉验证的联系与区别(含程序)

26人阅读 评论(0) 收藏 举报
分类:






因为一个模型仅仅重复了刚刚训练过的样本的标签,这种情况下得分会很高,但是遇到没有训练过的样本就无法预测了。这种情况叫做过拟合。为了避免过拟合,一个常见的做法就是在进行一个(有监督的)机器学习实验时,保留一部分样本作为测试集(X_test, y_test。为了提高训练数据的泛化能力,我们把训练集和测试集对半划分,即:X_testy_test=11test_size=0.5。但是仅仅如此,再训练时,训练集可能自身会出现过拟合现象,从而使测试集的验证效果降低。为了解决这个问题,另一部分数据被取出来作为“验证集”:在训练集上训练,验证集上评估,当实验看起开比较成功的时候,在测试集上进行最终的评估但是把获得的数据分成三部分,会大量减少训练模型的样本数量,并且结果很依赖于随机选择的训练和验证集解决这个问题的一个方法就是交叉验证(简写CV)。如采用10次交叉验证(或者留出法)。





下面看一篇博客,已经详细叙述了下他们的联系与区别

https://blog.csdn.net/laolu1573/article/details/51160019

在一个数据集上学习预测函数的参数并且在相同的数据集上测试是一种错误的方法:因为一个模型仅仅重复了刚刚训练过的样本的标签,这种情况下得分会很高,但是遇到没有训练过的样本就无法预测了。这种情况叫做过拟合。为了避免过拟合,一个常见的做法就是在进行一个(有监督的)机器学习实验时,保留一部分样本作为测试集(X_test, y_test)。需要注意的是,“实验”这个词并不是为了表示只是学术上使用,即使是商用场景,机器学习通常也是从实验着手。

scikit- learn中,使train_test_split这个帮助函数可以很快的将样本随机的切分成训练集和测试集。我们现在载入iris数据集来训练一

个线性支持向量机:

>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))

我们现在可以很快的采样出一个训练集,并且拿出40%的数据来测试(评估)我们的估计器:

>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)                           
0.96...

在评估不同设置(超参)对分类器的影响时(比如 SVM的需要人工设置的C 这个参数),因为需要不断调整参数直到分类器性能最好,仍然存在在测试数据集上的过拟合现象。这种情况下,模型会漏掉测试集数据的知识,评估矩阵不能反应其泛化性能。为了解决这个问题,另一部分数据被取出来作为“验证集”:在训练集上训练,验证集上评估,当实验看起开比较成功的时候,在测试集上进行最终的评估。

但是把获得的数据分成三部分,会大量减少训练模型的样本数量,并且结果很依赖于随机选择的训练和验证集。

解决这个问题的一个方法就是交叉验证(简写CV)。依然需要保留一个测试集来做最后评估,但是不需要验证集。最基本的方法,就是k-折交叉验证,训练集被分成K个小集合(其他方法将在后面描述,但是一般遵守相同的准则)。这K“折”的每个都依照下面的过程:

  • k-1部分作为训练样本来训练模型;
  • 用剩余1部分数据对训练好的模型进行验证。
k-折交叉验证的准确率是循环中计算的每个准确率的平均。这种方式可能计算消耗大些,但是不需要浪费很多数据(对比固定任意测试集的情况),这是解决小样本情况下逆向推理的一个主要优势。

3.1.1.计算交叉验证矩阵
使用交叉验证的最简单的方法是在估计器和数据集上使用cross_val_score帮助函数。
下面的例子示例了怎样通过切分数据,拟合模型和连续5次计算得分(每次使用不同的切片)来估计线性核函数
SVM在iris数据上准确率。
>>> clf = svm.SVC(kernel='linear', C=1)
>>> scores = cross_validation.cross_val_score(
...    clf, iris.data, iris.target, cv=5)
...
>>> scores                                              
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])

给出平均得分和在95%的置信区间内的估计得分:
>>> print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
Accuracy: 0.98 (+/- 0.03)
默认每次CV迭代计算的得分是估计器的score方法得分,可以使用得分参数改变默认配置。
>>> from sklearn import metrics
>>> scores = cross_validation.cross_val_score(clf, iris.data, iris.target,
...     cv=5, scoring='f1_weighted')
>>> scores                                              
array([ 0.96...,  1.  ...,  0.96...,  0.96...,  1.        ])
详情见The scoring parameter: defining model evaluation rules章节。在Iris数据集的例子中,每个类别的样本数目比较均衡,所以准确率和F1-score几乎是相等的。

当cv参数是一个整型时,cross_val_score默认使用KFold 或StratifiedKFold的方法,

查看评论

Cross-validation 交叉验证与训练集测试集划分

由于代码比较简单,直接看代码生成的结果更容易理解代码的功能和作用,所以没有添加更多的说明。 参考官方文档地址:http://scikit-learn.org/stable/modules/cross...
  • yisuoyanyv
  • yisuoyanyv
  • 2017-07-14 18:02:05
  • 2546

机器学习 数据挖掘 数据集划分 训练集 验证集 测试集

机器学习之数据集划分: 训练集 验证集 测试集 Q:将数据集划分为测试数据集和训练数据集的常用套路是什么呢? A:three ways shown as follow: 1.像sklea...
  • Scotfield_msn
  • Scotfield_msn
  • 2017-04-10 12:40:59
  • 4031

【七】机器学习之路——训练集、测试集及如何划分

上一个博客讲了一个简单的例子,根据手头的房子大小和房价的数据来拟合房子大小和房价的关系曲线,当然这是一个非常简单的一元一次方程,y=ax+b。但是最后咱们还少了一样东西,不知道细心的同学有没有发现,那...
  • c369624808
  • c369624808
  • 2017-10-31 21:02:51
  • 2405

[机器学习]三行代码快速划分交叉训练中训练集和验证集

使用numpy.random.choice()和set()快速划分交叉训练数据集 之前在划分训练集和验证集时,都是手工随机生成index,很笨。 学到的新方法如下: import numpy...
  • u013084616
  • u013084616
  • 2018-03-01 11:42:06
  • 153

训练集,测试集,检验集的区别与交叉检验

前言在机器学习中,不可避免要接触到训练集,测试集以及检验集,这些数据集各有各的作用,为机器学习算法的泛化保驾护航,这里结合《Deep Learning》中的关于训练集,测试集和检验集的讨论,浅谈所见所...
  • LoseInVain
  • LoseInVain
  • 2017-09-27 08:56:48
  • 1194

机器学习中的训练集、验证集和测试集

在机器学习中我们把数据分为测试数据和训练数据。 测试数据就是测试集,是用来测试已经训练好的模型的泛化能力。  训练数据常被划分为训练集(training set)和验证集(validation set...
  • u011092188
  • u011092188
  • 2017-04-02 20:06:19
  • 2230

机器学习中训练集、验证集(开发集)、测试集如何划分

1.传统的机器学习领域中,由于收集到的数据量往往不多,比较小,所以需要将收集到的数据分为三类:训练集、验证集、测试集。也有人分为两类,就是不需要测试集。 比例根据经验不同而不同,这里给出一个例子,如...
  • UESTC_C2_403
  • UESTC_C2_403
  • 2017-08-31 14:17:58
  • 5488

[机器学习]划分训练集和测试集的方法

在进行机器学习常常需要处理的一个问题是划分测试集和训练集。训练集用于训练模型,测试集则是根据训练集的训练结果来评判最终的训练效果。一般而言,测试集应该和训练集尽可能保持互斥~常用的数据集划分方法有一下...
  • pengjian444
  • pengjian444
  • 2017-05-02 00:33:33
  • 6504

机器学习中的训练集,验证集及测试集的关系

最近在看机器学习的东西发现验证集的(Validation set) 有时候被提起到,以时间没明白验证集的真正用途。 首先,这三个名词在机器学习领域的文章中是很常见的,以下是这三个词的定义。  Tra...
  • Losteng
  • Losteng
  • 2016-02-29 16:12:44
  • 29996

python划分训练集和测试集

【第一种】方法def splitData(data,seed,m,k): #将数据分成训练集和测试集,每次指定seed,更换K,重复M次,防止过拟合. test=[] train...
  • brave_jcc
  • brave_jcc
  • 2018-03-16 15:36:12
  • 265
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 578
    排名: 9万+
    最新评论