Machine Learning Yearning 4-12 阅读笔记:开发/测试集与评估指标

主要内容

在训练模型的时候,如果效果不如人意,这时候你可以采取很多办法来改进模型,但是可选的方法太多,你究竟该先用哪些方法呢?Andrew Ng的这本书就是为此而写。Ps:开发集就是验证集。

4. 规模驱动机器学习前进

驱动深度学习进步的两大因素1.大量可用数据2.计算能力
具体来说,即使有更多的数据,传统机器学习算法也不会有效果提升。
这里写图片描述
这个图表展示了NN在小数据集下做得更好。这种效果不如NNs在大数据集中表现良好的效果一致。 在小数据系统中,取决于如何手工设计特征,传统算法可能做的很好,也可能做得并不好。 例如,如果你有20个训练样本,那么使用逻辑回归还是神经网络可能并不重要; 手工特征的选择将比算法的选择产生更大的影响。 但如果你有100万的样本,我更倾向于神经网络。

虽然神经网络的结构很重要,并且其中很很多的创新,但目前提升算法效果最有效的方法还是1.加深神经网络2.获取更多的数据。但(1)(2)两个过程比预料的更加复杂。接下来介绍的方法会对传统方法和神经网络都适用。

建立开发和测试集

5.你的开发和测试集

在大数据时代之前,七三分训练测试集是很普遍的做法,但这正变得越来越糟,当训练集的分布和实际分布差异很大的时候。通常的划分方法:
训练集:
开发集:调参,特征选择和做一些算法的决策,又被称为留出交叉验证集
测试集:评价算法表现,但不能做任何算法决策
总而言之,开发和测试集的目的是指导你的团队对机器学习系统进行最重要的更改。
所以,你应该做的是:选择你认为未来你的算法会遇到并且很重要的数据,来组成开发和测试集。
即使没有成熟的数据来源,也应该尝试用方法来近似的获取数据。如果无法获取,那么你必须意识到其中的风险。你需要判断你要投资多少在开发和测试集上,不要假想你的训练集和测试集有相同的分布。挑选的测试集数据,必须是你期望你的算法最终能够在这些算法上表现良好的数据,而不是你已有的数据(总结,不要偷懒,花时间去找真正重要的数据来做测试集,比如虽然诈骗犯占比很小,但要识别出全部的诈骗犯)。

6.你的开发集和测试集应该同分布

如果不这样做会怎样?首先,你的算法改进的方向是基于开发集的,那么你打改进方向会偏离。其次,如果开发集和测试集同分布,而算法在开发集上表现好,在测试集上表现差,那么你可以很容易的知道,你的算法对开发集过拟合了,这时候你应该采取的措施是加大开发集,但如果二者不是同分布,那么你面对的问题就比较复杂,可能是1.算法对开发集过拟合了2.测试集求结果的难度更大3.测试集求y难度相同,仅仅是分布不同,之前的算法不能在测试集上表现良好,那么之前做的工作都白费了。

7.开发测试集该有多大

显然当开发集不大时,两个模型的准确率必须相差足够大才有说服力。通常,1000到10000大小是比较普遍的,将比较容易检测到0.1%的提升。
对于一些重要的应用,也有团队为了0.01%的提升而努力,这种情况下,开发集应该远大于10000。
那么测试集该有多大呢?它应该足够大,使得你对你的模型的整体性能有足够的信心。一个流行的办法是将30%的数据用作测试集,当你的有足量的样本,比如100-10000个时,这是一个好方法。但在大数据时代,要评估一个算法的性能,没有必要追求过大的开发测试集。

8.为算法团队建立一个单一的评价指标

很简单,单一指标更统一,更容易评判,让大家朝着一个方向努力。

9.优化和满足指标

假设你既关心准确率又关心运行时间,这个时候,首先,你应该决定边界,运行时间在什么之内是可接受的,然后在满足条件的模型中,选择准确率最高的,
如果你有N个不同标准,那么建议将其中N-1个设置满足边界,而优化最后一个指标。这样你的团队,将能获得更快的进展。

10.开发机和指标来加速迭代

在构建机器学习系统时,我(吴恩达)经常会:
1.以一些如何构建系统的idea开始
2.实现这些idea
3.进行实验得到这些idea的效果,基于这些经验,产生更多的idea,保持迭代
这就是为什么开发集和测试集重要的原因,当你有开发测试集的时候,你能快速判断你是否行进在恰当的方向上,是否某一个idea需要改善,哪些idea可以丢弃。

11.何时更改开发测试集和评估指标

我(吴恩达)通常会要求我的团队在一周内选出初始的开发测试集和评估指标,提出一个不太完美的方案并迅速行动起来。但这并不适用于成熟的应用。对于例如反垃圾邮件,经常会花费数个月的时间在成熟的系统上,去获得更好的开发测试集。
当你发现开发测试集或评估指标与实际目标有偏差时,需要对其进行调整。
1.实际数据的分布与开发测试集不同。
2.对开发集过拟合。
3.评估指标衡量的并不是项目所需要优化的东西。例如准确率高的模型A会将小部分色情图片也识别为猫。这时候,你必须改变评估指标,例如严惩这一分类错误,用新标准来明确定义新的目标。

12.小结:建立开发和测试集(转载自github的xiaqunfeng)

  • 从分布中选择开发集和测试集,该分布反映你期望在未来获得什么样的数据,并希望在上面做得很好。这可能和你训练数据的分布不一样。
  • 如果可能的话,选择来自同一分布的开发集和测试集。
  • 为你的团队选择单一数字的评估指标进行优化。如果你关心多个目标,考虑把它们合并到一个公式中(例如平均多个错误指标),或设定满足指标和优化指标。
  • 机器学习是一个高度迭代的过程:在发现你满意的方法之前你可能需要尝试很多的idea。
  • 开发/测试集和单一数字评估指标可以帮助你快速评估算法,从而迭代的更快。
  • 当开始一个全新的应用时,尝试快速建立开发/测试集和评估指标,最好在一周之内。当然,在成熟应用上花费更长的时间是ok的。
  • 当你拥有大量数据时,依据70%:30%的比例划分训练/测试集这一经验性的方法不太适用;开发/测试集可以占远小于30%的数据量。
  • 你的开发集应该足够大,以检测出算法准确性有意义的改变,但没必要更大。你的测试集应该足够大,大到能对你的系统整体性能有一个确信的评估。
  • 如果你的开发集和评估指标不再使你的团队在正确方向上前进,快速改变它们:(i)如果你过拟合了开发集,去获得更多的开发集数据。(ii)如果你所关心的实际分布和开发/测试集的分布不同,那么去获得新的开发/测试集数据。(iii)如果你的评估指标不再能衡量对你来说最重要的东西,改变评估指标。

猜你喜欢

转载自blog.csdn.net/juranyaoyingwen/article/details/80452963
今日推荐