如何把数据集划分成训练集和测试集

本文内容来自周志阳《机器学习》

问题: 对于一个只包含\(m\)个样例的数据集\(D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\),如何适当处理,从\(D\)中产生训练集\(S\)和测试集\(T\)?

下面介绍三种常见的做法:

  • 留出法
  • 交叉验证法
  • 自助法

留出法(hold-out)

留出法直接将数据集\(D\)划分为两个互斥的集合,其中一个集合作为训练集\(S\),留下的集合作为测试集\(T\),即\(D=S \cup T, S \cap T=\emptyset\)。在\(S\)上训练出模型后,用\(T\)来评估其测试误差,作为对泛化误差的估计。以二分类任务为例,假设\(D\)包含1000个样本,我们采取7/3分样,将其划分为\(S\)包含700个样本,\(T\)包含300个样本。

\(S/T\)的划分要尽可能的保持数据分布的一致性(\(S/T\)中的数据分布跟\(D\)是一样的),才能避免因数据划分过程引入额外的偏差而对最终结果产生影响。例如,在分类任务中,至少要保持样本的类别比例相似。保留类别比例的采样方式,即分层采样(stratified sampling)。例如,\(D\)中含有500个正例,500个反例,当采用分层采样获取70%的样本的训练集\(S\)和30%的赝本的测试集\(T\)时,则\(S\)包含有350个正例和350个反例,\(T\)有150个正例和150个反例。

给定样本比例,有多种划分方式对\(D\)进行分割。如在上面的例子中,我们可以把\(D\)的样本排序,然后把前350个正例放到\(S\)中,也可以把后350个正例放入\(S\)... 这种不同的划分将导致不同的训练/测试集,相应的模型评估也是有差别的。因此,使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。例如进行100次随机划分,每次产生一个\(S/T\)进行实验评估,得到100个结果,而留出法返回的则是这100个结果的平均。

常见做法将大约2/3~4/5的样本作为\(S\),剩下的作为\(T\)。

交叉验证法(cross validation)

交叉验证法将\(D\)划分为\(k\)个大小相似的互斥子集,即\(D=D_1 \cup D_2 \cup \dots \cup D_k, D_i \cap D_j = \emptyset (i \not = j)\)。每个子集\(D_i\)都尽可能保持数据分布的一致性,即从\(D\)中通过分层采样得到。然后,每次用\(k-1\)个子集的并集作为\(S\),剩下的那个子集作为\(T\),这样可获得\(k\)组\(S/T\),从而可进行\(k\)次训练和测试,最终返回这\(k\)个测试结果的平均。

交叉验证法评估结果的稳定性和保真性在很大程度上取决于\(k\)的取值、为强调这一点,通常把交叉验证法称为“\(k\)折交叉验证”(\(k\)-fold cross validation)。\(k\)最常用的取值是10,有时也取5和20等。

当\(D\)包含\(m\)个样本,令\(k=m\),则得到交叉验证法的一个特例——留一法(Leave-One-Out,简称LOO)。留一法使用的\(S\)只比\(D\)少一个样本,所以在绝大多数情况下,实际评估结果与用\(D\)训练的模型相似。因此,留一法被认为比较准确。但留一法对于大数据集,计算开销太大;另外也不见得永远比其他方法准确。

自助法(bootstrapping)

在前两种方法中都保留部分样本作为\(T\)用于测试,因此实际评估模型使用的训练集\(T\)总是比期望评估模型使用的训练集\(D\)小,这样会引入一些因训练样本规模不同而导致的估计偏差。

自助法,以自助采样(bootstrap sampling)为基础。对\(D\)进行采样产生\(D^{\prime}\):每次随机从\(D\)中挑选一个样本,将其拷贝一份放入\(D^{\prime}\)中,保持\(D\)不变,重复以上过程\(m\)次。显然,\(D\)中有部分样本会多次出现在\(D^{\prime}\)中,而另一部分不会出现。样本在\(m\)次采样中的始终不被采到的概率为\((1-\frac{1}{m})^m\),当\(m \to \infty\)时,\((1-\frac{1}{m})^m \to \frac{1}{e} \approx 0.368\)。

通过自助法,\(D\)中有36.8%不会出现\(D^{\prime}\)中。于是我们把\(D^{\prime}\)当作训练集\(S\),把\(D \setminus D^{\prime}\)当作测试集\(T\),这样实际评估模型与期望评估模型都为\(m\)个样本,而仍有数据总量1/3的、没有出现在训练集中的样本用于测试。这样的测试结果为包外估计(out-of-bag estimate)。

自助法在数据集较小、难以划分\(S/T\)时很有用。此外,自助法能从\(D\)中产生不同的\(S\),对集成学习等方法有好吃。自助法产生的\(S\)改变了\(D\)的分布,会引入估计偏差。当数据量足够时,留出法和交叉验证法更常用、

原文地址:https://www.cnblogs.com/liupeng-Wang/p/8823371.html

时间: 2024-10-09 19:47:16

如何把数据集划分成训练集和测试集的相关文章

随机切分csv训练集和测试集

使用numpy切分训练集和测试集 觉得有用的话,欢迎一起讨论相互学习~Follow Me 序言 在机器学习的任务中,时常需要将一个完整的数据集切分为训练集和测试集.此处我们使用numpy完成这个任务. iris数据集中有150条数据,我们将120条数据整合为训练集,将30条数据整合为测试集. iris.csv下载 程序 import csv import os import numpy as np '''将iris.csv中的数据分成train_iris和test_iris两个csv文件,其中t

sklearn——train_test_split 随机划分训练集和测试集

sklearn--train_test_split 随机划分训练集和测试集 sklearn.model_selection.train_test_split随机划分训练集和测试集 官网文档:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html 一般形式: train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train data和

将数据划分为训练集和测试集;缩放特征区间

导入葡萄酒数据: 1 import numpy as np 2 import pandas as pd 3 4 df_wine = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", header=None) 5 df_wine.columns = ["class label", "alcohol", 6 "mal

AI - MLCC06 - 训练集和测试集 (Training and Test Sets)

原文链接:https://developers.google.com/machine-learning/crash-course/training-and-test-sets 1- 拆分数据 可将单个数据集拆分为一个训练集和一个测试集. 训练集 - 用于训练模型的子集. 测试集 - 用于测试训练后模型的子集. 训练集的规模越大,模型的学习效果越好.测试集规模越大,对于评估指标的信心越充足,置信区间就越窄.在创建一个能够很好地泛化到新数据模型的过程中,测试集充当了新数据的代理. 拆分数据的一些注意

sklearn获得某个参数的不同取值在训练集和测试集上的表现的曲线刻画

from sklearn.svm import SVC from sklearn.datasets import make_classification import numpy as np X,y = make_classification() def plot_validation_curve(estimator,X,y,param_name="gamma", param_range=np.logspace(-6,-1,5),cv=5,scoring="accuracy&

python 将数据随机分为训练集和测试集

# -*- coding: utf-8 -*- """ Created on Tue Jun 23 15:24:19 2015 @author: hd """ from sklearn import cross_validation c = [] j=0 filename = r'C:\Users\hd\Desktop\bookmarks\bookmarks.arff' out_train = open(r'C:\Users\hd\Desktop

Python数据预处理—训练集和测试集数据划分

使用sklearn中的函数可以很方便的将数据划分为trainset 和 testset 该函数为sklearn.cross_validation.train_test_split,用法如下: >>> import numpy as np >>> from sklearn.cross_validation import train_test_split >>> X, y = np.arange(10).reshape((5, 2)), range(5)

用于拆分训练集和测试集的函数 train_test_split

文档地址:https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split 原文地址:https://www.cnblogs.com/s1m00n/p/11565913.html

模型训练过程中的训练集、训练开发集、开发集和测试集总结

36.什么时候你应该在不同分布上做训练和测试 当你的猫app已经上传10000张图,你已经人工标记它们有没有猫,同时你有200000张互联网上下载的图,这时你要怎么划分训练开发测试集呢? 当你训练深度学习模型时,可能必须用到那200000张图,那么训练和测试集的分布就不同,这会怎样影响你的工作呢? 当然将210000张图片随机分裂到训练开发测试集是一种方法,但我(吴恩达)不推荐这种方法,记住选择开发测试集的推荐方法是:选择你未来预期会得到的数据来作为开发测试集. 大多数学术文章假设训练开发测试集