社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

英国AI学者Michael Lones独家避坑指南,破解机器学习五大陷阱

大数据文摘 • 3 年前 • 618 次点击  
大数据文摘授权转载自AI科技评论
编译:Don、维克多、琰琰

近日,Michael A. Lones教授在arXiv提交了一篇论文,全面论述了机器学习在实际应用中的常见陷阱以及对应方法,以帮助机器学习的学术小白们快速入门。

论文地址:

https://arxiv.org/pdf/2108.02497.pdf


Michael A. Lones是爱丁堡赫瑞瓦特大学数学与计算机科学系副教授,主要研究研究涵盖优化、数据挖掘、医学信息学、系统生物学和非标准计算等。

作为一名资深机器学习领域专家,Michael 更关注学术界,而非工业界(工业界水太深,还得教会你怎么劝酒哈哈)。这篇论文的经验分享,是他在实际的机器学习教学和研究中积累的知识。不同于其他普遍的机器学习方法,本文仅反映学术界关注的一些重点问题,比如如何严谨地评估和比较机器学习模型,如何在论文中更好的论述自己的工作等。

为了使本文更加生动和易读,Michael 采用了简单明了的“该做什么,不该做什么”的编写风格来,以免大家还得费劲巴拉的“总结本段大意、总结文章大意”。

总体来看,本文更侧重于学术研究背景下的常见问题,比如学术狗们需要在论文里同时对若干种方法进行严格的论述和比较,并从现象中挖掘出有效的结论,升华工作的深度和内在。

具体而言,它涵盖了机器学习的五个阶段:
  • 在建立模型之前要做什么准备?
  • 如何可靠地建立模型
  • 如何正确全面而稳健地评估模型
  • 如何客观地比较模型
  • 如何汇总、分析现象,形成结论并提出观点

构建模型前的准备


很多人在接到一个项目或者研究需求的时候,会火急火燎的写代码、训练模型、评估模型,好像一天就要把所有的事儿都给干完。但其实我们应该慢下来,首先要花时间思考这个项目的目标,分解它的需求,并且踏下心来细细查看要输入模型的数据,想想这些数据有没有什么规律?潜规则?或者限制?


此外,我们还得花点心思了解一下这个领域的研究进展,其他工作已经做过哪些尝试,结果如何。如果不做这些前期的准备,直接上来就写代码,最终很可能会得到一些重复的结论,训练出一套无法满足预期的模型,还会掉进别人已经陷进去的坑里。这样浪费时间不说,还无法发表自己的论文。

1.多花时间了解一下手中的数据

我们做研究的目的就是发表论文。如果收集的数据质量很高,噪声没有特别明显;采集的设备和方法也十分可靠,那么发论文就容易多了。

举例来说,如果从网上下载的数据集,一定确保其来源的可靠性;如果是一篇论文中开源的,一定要认真去读这篇论文,确保它不是发表在野鸡会议/野鸡期刊上的文章,而是一些比较靠谱的来源。

此外,我们要检查文章中有没有提到过数据集的局限性。千万不要以为一个数据集被很多篇论文引用过,它的质量就很好。有时候人们可能仅仅是因为这个数据集的获取成本低,下载速度快,或者不用给作者发送索取邮件,而去用一些质量稍差的数据。事实上,很多在学术界被广泛使用的数据集也存在很大局限性。具体的论述可以去看[Paullada等人,2020]的讨论。

如果用质量很差的数据集训练模型,训练出的模型性能大概率也很差,我们称其为“Garbage in Garbage out,垃圾进垃圾出”。因此,在项目开始的时候,我们要确保数据的可用性,保证它是有意义的。对此,建议去做一些探索性的数据分析,至于如何发现并处理原始数据集的缺失项和数据点不一致的问题,可以看看[Cox2017]的工作。

千万别犯懒,在训练模型之前对数据进行处理的成本,是整个机器学习流程中最低的,也是最容易的。至少,我们不用回头再跟导师或者论文评委掰扯为什么使用了质量不好的数据集。

2.别偷看测试集的数据

观察原始数据的质量和模式是机器学习过程的好习惯,毕竟知道根基才知道如何搭建上层建筑嘛。当我们观察数据时,很可能从中“悟到一些什么”,并且将它们变成先验知识固化在我们的脑海中。这些模式和知识会指导我们进行正确的建模和数据处理。

但是,在这个过程中,要注意千万不要作出一些“不可检验的假设”,这些不可检验的假设如何被放进模型中,可能会将仅出现在测试集中的信息偷偷泄露给模型。在这里,“不可侧视”这一点很重要。我们可以根据数据做出一些假设,但是这些假设应该都是从训练集中得到的,绝对不能从测试集中偷窥。

为了保证这一点,在最初的探索性分析阶段,我们应该避免对测试集进行观察和分析,否则很可能会自觉或不自觉的做出一些假设,以一种无法测试的方法限制模型的通用性。关于这一点我在下文中也多次提到的问题,因为一旦测试集的信息泄漏到训练过程,机器学习模型的泛化能力将会遭遇灾难性的打击。 

3.确保数据量是足够的

如果没有足够的数据,就不可能训练出一个泛化能力强的模型。从复杂且掺有噪声的数据中抽丝剥茧总结规律可不是一件容易事儿,这项任务极具挑战,这种关系在建立模型之前可能隐藏的极深。这种关联的深浅完全取决于数据集中的有效信息和噪声的比例,也就是所谓的信噪比。



如果信噪比较高,也就是有效信息的比例较高的话,模型只需要较少的数据就能学到这种关联性;但如果数据集的信噪比很低,噪声太大,就需要用特别多的数据才能教会模型。但实际情况是,数据获取的成本太昂贵了,我们通常无法得到更多的数据,这个问题普遍存在于机器学习的各个领域。此时便可以使用交叉验证来更高效地利用有限的数据。

当然,我们还可以使用数据增强技术(可见[Wong et al., 2016, Shorten and Khoshgoftaar, 2019])来增加数据量,这种技术对于提升小数据集上的机器学习性能是相当有效的,尤其是在数据集类别不平衡时,也就是某些子类的数据量有限的情况下。类别不平衡通常是指某些类别的样本量会比其他类别少,相关研究可见Haixiang等人[2017]的处理方法。

如果数据量也十分有限,还要控制好机器学习模型的复杂度,别引入太多的参数。比如像深度学习网络,很多大模型的参数量可能会轻轻松松超过小数据集中的样本量。总之,无论是通过哪种解决方法,最重要的是尽早发现数据量的问题,并提出一个合适的方案缓解它。  

4.和领域专家好好聊聊

领域专家的经验都是十分宝贵,他们可以帮我们了解这个领域中需要解决的问题,帮助我们选择合适的特征集以及机器学习模型,帮助我们把模型介绍给最需要和最适合的人等等。


如果在建立模型的时,没有征求过领域专家的意见,很可能会导致项目无法聚焦到痛点问题上,或者不能以最合适最精炼的姿势解决问题。一个常见的例子就是,在智慧健康领域或者智能财务系统领域,我们需要用黑盒算法来帮助医生进行诊断或者财务决策,由于领域的特殊性,我们必须要了解这些算法是如何得出结论的,因为这关系到人命和金钱。

在这两个场景中,领域专家就是十分重要。他们会帮我们在项目开始之初就理解数据,指出可能具有相关性和预测性的特征。在项目结束时,还能帮我们在相关的领域期刊上发表论文,让我们有机会接触到研究中的最可能的用户们。

5.认真看看领域的发展现状


我们很难发现一些新研究课题或方向,更多的时候都是在前人挖的坑中灌水(跟随研究)。所以得花时间了解一下前人做过的研究,学习他们的研究计划和思路,以及使用的方法论是非常必要的。

学术就是一个圈,和别人在一个坑里灌水再正常不过,这不是一件坏事儿,因为学术的进步通常是一个个迭代的过程,每一个研究的进步都能为后人带来很多启发和指导。当然,有时候我们想到一个新的idea,欣喜若狂,开始要大干一场的时候,突然发现已经有人做过了类似的研究,不免沮丧失望,但是也有可能他们的研究没有尽善尽美,还留下一些其他方向的漏洞。此时,这些已经有的研究就能成为我们研究的理由和动机。

而如果我们忽略前人的研究,有可能会过错很多有价值的信息。比如,有人可能已经尝试过你的想法,并且验证了这个idea不靠谱,还给出了特别详实的论述和讨论,那其实这篇论文是为你节省了好几年的时间,不用在此浪费时间和精力。又或者有些工作已经将你的想法的一部分或者全部做过了,也别灰心,你完全可以在他们的基础上继续努力。

因此,在开始工作之前,一定要去做一个文献的调研和汇总,最好能输出一篇综述并形成观点。如果做综述太晚,可能意味着在写论文时,要争先恐后、不厌其烦地解释为什么要用跟前人一样的方法来搭建现在这套系统,分明人家已经做过了,还要自己重新做的原因是什么。

6.想想你的模型要怎么实际跑起来

我们为什么要建立一个机器学习模型?这是一个灵魂追问,它的答案会直接影响到模型开发的过程。许多学术工作仅仅是做研究,而不是真的要将它用于工业界实际部署运行。这无可厚非,因为建立和分析模型的过程本身就可以对问题提供非常有用的洞察力。

然而,对于很多学术研究来说,他们的最终目标是产生一个可以在现实世界中部署和运行的机器学习模型。如果是这种情况,我们就需要尽早去考虑部署的问题。例如,如果我们想要将模型部署在一个计算和存储资源都十分有限的环境中(传感器节点或者机器人硬件),受制于运行的平台资源,模型的复杂度可能不能太大。又比如,当我们的应用场景对运行时间有着严格的限制,需要在几毫秒内完成数据计算的话,选择模型和验证的过程时要重点考虑这一点。

另一个考虑因素是,如何将模型和所部署的底层软件系统有机而高效地组织起来。这个过程通常没有想象中的那么简单(见[Sculley等人,2015])。但一些新型的方法已经在尝试解决这些困难,比如ML Ops[Tamburri, 2020]。

如何可靠地建立模型


写代码构建机器学习模型是机器学习开发过程中最让人开心的一部分。当我们安装完简单易用的文档和功能齐全的机器学习包(或者叫框架)后,会很容易搭建出一个模型,然后轻轻松松的将数据喂进去,看看出来的是个什么妖魔鬼怪。有时候训练出来的效果不好,从而导致模型一片糟糕。这种问题通常还很难定位和反推,找不到问题出现在哪个环节。

因此,我们需要用一种有组织、有规律、可溯源的方式来建立模型,这既能帮我们确定如何正确使用原始数据,也能帮我们理清模型构建时候的各种选择。 

1.千万别让测试集数据泄漏训练过程中去

在机器学习开发的生命周期中,衡量模型性能是一项十分重要的任务。对模型而言,客观准确的评估模型的泛化程度事关重大。但是在实际的研究和开发中,一个常见的问题是测试集会泄漏到模型的配置、训练或者选择过程中。当这种情况发生的时候,测试数据集就不能用于客观地衡量模型的能力。这也是很多工作中的模型看似强悍,但一旦用在真实世界中就趴窝的常见原因。有很多方法会导致测试集数据泄漏,其中有一些披着一张人畜无害的面具,极具迷惑性。 


例如,在数据准备期间,使用整个数据集的均均值和方差对原始数据进行缩放或者归一化。但实际上我们应该只能用训练集的均值和方差对数据进行预处理,测试集中的数据是不能参与均值方差的计算的。其他常见的信息泄漏情况是在划分数据之前就进行了特征选择,以及使用相同的测试数据集来评估多个模型的通用型。

为了避免发生这些问题,我们应该在项目伊始就划分出一个独立的数据子集,并在项目结束的时候只用这个独立的数据子集来评估一个单一模型的通用型。更详细的讨论可以参考[Cawley and Talbot, 2010]和[Kaufman et al., 2012]的论述。

2. 尝试用一系列不同的模型

一般来说,没有任何的模型是“万金油”,也就是没有哪个模型能同时在速度、模型大小、精度、精确率、召回率等方面都做到最好。一定还有个模型能在某一方面或某几个方面超过它。这一点在“没有免费的午餐”定律中能够得到很好的体现。这个定理表明,在考虑所有可能的指标和优缺点时,没有任何一种机器学习方法能够全面优于其他方法[Wolpert, 2002]。 

因此,我们在设计和训练机器学习模型的时候,主要目标是去找到那个对当前特定问题最有效最可用的机器学习模型。这个过程中可能会有一些先验的知识能够提供指导,但是大多数情况下都只能在黑暗中摸索。幸运的是,我们现在已经有了很多高级语言的工具包。


比如Python(Scikit-learn[Varoquaux等人,2015])、R语言(如caret[Kuhn,2015])、Julia(如MLJ[Blaom等人,2020])等,它们能够很轻松的对模型进行参数的搜索、超参的调整和比较,从而低成本地生成多个模型。

所以何乐而不为呢?多尝试一些模型,找出哪个最有效。在“没有免费的午餐”定律中,重要的是如何避免“NIH综合症(not invented here syndrome)”,它是指人们不愿意使用、购买或者接受某种产品、研究成果或者知识,不是出于技术或者法律等因素,而只是因为它源自其他地方,可以理解成一种傲慢和偏见。放在自己的系统中,就是避免由于自大和狂妄,导致忽略那些不是自己所提的改进点上带来的改进。这可能会导致我们忽略对某个特定问题的最佳模型。

3.别用不合适的模型

由于获取一些机器学习工具过于方便了,我们在做一些实验或者构建模型的成本特别的低,而忽略了模型背后的计算机制和应用背景是否合适。因此,我们很可能会将一些不合适的模型应用到数据集上。比如将本具有类别性质的标签(比如1代表男,2代表女)当作具有数值含义的标签(比如1代表1米,2代表2米)给到模型中,或者错将时间序列数据输入到不同时刻输入上没有依赖关系的模型当中。这一点在写论文的时候应该尤其注意,因为选择了不恰当的模型会让评委感觉很不专业,在理论上也很难讲通。 

此外,我们应该避免使用一些不必要的复杂模型。如果数据有限,同时业务也没有特别的麻烦,其相关关系也很好理解和表达,可以选择不使用深度学习。最后,别用“这个模型结构是新的”作为选择的理由,因为老的、成熟的模型历久弥坚,它们经历了风雨洗礼,其鲁棒性和可用性通常要比新模型更靠谱。 

4. 一定要优化模型的超参数

超参数指影响的是模型配置的预设参数。许多模型都有超参数,比如支持向量机中的核函数、随机森林中的树,以及神经网络的架构。大部分超参数都会显著影响模型性能,并且没有“一刀切”的解决方法。也就是说,它们需要适合的特定数据集,以最大限度地利用模型。 

随机搜索和网格搜索是目前常用的超参数优化策略,这两种策略虽然编写简单,但很难扩展到大量超参数或训练成本很高的模型中。因此,我们还需要探索更智能的搜索最佳配置的工具,相关研究可参考[Yang and Shami,2020]。此外,除了数据挖掘管道的其他部分外,我们还可以使用AutoML技术优化模型及其超参数的选择,相关综述可参见[He,2021]等人的工作。

5. 优化超参数和特征选择时要小心 

2018年Cai等人的调查已经发现,特征选择是模型训练的一个常见阶段。一般而言,执行超参数优化和特征选择的关键,在于要将其视为模型训练的一部分,而不是在模型训练之前对其进行操作。但事实上,我们经常就是在模型训练开始之前对整个数据集进行特征选择,而这将会导致测试集的信息提前泄漏给训练过程。

理想情况下,如果要优化模型使用的超参数或特征,应使用与训练模型完全相同的数据。实现这一点的常用技术是嵌套交叉验证(也称为双交叉验证),它涉及到在主交叉验证循环内作为额外循环进行超参数优化和特征选择。相关研究可参见[Cawley and Talbot,2010]。


如何合理地评估模型


为了推动研究领域的进步,或者推导出可靠的结论,很多研究员可能会对ML模型做出不公平的评估,这样做无疑会使学术进步变得“浑浊”。因此,我们应该仔细考虑如何在实验中使用数据,如何测量模型的真实性能,以及如何以有意义且信息丰富的方式报告模型的真实性能。


1. 务必使用适当的测试集

我们通常使用测试集来测量ML模型的泛化性。因为即便一个复杂的模型能够完全学习训练数据,也不一定能捕获任何可泛化的知识。因此,测试模型在训练集上的表现如何几乎毫无意义。确保测试数据集的合理性非常重要,这要求它应该覆盖更广泛的目标人群,且不能与训练数据集重合。

举个例子,如果训练集和测试集中同时有一张天气晴朗的图片,这种相同天气条件的数据,意味着测试集不是独立的,并且因没有捕获更广泛的天气条件,而不具有代表性。当我们使用单个设备收集训练和测试数据时,经常会出现类似的情况。即使模型过度学习了一个设备的特性,很可能也不会泛化到其他设备上,并且在测试集上进行评估时也无法检测到。

2. 务必使用验证集

连续训练多个模型并不罕见,研究人员经常使用获得的模型性能知识来指导下一个模型的配置。在执行这项操作时,注意一定不要使用测试数据集,而要使用单独的验证数据集。验证集包含的样本,并不直接用于训练,而是用于指导训练。如果采用测试集来衡量模型性能,它将成为训练过程的一个隐式部分,并且不能作为模型通用性的独立度量——模型将逐渐过度拟合测试集(见[Cawley and Talbot,2010])。

此外,创建一个独立验证集的好处是可以随时停止训练。在训练单个模型的时,使用验证集测量模型的每次迭代过程,如果验证分数开始下降,表明模型开始过度拟合训练数据,我们可以及时停止训练。

3. 反复评估模型

许多ML模型是不稳定的。如果对模型进行多次训练,或者对训练数据进行微小更改,很可能导致模型性能的显著变化。因此,对模型的单一评估是不可靠的,可能会低估或高估模型的真实性能。常见的解决思路是,使用不同训练数据集的子集对模型进行多次训练。 

交叉验证法(CV)使用最为广泛,并且推出了很多变种(见[Arlot等人,2010])。标准CV训练要重复十次以上,如果在此基础上,将整个CV过程按不同的类别进行数据划分进行可以显著增加训练的严谨性,尤其是在数据类别很少的情况下,它可以确保每个类在每次折叠中都有充分的表示。 

另外,除了评估的多个平均值和标准偏差外,也建议保留单个分数的记录,以便之后使用统计测试来比较模型。

4.保留一些数据,用于评估模型的实例

评估一般模型的性能(如神经网络解决问题的能力)和特定模型实例的性能(如通过一次反向传播产生的特定神经网络)之间有一个重要的区别。常用的交叉验证的方法,通常更适用于前者,而不适用于后者。比如,十次交叉验证会产生10个模型实例,假设选择测试折叠分数最高的实例作为实践中使用的模型。在这种情况下,要如何报告模型的性能?

有人可能认为测试分数是衡量模型性能的可靠指标,但事实上并非如此。首先,单次折叠中的数据量相对较小。其次,得分最高的实例很可能是测试次数最简单的实例,也就是说,它包含的评估数据并不具有代表性。因此,估计模型实例的通用性的可靠且唯一的方法是使用另一个测试集。因此,最好单独创建一个数据集,专门为最终选定的模型实例进行无偏估计。

5.不平衡的数据集不要使用“准确率”

研究人员应该注意使用哪些度量来评估ML模型。对于分类模型,最常用的度量是准确率(accuracy),即模型正确分类的数据集中样本的比例。如果分类是平衡的,即每个类在数据集中有相似数量的样本,那么这种方法是可行的。但如果数据集是不平衡的,那么准确率可能会成为一个误导指标。

例如一个数据集中,90%的样本代表同一个类,10%代表另一个类。一个总是输出第一个类的二元分类器,无论输入的是什么,它的准确率都将达到90%,这样的数据是没有意义的。在这种情况下,最好使用Cohen的kappa系数(κ)或Matthews相关系数(MCC)等指标,这两种指标对样本规模的不平衡相对不敏感。关于更多处理不平衡数据的方法请参见Haixiang等人[2017]。

公平比较模型


比较模型是学术研究的基础。如果进行了不公平的比较,那么其他研究人员可能随后就会被误导。因此,一定要确保在相同的环境中评估不同的模型,探索多个角度,并正确使用统计检验。


1.数字越大,效果越好?

在某些学术论文中,通常会这样写:以前的研究准确率是94%,我们论文中的模型准确率达到了95%,因此我们是SOTA。但是,有很多证据都能证明,“堆数字”的模型并不是好模型。例如,如果模型的训练集和测试集来自同一数据的不同部分,那么模型的“数字表现好”的原因不言而喻。

另一个不妥之处在于:论文在比较模型的时候,对所比较的模型,往往没有设置相同的超参数优化。例如,一个使用默认设置,一个使用优化参数。

因此,为了公平起见,作为研究者的你,至少应该将“对比模型”的参数进行相同的优化,然后进行多次评估,从而确定模型之间性能差异是否显著。

2. 比较模型的时候,如何使用统计检验


一般而言,统计测试(statistical test)是比较模型差异的绝好工具。有两类,一类用于比较简单的机器学习模型,例如配对卡方检验(McNemar’s test)可以比较两个分类器;另一类适用于大多数情况,例如评估某种数据类型是用神经网络还是决策树进行处理的时候,交叉验证、重复采样等等是比较适合的方法。

另外,比较模型产生的结果符合何种概率分布,T分布检验是常用的方式,实际上Mann-Whitney's U检验更加适用,因为它放松了数据分布的假设。

更多方法参见:
[Raschka, 2020]
https://arxiv.org/abs/1811.12808
[Carrasco et al., 2020].
https://linkinghub.elsevier.com/retrieve/pii/S2210650219302639
 

3. 如何看待多重比较?


当采用统计方法比较两个以上的模型时候,事情有点复杂。因为,采用多次配比检验(multiple pairwise tests)会产生和多次使用测试集类似的缺点:导致对显著性过度乐观。因为,在对两个模型进行统计检验的时候,置信度通常设定为95%,这意味着每20次检验,会有一次出现“迷惑”结果。

如果是单一的比较,这种不确定性或许可以接受。但如果是多个模型,多次比较,那么统计检验的不确定性会累积。 

上述现象也被称为:多重效应(multiplicity effect)会导致导致所谓的‘p-hacking’(通常增加样本容量)和‘data dredging’做法,强调搜索小的p值而不是统计科学推理。

为了解决这个问题,可以采用多重检验的校正。最常见的方法是Bonferroni校正,可以根据正在进行的测试的数量来降低显著性阈值。

此外,还有更多的校正方法,见:
[Streiner,2015]
https://doi.org/10.3945/ajcn.115.113548.

4. 谨慎对待基准测试


在某些领域,用基准数据集评价机器学习模型是非常普遍的做法。其背后的思考是:如果每个人都用相同的数据进行训练和测试模型,那么模型性能的比较就会更加透明。 

但是,如果测试集的获取不受限制,那么就会有人把它作为训练集,从而导致高估模型。如果限制每个人只能使用一次测试集,但总体算下来机器学习社区使用了多次测试集,这样某些问题仍然没办法避免。

实际上,在同一测试集上评估多个模型,表现最好的模型可能刚好是过拟合的,因此无法得出SOTA的结论。 

在做研究的时候,应该小心解读基准数据集上的测试结果,不要认为性能的小幅度提高是显著的。

统计检验更多讨论参见:
[Paullada et al., 2020]
https://www.sciencedirect.com/science/article/abs/pii/S2210650219302639?via%3Dihub
 

5.请考虑组合模型 


机器学习有时候并不是选择题,更多的是组合题。不同的模型相互结合往往能产生巨大的性能提升。通过组合,可以用一个模型弥补另一个模型的弱点。这种组合在学术上有个名词叫做:集成学习(ensemble learning)。 

集成学习(ensemble learning)既可以从现有的训练过的模型中形成,也可以将基础模型作为一部分进行训练,其目的是为了创建一个多样化的模型选择。

集成学习在考虑如何结合不同的基础模型时,可以采用简单方法,如投票;也可以采用复杂方法,用机器学习模型聚合集成模型的输出。这种复杂方法通常被称为堆叠(stacking)。 

集合学习的方法参见:
[Dong et al., 2020]
https://doi.org/10.1007/s11704-019-8208-z

如何描述工作结论


学术研究的目的不是自我炫耀,而是为知识做边际贡献。因此需要对工作做完整的描述,包括哪些工作有效,哪些工作无效。机器学习通常是关于权衡,在某些方面优秀,往往意味着其他方面不达标,十全十美的模型十分罕见。 

1.透明、透明、还是透明! 


首先,工作要尽可能的透明,给别人“站在你肩膀上”的机会。用通俗易懂的方式分享模型是非常好的方式,例如你能用一个脚本实现论文中所有实验,那么在发表论文时候,请分享这个脚本,这可以让其他人轻松复现,同时也能增加你的信心。 

这也会促使你更加小心的做研究,写出更加干净的代码,仔细的记录实验。值得一提的是,可重复性在机器学习社区被提到的次数越来越多,所以不透明的工作可能在未来无法发表。

如何提高机器学习研究的可重复性:
[Pineau et al., 2020]
https://arxiv.org/abs/2003.12206
 

2. 用多种方式体现结论


在评估和比较模型的时候,使用多个数据集进行测试是一种严谨的方法。这有助于克服单个数据集的缺陷,并有助于模型的完整性描述。

另外,采用多个指标报告模型在数据集上表现,也能从不同的角度说明模型的性能。例如,如果决定用准确率衡量模型,那么如果加上对“类别失衡不太敏感”的指标则是极好的。如果使用部分指标,如精度、召回率、敏感度或特异度,也要包括一个能更全面地反映模型错误率的指标。

此外,清晰、明确的指标也对解释模型有好处,例如如果报告AUC,请指明这是ROC曲线还是PR曲线下的区域。

指标讨论请见[Blagec et al., 2020]
https://arxiv.org/abs/2008.02577

3. 数据支撑论据


为了避免其他研究员误入歧途,所以请不要提出无效的结论。一个常见的错误是:论文陈述背后没有训练和测试数据支撑。一个模型在某个数据集上表现优秀,并不意味着在其他数据集上也表现良好。

所以,能从实验研究中推断出的东西总是有限的。一个重要原因是抽样偏差,即数据对真实世界并没有足够的代表性。另外,数据与数据之间可能存在重叠,非独立性的数据也有可能让模型产生偏差。 

因此,不要过分渲染你的发现,并意识到其局限性。

机器学习社区数据集调查:
[Paullada et al., 2020]
https://arxiv.org/abs/2012.05345

4.谨慎使用统计检验


统计检验并不完美,保守的方法倾向于低估;自由(liberal)的方法倾向于高估。所以一个现实积极结果的测试并不总代表有意义,消极的测试结果也并不代表无意义。

除了统计学意义之外,另一个需要考虑的问题是两个模型之间的差异是否真正重要。如果你有足够的样本,即使实际的性能差异微不足道,也可以找到显著的差异。所以,为了更好地说明某件事情是否重要,可以测量效应大小。常见的方法例如Cohen's d统计、Kolmogorov-Smirnov等等。 

p值的讨论参见[Betensky, 2019]:
https://www.tandfonline.com/doi/full/10.1080/00031305.2018.1529624

5.洞察模型
 
训练过的模型包含很多有用的信息。但许多研究者只说模型的性能指标,并没有对模型实际学到的东西给出见解。请记住,研究的目的不是为了获得比别人高一点的准确率,而是为了产生知识和理解。如果你能做到这一点,你就能在更好的刊物上发表论文。 

因此,请仔细观察模型,并尝试了解模型的输出。对于相对简单的模型,如决策树,提供模型的可视化也是有益的,并且大多数库都支持这一功能。对于复杂的模型,如深度神经网络,考虑使用可解释的人工智能(XAI)技术来提取知识,虽然不太可能弄清楚模型到底在做什么,但总有些有用的见解。 

数据驱动、知识感知的可解释人工智能研究综述见[Li et al. [2020]]
https://ieeexplore.ieee.org/document/9050829

总结:开放心态


这份文档并没有囊括所有方面,有些建议还有未确定的结论。但文章中列举的一些错误事例,至少我们可以探讨,这也是研究的本质。

机器学习的理论总是滞后于实践,我们今天认为正确的事情,在明天看来或许是错误的。所以,请你以开放的心态对待机器学习:善于Fellow最新发展,谦虚接受你不懂的知识。 
 
原文链接:

https://arxiv.org/pdf/2108.02497v1.pdf



点「在看」的人都变好看了哦!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118375
 
618 次点击