1. 训练集、开发集、测试集(Train/Dev/Test sets)

1.在以往的机器学习中

如上图所示,以往机器学习中,对训练集、开发集、测试集的划分比例为60/20/20,如此划分通常可以获得较好的效果。

训练集(training set):训练算法。

开发集(development set):调整参数、选择特征,以及对学习算法作出其它决定。

测试集(test set):开发集中选出的最优的模型在测试集上进行评估。不会据此改变学习算法或参数。

2.大数据时代

在如今的大数据时代,我们通常可以获得庞大的数据集,比如1,000,000条数据,这种情况下,没有必要选择20%的数据量作为开发集,另外20%数据量作为测试集。通常我们选择10,000条数据作为开发集、10,000条数据作为测试集就足够了。即划分比例:98/1/1。因为开发集的目的是测试不同算法在其上的性能,选择性能更好的算法,因此开发集数量足够大足以评估不同算法并选择较优算法即可。同样地,测试集的目的是,给出最终的分类器,让你对它的性能有一个非常自信的估计

3.训练集和测试集分布不一致的情况

比如你做了一个APP用于识别一张图片是否是狗狗。训练集使用的是来自网页的图片,而开发集和测试集可能是你的用户通过APP上传的图片。网页中的图片通常分辨率高、清晰;而用户上传的可能分辨率低、采光不好。很明显,训练集和测试集分布不一致。

只要确保:开发集和测试集服从同一分布。那么你会迭代的更快。

因为测试集和开发集分布不同的话,那么在开发集上表现良好的算法不一定在测试集上表现优异。如果是这种情况,那么大量针对开发集性能改进的工作将会是徒劳的。

如果你不是搞研究,而是想要在特定的机器学习应用上取得进展,建议尽可能选择服从相同分布的开发集和测试集数据。

4.没有测试集也ok(只有开发集)

测试集的目的是给你一个无偏估计(unbiased estimate)来评价最终选择的算法的性能。如果你不需要无偏估计,那么没有测试集也可以。

这种情况,你要做的就是:在训练集上训练算法,尝试不同的model architectures。然后在开发集上评估模型,迭代直到选择一个好的模型。

因为你在开发集上拟合数据,这样的话不会给你一个性能的无偏估计。如果你不需要的话,这样做完全没问题。

5.术语:大多数人习惯叫训练集和测试集,实际上应该叫训练集和开发集更准确

大多数人会把训练集叫做训练集,而把开发集叫做测试集,但是他们实际上做的事情是,把测试集当成了保留交叉验证集(hold-out cross validation set)。这种提法对术语的使用并不准确,因为测试集上会发生过拟合现象。

6.何时修改开发集、测试集和评价指标

在开发集上反复评估某个想法会导致算法在开发集上“过拟合”。当你完成开发后,应该在测试集上评估你的系统。如果你发现算法在开发集上的性能比测试集好得多,则表明你很有可能在开发集上过拟合了。这种情况下,你需要获取一个新的开发集。

不要根据测试集指标对算法做出任何决策,包括是否将系统回滚到前一周的状态。这样做会导致算法在测试集上开始过拟合,并且不要再指望通过测试集对你的系统性能进行完全无偏估计。

该指标不是项目应当优化的目标。假设你的狗狗 app 当前的指标为分类准确率,而该指标认为分类器 A 优于分类器 B。然而在
尝试了两种算法后,你发现分类器 A 竟然允许出现一些色情图片,这实在是难以容忍。应该怎么办呢?

此时的指标并不能辨别出算法 B 在实际产品中的表现是否比 A 更好,因此根据该指标来选择算法并不可靠,也说明此时应该改变现有的评估指标。你可以选择修改指标,使之对出现色情图片的情况执行严重惩罚。此外,强烈建议你选择一个新的指标并为你的团队制定一个新的研究目标,而不是在不可信的指标上耗费太多的时间,最终导致不得不回过头对分类器进行人工选择。

<think>我们被要求翻译一段英文注释为中文。注意,翻译需要准确传达技术含义,同时保持自然流畅。 原句:"# Split the data into train, val, and test sets. In addition we will\n# create a small development set as a subset of the training data;\n# we can use this for development so our code runs faster." 翻译步骤: 1. 识别技术术语: - train: 训练集 - val: 验证集(validation set) - test: 测试集 - development set: 开发集(这里指用于快速开发的子集) 2. 理解句子结构: 第一句:将数据分为训练集、验证集和测试集。 第二句:另外,我们将从训练数据中创建一个小的开发集。 第三句:我们可以用这个开发集来加速开发过程(使代码运行更快)。 3. 组织中文表达,符合技术文档习惯。 完整翻译: “# 将数据划分为训练集、验证集和测试集。此外,我们将从训练数据中抽取一个小的开发集development set);\n# 这样在开发过程中使用该子集可以加速代码运行。” 注意:在中文技术文档中,我们通常保留“训练集”、“验证集”、“测试集”这些术语。对于“development set”,我们翻译为“开发集”并保留英文原文(可选),因为这是机器学习中的常见做法。但根据上下文,也可以直接使用“开发集”而不加英文。 然而,根据要求,我们只需要翻译,所以不需要额外解释,直接给出翻译后的注释。</think>### 数据划分方法详解 这段注释描述的是**机器学习中数据集的标准划分流程**,以下是完整翻译和详细解释: > **中文翻译**: > `# 将数据划分为训练集、验证集和测试集。此外,我们将从训练数据中创建一个小的开发集development set);` > `# 这样在开发过程中使用该子集可以加速代码运行。` #### 数据集划分示意图 ```mermaid graph TD A[原始数据集] --> B[训练集 70%] A --> C[验证集 15%] A --> D[测试集 15%] B --> E[开发集 5-10%] ``` #### 各数据集作用说明 | 数据集类型 | 比例 | 主要用途 | |----------------|---------|--------------------------------------------------------------------------| | **训练集** | 60-70% | 模型参数学习 | | **验证集** | 15-20% | 超参数调优、模型选择 | | **测试集** | 15-20% | 最终模型评估(仅使用一次) | | **开发集** | 5-10% | 开发调试(快速验证代码逻辑,**不参与实际训练**) | #### 标准划分代码实现(Python) ```python import numpy as np from sklearn.model_selection import train_test_split def split_data(data, labels, dev_size=0.1, test_size=0.15): """ 数据集四重划分函数 :param data: 完整特征数据(numpy数组) :param labels: 对应标签(numpy数组) :param dev_size: 开发集比例(占训练集的比例) :param test_size: 测试集比例 :return: 划分后的六个数据集 """ # 第一步:划分训练+验证集 与 测试集 X_train_val, X_test, y_train_val, y_test = train_test_split( data, labels, test_size=test_size, random_state=42 ) # 第二步:划分训练集与验证集 X_train, X_val, y_train, y_val = train_test_split( X_train_val, y_train_val, test_size=0.2, random_state=42 # 验证集占剩余部分的20% ) # 第三步:从训练集创建开发集 X_train, X_dev, y_train, y_dev = train_test_split( X_train, y_train, test_size=dev_size, random_state=42 ) return { 'X_train': X_train, 'y_train': y_train, 'X_val': X_val, 'y_val': y_val, 'X_test': X_test, 'y_test': y_test, 'X_dev': X_dev, 'y_dev': y_dev } # 使用示例 data = np.random.rand(1000, 20) # 1000个样本,20维特征 labels = np.random.randint(0, 2, 1000) # 二分类标签 datasets = split_data(data, labels) print(f"开发集大小: {len(datasets['X_dev'])} 样本") # 约100个样本 print(f"训练集大小: {len(datasets['X_train'])} 样本") # 约600个样本 ``` #### 关键要点说明 1. **开发集的特殊性**: - 仅用于**代码调试**和**流程验证** - 通常选择训练集的前N个样本(保证快速加载) - 不应用于任何模型评估或调参 2. **随机种子重要性**: ```python random_state=42 # 确保每次划分结果一致 ``` 3. **分层抽样建议**(分类问题): ```python # 在train_test_split中添加stratify参数 train_test_split(..., stratify=labels) ``` 4. **大型数据集优化**: ```python # 使用索引划分避免内存复制 indices = np.arange(len(data)) train_indices, test_indices = train_test_split(indices, ...) ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值