互联网技术 / 互联网资讯 · 2023年12月17日

避免无用功的关键数据科学错误

在一项图像识别比赛中,某个模型经过数天的训练,最初的AUC值为0.9,符合比赛要求。然而,当我对模型进行评估时,结果让我大吃一惊:

注意这个数据科学错误,避免30多个小时的无用功……

当时的排行榜上,排名第一的AUC值为0.965,而我的有效AUC值达到了0.9968,领先于其他一百多个队伍,这让我难以置信。似乎有一种超能力让我在权重初始化上取得了这样的成绩。

注意这个数据科学错误,避免30多个小时的无用功……

这个结果之好让我感到怀疑。尽管我想相信模型的预测,但我还是多次对模型进行评估,测试了部分数据和全部数据,结果始终接近完美。

因此,我认为自己找到了获胜的捷径,激动地提交了模型对测试数据的预测,期待着获得奖金。

然而,比赛分数却令人震惊。

注意这个数据科学错误,避免30多个小时的无用功……

我仅得了0.5分。即使是随机提交的预测也能得到0.5分,我的“魔法”顿悟几乎和随便猜测一样。

结果出来后,我花了30多个小时复盘数据,试图找出问题所在,感到精疲力竭。可能是文件传错了,预测中一定有问题。

然而,这30个小时的努力没有得到回报。我尽力更正结果,但预测分数依然很低。

那么,问题出在哪里呢?

答案是:数据泄露。数据泄露是一个简单的概念,但我却陷入了这个陷阱。在模型训练中,编程没有出错,模型也正确地使用了测试数据,但问题却出在了不易察觉的地方。

简单来说,当模型接触到不该接触的数据时,就会发生数据泄露。在比赛中,我在多个会话中训练了模型,这意味着我从上一个会话加载了模型权重,并保存了最佳性能的权重。由于计算时间的限制,训练是在多个会话中进行的。

然而,在每个会话中,我都会重新运行代码,包括将数据随机划分为训练和验证集的部分,因此每次训练的训练集并不相同。为了避免这种情况,可以设置一个种子来划分训练/验证组,而这是我没有提前采取的措施。

尽管每次的训练数据都不同,但模型的权重却被传递了下来。经过足够的训练后,模型接触到了整个数据集。

注意这个数据科学错误,避免30多个小时的无用功……

由于机器学习模型本身具有惰性,模型会选择记忆数据,而不是学习。这种现象多次发生,因此当遇到未见过的数据时,模型就会无能为力。

因为模型在之前的训练中见过验证数据,所以才能得到接近完美的0.9968,让我误以为这是模型的真实能力。如果回想模型早期的表现,思考为什么验证分数高于训练分数,就会明白这是一个奇怪且罕见的现象。

因此,在今后的实践中,大家要牢记这一重要教训:如果结果过于完美,值得怀疑,那很可能是结果有问题。

数据泄露的其他类型包括:

  • 预处理:如果在数据拆分前进行预处理,可能导致信息泄漏。例如,在整个数据集中使用均值等方法,训练集可能包含验证集的信息,反之亦然。
  • 时间:如果问题涉及时间,简单的随机训练/验证拆分是无效的。举例来说,如果要基于A和B预测C,则应在[A,B]上训练模型,而不是在[C,A]上训练,因为模型会知道C的值。

在结果过于完美时,三思而后行是个好习惯,同时也需注意细节。比如,分数的增加幅度可能很大,但不一定是奇怪的现象;而当模型对测试数据的预测性能很差时,则需要引起警惕。

实际上,最好的办法是明确数据的分割目的,确保将数据划分为训练/验证/测试集,并尽早进行。此外,设置种子是重要的保障。

从更宽广的角度看,数据泄露有时是有益的。如果模型见到了不该见到的数据,但这些数据有助于提升其学习能力,那么数据泄露可能是正面的。

例如,某些竞赛系统由公共排行榜和私人排行榜组成。比赛结束前,用户可以访问所有训练数据和部分测试数据(通常为25%),以确定公共排行榜上的位置。但比赛结束后,剩余的75%测试内容将用于评估模型,决定最终的私人排行榜。

注意这个数据科学错误,避免30多个小时的无用功……

如果能利用这25%的测试内容提高私人排行榜的分数,那就算是数据泄露。

注意这个数据科学错误,避免30多个小时的无用功……

在竞赛中,相对常见的做法是利用了解的25%测试数据对75%测试数据进行处理,比如使用PCA降维。这通常会提升模型性能,因为一般来说,数据越多越好。

我们应该不断寻找提高数据关联性的方法,永远不要将复杂事件简单地标记为纯粹的坏或好。

总之,数据科学家应致力于为模型提供更多的数据,同时区分不同用途的数据。此外,为了不让期望落空,应该保持谨慎的态度。毕竟,只有预期最差的结果,才能淡定面对问题,欣喜面对成功。