满篇都在说:不要水啦
还在学师阶段的研究生以及从业新手们,想在机器学习研究中少走弯路吗?
或许下面这篇论文可以帮到你:
《如何避免机器学习研究中的陷阱?一本给学术研究人员的指南》
作者是英国赫瑞-瓦特大学数学与计算机科学学院的副教授,同时也是爱丁堡机器人中心的成员,博士毕业已经十多年,这篇17页的论文主要介绍了机器学习学术研究中的一些常犯错误,以及如何避免。
指南共涵盖了机器学习过程的五大方面:建模前如何准备,如何建出可靠的模型,如何稳健地评估模型,如何公平地比较模型以及如何报告结果。
一位已经从业的机器学习研究员称赞该论文很有价值,因为文中提到的所有错误他在博士学习和工作期间中都遇到很多次。他准备让后面所有新入职的工程师都好好看看。
不少人则认为该指南的意见可能并不受欢迎,因为很多都是研究人员本该知道的基本常识,比如多次重复实验并报告平均值和方差进行严格比较,但他们就是为了方便或者让数据更好看而选择性忽视。
下面就详细看看作者都提了哪些常见错误。
建模前的准备
为了得到符合预期用途的模型、可以顺利发表论文的结果,建模之前你需要做好以下6点准备:
1、确保花时间研究你要用的数据集,来源可靠、质量有保证。
2、但不要查看测试数据,防止先入为主做出某些假设导致最终模型通用性差。
3、保证数据量足够大,当然保证不了也是常有的事儿,解决办法:
比如评估模型时交叉验证数据、采用数据扩充技术(数据集中某类数据不够时也可采用)。
但总的来说,数据不够模型就不能设计得太复杂,不然分分钟给你过拟合。
4、要和相关领域专家谈谈,防止研究脱离实际,并且他们也可以帮助你向最合适的期刊/受众发表。
5、搜遍相关文献,虽然发现别人已经研究过了很沮丧,但是写论文时你该怎么解释为什么要覆盖相同的领域。
6、一定要提前考虑模型部署的问题:大部分学术研究最终都是要落地吧?好好考虑落地场景的资源、时间限制等问题来设计模型。
如何建出可靠的模型
1、不要让测试数据参与到训练过程中(这点前面也已强调过)。
2、尝试不同的ML模型,别套用,具体问题具体分析找出最适合解决你的问题的那个。
“凑合”的例子包括将期望分类特征的模型应用于由数字特征组成的数据集、将假定变量之间没有依赖关系的模型应用于时间序列数据,或者只相信最新的模型(旧的不一定不合适)。
3、一定要优化模型的超参数。使用某种超参数优化策略比较好,这样在写论文时也好整。除了数据挖掘实践之外,可以使用AutoML技术优化模型及其超参数的配置。
4、在执行超参数优化和特征选择要小心:防止测试集“泄漏”,不要在模型训练开始之前对整个数据集进行特征选择。理想情况下应使用与训练模型所用数据完全相同的数据。
实现这一点的常用技术是嵌套交叉验证(也称为双交叉验证)。
如何稳健地评估模型
对模型进行不公平的评估,很容易让学术研究的水变浑浊。
作者一共提了5点:
1、一个模型在训练集上的表现几乎毫无意义,保证测试集与训练集之间的独立。
2、在连续迭代多个模型,用前面的数据指导下一个的配置时使用验证集,千万不要让测试集参与进来。可以根据验证集对模型进行测量:当分数开始下降时,停止训练,因为这表明模型开始过拟合。
3、对模型多次评估,防止低估/高估性能。十次交叉验证是最标准的做法,对很小的数据类进行层化也很重要;需要报告多个评估的平均值和标准偏差;也建议保留单个分数记录,以防以后使用统计测试来比较模型。
4、保留一些测试数据以无偏评估最终的模型实例。
5、不要对不平衡的数据集使用准确度(accuracy)指标。这个指标常用于分类模型,不平衡数据集应采用kappa系数或马修斯相关系数(MCC)指标。
如何公平地比较模型
这是非常重要的一环,但很惊讶的是很多人都比不对,作者表示一定要确保在同一环境中评估不同的模型,探索多个视角,并正确使用统计测试。
1、一个更大的数字不意味着一个更好的模型。应将每个模型优化到同等程度,进行多次评估,然后使用统计测试确定性能差异是否显著。
2、要想让人相信你的模型好,一定要做统计测试。
3、进行多重比较时进行校正:如果你以95%的置信水平做20个成对测试,其中一个可能会给你错误的答案。这被称为多重性效应。最常见的解决方法是Bonferroni校正。
4、不要总是相信公共基准测试的结果。
使用基准数据集来评估新的ML模型已变得司空见惯,你以为这会让结果更透明,实际上:
如果测试集的访问不受限,你没法确保别人没有在训练过程中使用它;被多次使用的公共测试集上的许多模型可能会与之过度匹配;最终都会导致结果乐观。
5、考虑组合模型。
如何报告结果
学术研究的目的不是自我膨胀,而是一个贡献知识的机会。为了有效地贡献你的想法,你需要提供研究的全貌,包括哪些有效哪些无效。
1、保持你所做所发现的成果透明,这会方便其他人更容易地在你的工作基础上扩展。共享你的代码也会让你在coding的时候更认真。
2、提供多个测试集上的报告,为每个数据集报告多个度量指标(如果你报告F值,请明确这是F1得分还是精度和召回率之间的其他平衡;如果报告AUC,请指出这是ROC曲线下的面积还是PR下的);
3、不要在结果之外泛化,不要夸大,意识到数据的局限性。
4、报告统计显著性时一定要小心:统计人员越来越多地认为,最好不要使用阈值,而只报告p值,让读者来解释这些值。
除了统计意义之外,另一件需要考虑的事是两个模型之间的差异是否真正重要。
5、最后,再回过头完整的看一眼你的模型,除了报告性能指标,看看它能解决多少实际问题。
以上就是所有的内容,作者表示,部分意见可能有争议,内文也并非详尽无遗,因此提供了很多参考链接供大家进一步参考。
另外理论总是落后于实践,我们今天认为正确的东西明天可能不正确,因此大家都要以开放的心态面对机器学习,紧跟最新技术进展,谦虚地接受新知识。
更多意见欢迎在评论区补充。
指南地址:
https://arxiv.org/abs/2108.02497
参考链接:
https://www.reddit.com/r/MachineLearning/comments/ozuphh/r_how_to_avoid_machine_learning_pitfalls_a_guide/