心法利器[50] | 测试集构造思考

心法利器

本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有

近期,我再次总结了我的历史文章,累积起来有50w字,百余篇文章了,有兴趣可以拿来看看,获取方式:七夕清流,百余篇累计50w字文章合集发布

往期回顾

结合前面几篇文章的铺垫,今天给大家详细聊聊测试集的构造,常用的必要的思路以及需要关注的细节。

这篇文章尤其适合平时用通用数据集进行实验比较多而没有自己根据现实场景构造过数据集的同学,可以看看测试集深层次的含义。

背景

所谓的测试集,其实是针对算法而言,用于评估算法效果的样本集合,说白了,就是考题,考考模型他的能力咋样,因此题出的好坏直接影响我们对模型的实际判断,那么如何构造一个好的测试集,就很关键了。

什么好的测试集

要构造好的数据集,首先需要知道的就是什么样的数据集是好的,而要知道什么数据集是好的,那就需要知道测试集的核心目标。

之所以要构造测试集,就是要查看一个算法的综合效果,我们需要足够的case分析出算法在具体场景中的综合效果,从这个解释来看,其实能拆解出这些要求:

  • 测试集要和具体场景的分布要一致,测试集结果才能和真实场景场景结果接近。

  • 测试集规模要足够,一方面才能覆盖更多具体场景的特殊情况,另一方面统计指标才足够准确。

  • case质量,准确率要足够高,测试集算的指标才正确。

因此,我们要围绕这些角度来设计和构造数据集。

案例

来举个栗子吧,开放域搜索的意图识别场景,要评估准确率,看好,此处只评估正类的准确率,应该怎么构造数据集。

首先,明确问题,开放域搜索场景,那我们的数据分布应该是要根据在线情况,最简单的方式,就是在线随机query抽样。第二,我们只需要评估准确率,准确率的分母是算法认为是正类的数量,分子是分母中实际是正类的数量。从这里可以看到,我们需要的数据最大的范围就是算法人为是正类的部分,这种范围的缩小,可以降低我们标注数据的成本,而且这个测试集的规模,就是分母的大小就已经足够。

值得注意的是,里面有一些细节,我们考虑开放域的搜索场景,搜索的大部分情况是用户打字输入,这种输入方式的特点就是字数可能不是很多,说法也比较严谨,口语化的说法会有但是占比肯定不会很高,我们更应该关注的就是这些字数不是很多,说法严谨的部分,这部分在测试集的占比应该是比较高的,我们必须有这样的一些基本的业务和数据判断。

据此,我们来构造数据集。我给的方案是这样的:

  • 首先,从日志中随机拿出足量query。

  • 然后,用先有待测的算法进行跑这批query。

  • 抽取算法认为是正类的部分,就是测试集。

  • 跟进标注,完成准确率评估。

这里可以看到,虽然我们在线拿到了很多query,但我们最终只用了算法认为是正类的部分,因为我们根据目标反推来看,只需要这部分,这个测试集才是我们需要的。

构造原则

总结一下构造原则吧,可以作为构造测试集的checklist。

  • 符合功能预期。测试集要真的可以测得到自己希望测到的东西。

  • 服从具体场景。真实场景常见的东西,数据集里也要对应高频。

  • 统计意义。要求数据集的绝对量要足够,具体地,要求指标计算下每个数的绝对数都要比较大。

  • 可靠性。数据标注和数据质量的保证。

其他细节问题

大家可能会有一些疑问,这里预判一下,给大家回答。

去重和不去重的问题

根据28法则,在线的问题分布一定是集中的很集中,分散的很分散,在这个基础下,数据的去重和不去重差别会非常大。

  • 不去重测试集,会更关注比较关键、高频的问题,这些问题一旦没有解决,指标会骤降。

  • 去重测试集,高频信息会被稀释,所有信息都是均匀出现的,相对的其实低频长尾的信息相对被增强了,加上低频长尾的情况本身就更复杂多样,所以在数据集中复杂的信息,所以此时的指标会更关注低频长尾。

这里没有好坏之分。一般而言我们是希望这两者下的指标都比较高的,前者是符合真实使用情况,所以必须不低,而后者其实是一种鲁棒性、稳定性的体现,所以也不希望低,只是两者关注点不同而已,通过一些差异是可以分析出不同的问题的。

测试集规模

在前面,我提到了一个说法,足量,什么叫足量,其实非常模糊,是根据实际情况来确定的。同样以上面的问题为例,如果是自测,其实自己标一百两百条,做自测评估是足够了,而如果要做上线前的评估,我希望是能尽量达到一两千条的水平,可以结合标注人力和自己的时间来判断,我们都知道,对统计指标,数据越多指标越精准,但是这个和人力时间是矛盾的,这里需要自己权衡。

和训练集的关系

在实验室做得比较多的都知道,训练集和测试集在开放数据集下是一致的,一般的构造方式就是直接从训练集里面抽一部分出来做测试集,这个和我今天聊的文章好像不太一样,测试集并没有从训练集里面抽,这里的测试集甚至和训练集没有什么关系,这到底是怎么回事。

首先,先聊通用数据集的问题。通用数据集常用于测算法的具体学习和训练能力,在一定情况下能尽可能学到训练集里的信息而避免产生过拟合,而不具有非常明确的现实场景,所以此时,这种构造方式非常合理。

然后,再聊聊现实场景应用的时候测试集和训练集的一致性的问题。我的答案是,不需要一致。首先,测试集是依赖于现实场景的,所以相对固定,但是在学习过程中,我们其实通过一些数据手段是可以提升最终效果的,那训练集和测试集自然不需要拘泥于分布一致性问题;其次,我们回想学习考试,简单的题目一般占题目大多数,而难题只是一小部分,但是我们学习的时候,是简单的题目学的时间长还是难的学的长,我们一般需要更多的时间关注难题才能把难题做出来,哪怕她的比例其实不高,从这个角度看,我们其实需要更多的数据才能让模型学习到这个更难学习的东西,但有难度的东西往往在数据集里并不常见,从这个例子来看,其实测试集和训练集不一致可能更加正常。

小结

最近一连几篇,或多或少,或直接或间接地聊了这个数据集的问题,应该是到此为止了,这个东西很琐碎也很细小,不好聊,但是真的挺希望给大家说明白的,我理解算法工程师的功力其实很体现在这些地方,对数据的理解把控,对结果的分析和问题发现等等,这比多懂几个模型或者策略似乎还要重要的多。

34b5b36a15f95ae54838d3eac4d64033.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值