欢迎光临 碧江家具 官方网站!

新浪微博 在线留言 收藏本站

详询热线:400-886-2028
常见问题
当前位置:主页 > 澳门葡京官网 > 常见问题 >

科学网如何正确使用机器学习中的训练集、验证

文章出处:angel人气:发表时间:2019-07-03 14:00【

训练集、验证集和测试集,林林总总的数据集合类型,到底该怎么选、怎么用?看过这篇教程后,你就能游刃有余地处理它们了。

问题

审稿的时候,不止一次,我遇到作者错误使用数据集合跑模型准确率,并和他人成果比较的情况。

他们的研究创意有的很新颖,应用价值较高,工作可能也做了着实不少。

但因对比方法错误,得出来的结果,不具备说服力。几乎全部都需要返工

这里,我帮你梳理一下,该怎么使用不同的数据集合:

训练集(training set)

验证集(validation set)

测试集(test set)

目的只有一个——避免你踩同样的坑

其实这个问题,咱们之前的教程文章,已有涉及。

《如何用 Python 和深度迁移学习做文本分类?》一文中,我曾经给你布置了一个类似的问题。

在文章的末尾,我们对比了当时近期研究中, Yelp 情感分类的最佳结果。

下表来自于:Shen, D., Wang, G., Wang, W., Min, M. R., Su, Q., Zhang, Y., … & Carin, L. (2018). Baseline needs more love: On simple word-embedding-based models and associated pooling mechanisms. arXiv preprint arXiv:1805.09843.

注意这里最高的准确率(Accuracy)数值,是 95.81 。

我们当时的模型,在验证集上,可以获得的准确率,是这个样子的:

97.28%,着实不低啊!

于是我问你:

咱们这种对比,是否科学?

当时的答案是什么?

这么久过去了,又看了那么多新的教程和论文,你的答案发生变化了吗?

现在咱们公布一下答案吧。

不科学

为什么?

因为对比方法有问题。

方法

原文中有这样一句:

这里数据集只提供了训练集和“测试集”,因此我们把这个“测试集”当做验证集来使用。

作为演示,数据集咱们想怎么用,就可以怎么用。

甚至你把测试集拿来做训练,然后在训练集上跑测试,都没有人管。

但是写学术论文,声称你的模型优于已有研究,却绝不能这么草率。

注意,比较模型效能数值结果时,你只能拿不同的模型,在同样的测试集上面比。

测试集不同,当然不可以。

但模型A用测试集,模型B用验证集(与A的测试集数据完全一致)比,可以吗?

很多人就会混淆了,觉得没问题啊。既然数据都一样,管它叫做什么名称呢?

可是请你注意,哪怕A模型用的测试集,就是B模型用的验证集,你也不能把这两个集合跑出来的结果放在一起比较。

因为这是作弊

你可能觉得我这样说,颇有些吹毛求疵的意味。

咱们下面就来重新梳理一下,不同数据集合的作用。

希望你因此能看清楚,这种似乎过于严苛的要求,其实是很有道理的。

咱们从测试集开始谈,继而是验证集,最后是训练集。

这样“倒过来说”的好处,是会让你理解起来,更加透彻。

先说测试集吧。

测试

只有在同样的测试集上,两个(或以上)模型的对比才有效。

这就如同参加高考,两个人考同样一张卷子,分数才能对比。

甲拿A地区的卷子,考了600分,乙拿B地区的卷子,考了580分。你能不能说,甲比乙成绩高?

不行吧。

为了让大家更易于比较自己的模型效果,许多不同领域的数据集,都已开放了。而且开放的时候,都会给你指明,哪些数据用于训练,哪些用于测试。

以 Yelp 数据为例。

在 AWS 上存储的 fast.ai 公开数据集中,训练集和测试集都已为你准备好。

你不需要自己进行划分。

大家达成共识,做研究、写论文,都用这个测试集来比拼,就可以。

所以,如果你的研究,是靠着比别人的模型效果来说事儿,那就一定先要弄明白对方的测试集是什么。

但是,这个听起来很容易达成的目标,实践中却很容易遇到困难。

因为有的人写论文,喜欢把数据和代码藏着掖着,生怕别人用了去。

他们一般只提一下,是在某个公开数据集上切了一部分出来,作为测试集。

测试数据集不发布,切分方法(包括工具)和随机种子选取办法也不公开。

这是非常不靠谱的行为,纯属自娱自乐。

作为严肃的审稿人,根本就不应该允许这样的研究发表。

因为机器学习研究的数据集不开放,便基本上没有可重复性(Reproducibility)。

如果你没有办法精确重复他的模型训练和测试过程,那么他想汇报多高的准确率,就纯凭个人爱好了。

当然,我们不是活在理想世界的。

你在某一个领域,用机器学习做应用研究的时候,面对这种无法重复已发表论文的情境,该怎么办?

直接用他声称的结果与你的实际运行结果比较,你可能是在追逐海市蜃楼。累到气喘吁吁,甚至怀疑自我的程度,也徒劳无功。

忽视它?

也不行。

审稿人那关你过不去。

人家会说,某某研究跟你用的是一样的数据,准确率已经达到98%,你的才96%,有什么发表的意义呢?

看,左右为难不是?

其实解决办法很简单。

不要考虑对方声称达到了多高准确率。把他提供给你的数据全集,自行切分。之后复现对方的模型,重新跑。

模型架构,一般都是要求汇报的,所以这几乎不是问题。

至于这种复现,越是复杂的模型,我越推荐你用 PyTorch 。

之后把你的模型,和复现的对方模型在同样的测试集上做对比,就可以了。

当然,论文里要写上一句:

由于某篇文章未提供代码与具体数据切分说明,带来可重复性问题,我们不得不独立复现了其模型,并在测试集完全一致的情况下,进行了比对。

这里多说一句,一定要保证你自己的研究,是可重复的。

不要怕公布你的代码和数据。它们不是你的独门暗器,而是支撑你研究的凭据