秘籍0x01建立开发集和测试集
机器学习训练秘籍笔记
3.jpg
1-12章
-
监督学习(supervised learning)是指使用已标记(labeled)的训练样本 来学习一个从 映射到 的函数。监督学习算法主要包括线性回归(linear regression)、对数几率回归(logistic regression,又译作逻辑回归)和神经网络(neural network)。虽然机器学习的形式有许多种,但当前具备实用价值的大部分机器学习算法都来自于监督学习。
-
训练集(training set)用于运行你的学习算法。
开发集(development set)用于调整参数,选择特征,以及对学习算法作出其它决定。有时也称为留出交叉验证集(hold-out cross validation set)。
测试集(test set)用于评估算法的性能,但不会据此决定使用什么学习算法或参数。
-
开发集和测试集的使命就是引导你的团队对机器学习系统做出最重要的改变。 合理地设置开发集和测试集,使之近似模拟可能的实际数据情况,并处理得到一个好的结果。
-
开发集和测试集应该服从同一分布。
-
开发集的规模应该大到足以区分出你所尝试的不同算法间的性能差异。 通常来说,开发集的规模应该在 1,000 到 10,000 个样本数据之间,而当开发集样本容量为 10,000 时,你将很有可能检测到 0.1% 的性能提升。
-
那么测试集的大小又该如何确定呢?它的规模应该大到使你能够对整体系统的性能进行一个高度可信的评估。
-
所谓的单值评估指标(single-number evaluation metric)有很多,分类准确率就是其中的一种:你在开发集(或测试集)上运行分类器后,它将返回单个的数据值,代表着被正确分类的样本比例。根据这个指标,如果分类器 A 的准确率为 97%,而分类器 B 的准确率为 90%,那么我们可以认为分类器 A 更优秀。
-
查准率(Precision,又译作精度)和查全率(Recall,又译作召回率)均不是单值评估指标,因为它给出了两个值来对你的分类器进行评估。多值评估指标将使算法之间的优劣比较变得更加困,算法团队需要在之间做取舍权衡。 取平均值或者加权平均值是将多个指标合并为一个指标的最常用方法之一。
-
优化指标和满意度指标, 利用一定的算法对多个指标进行合并。
-
通过开发集和度量指标加速迭代。1.尝试一些关于系统构建的想法(idea)。
2.使用代码(code)实现想法。
3.根据实验(experiment)结果判断想法是否行得通。(第一个想到的点子一般都行不通!)在此基础上学习总结,从而产生新的想法,并保持这一迭代过程。
-
何时修改开发集、测试集和度量指标:
开展一个新项目时,我会尽快选好开发集和测试集,因为这可以帮团队制定一个明确的目标。
我通常会要求我的团队在不到一周(一般不会更长)的时间内给出一个初始的开发集、测试集和度量指标,提出一个不太完美的方案并迅速采取行动 ,比花过多时间去思考要好很多。但是一周的时间要求并不适用于成熟的应用程序,譬如垃圾邮件过滤。我也见到过一些团队在已经成熟的系统上花费数月的时间来获得更好的开发集和测试集。
如果你渐渐发现初始的开发集、测试集和度量指标设置与期望目标有一定差距,快速想方法去改进它们。例如你的开发集与度量指标在排序时将分类器 A 排在 B 的前面,然而你的团队认为分类器 B 在实际产品上的表现更加优异,这个时候就需要考虑修改开发集和测试集,或者是你的评估指标了。
a. 你需要处理的实际数据的分布和开发集/测试集数据的分布情况不同。
b.你在开发集上过拟合了。
c. 该指标所度量的不是项目应当优化的目标。
-
什么是过拟合? 举个栗子: 不知道大家在学车的时候教练教倒库和侧方停车的时候有没有教一串口诀:类似于在车窗的XX框切XX杆的时候打满,切XX的时候回正等等,这个口诀可以顺利让你通过科目二,然而换个车或者换个场地,你就发现并没有卵用... 我们说这只是overfit了某个车和某个场地(训练数据),在新的测试集(新车新场地)上的泛化性能为0。
image
1. 小结:建立开发集和测试集
- 选择作为开发集和测试集的数据,应当与你预期在将来获取并良好处理的数据有着相同的分布,但不需要和训练集数据的分布一致。
- 开发集和测试集的分布应当尽可能一致。
- 为你的团队选择一个单值评估指标进行优化。需要考虑多项目标时,不妨将它们整合到一个表达式里(比如对多个误差指标取平均),或者定义满意度指标和优化指标。
- 机器学习是一个高速迭代的过程:在最终令人满意的方案出现前,你可能要尝试很多想法。
- 拥有开发集、测试集和单值评估指标可以帮你快速评估一个算法,从而加速迭代过程。
- 当你探索一个全新的应用时,尽可能在一周内建立你的开发集、测试集和指标,而在成熟的应用上则可以花费更长的时间。
- 传统的 70% / 30% 训练集/测试集划分对大规模数据并不适用,实际上开发集和测试集的比例会远低于 30%。
- 开发集的规模应当大到能够检测出算法精度的细微改变,但也不用太大;测试集的规模应该大到能够使你对系统的最终性能作出一个充分的估计。
- 当开发集和评估指标不再能给团队一个正确的导向时,就尽快修改它们:(i) 如果你在开发集上过拟合,则获取更多的开发集数据。(ii) 如果开发集和测试集的数据分布和实际关注的数据分布不同,则获取新的开发集和测试集。 (iii) 如果评估指标不能够对最重要的任务目标进行度量,则需要修改评估指标