编译:Don、维克多、琰琰近日,Michael A. Lones教授在arXiv提交了一篇论文,全面论述了机器学习在实际应用中的常见陷阱以及对应方法,以帮助机器学习的学术小白们快速入门。论文地址://arxiv.org/pdf/2108.02497.pdfMichael A. Lones是爱丁堡赫瑞瓦特大学数学与计算机科学系副教授,主要研究研究涵盖优化、数据挖掘、医学信息学、系统生物学和非标准计算等。作为一名资深机器学习领域专家,Michael 更关注学术界,而非工业界(工业界水太深,还得教会你怎么劝酒哈哈)。这篇论文的经验分享,是他在实际的机器学习教学和研究中积累的知识。不同于其他普遍的机器学习方法,本文仅反映学术界关注的一些重点问题,比如如何严谨地评估和比较机器学习模型,如何在论文中更好的论述自己的工作等。为了使本文更加生动和易读,Michael 采用了简单明了的“该做什么,不该做什么”的编写风格来,以免大家还得费劲巴拉的“总结本段大意、总结文章大意”。总体来看,本文更侧重于学术研究背景下的常见问题,比如学术狗们需要在论文里同时对若干种方法进行严格的论述和比较,并从现象中挖掘出有效的结论,升华工作的深度和内在。具体而言,它涵盖了机器学习的五个阶段:
如果信噪比较高,也就是有效信息的比例较高的话,模型只需要较少的数据就能学到这种关联性;但如果数据集的信噪比很低,噪声太大,就需要用特别多的数据才能教会模型。但实际情况是,数据获取的成本太昂贵了,我们通常无法得到更多的数据,这个问题普遍存在于机器学习的各个领域。此时便可以使用交叉验证来更高效地利用有限的数据。当然,我们还可以使用数据增强技术(可见[Wong et al., 2016, Shorten and Khoshgoftaar, 2019])来增加数据量,这种技术对于提升小数据集上的机器学习性能是相当有效的,尤其是在数据集类别不平衡时,也就是某些子类的数据量有限的情况下。类别不平衡通常是指某些类别的样本量会比其他类别少,相关研究可见Haixiang等人[2017]的处理方法。如果数据量也十分有限,还要控制好机器学习模型的复杂度,别引入太多的参数。比如像深度学习网络,很多大模型的参数量可能会轻轻松松超过小数据集中的样本量。总之,无论是通过哪种解决方法,最重要的是尽早发现数据量的问题,并提出一个合适的方案缓解它。
例如,在数据准备期间,使用整个数据集的均均值和方差对原始数据进行缩放或者归一化。但实际上我们应该只能用训练集的均值和方差对数据进行预处理,测试集中的数据是不能参与均值方差的计算的。其他常见的信息泄漏情况是在划分数据之前就进行了特征选择,以及使用相同的测试数据集来评估多个模型的通用型。 为了避免发生这些问题,我们应该在项目伊始就划分出一个独立的数据子集,并在项目结束的时候只用这个独立的数据子集来评估一个单一模型的通用型。更详细的讨论可以参考[Cawley and Talbot, 2010]和[Kaufman et al., 2012]的论述。
比如Python(Scikit-learn[Varoquaux等人,2015])、R语言(如caret[Kuhn,2015])、Julia(如MLJ[Blaom等人,2020])等,它们能够很轻松的对模型进行参数的搜索、超参的调整和比较,从而低成本地生成多个模型。所以何乐而不为呢?多尝试一些模型,找出哪个最有效。在“没有免费的午餐”定律中,重要的是如何避免“NIH综合症(not invented here syndrome)”,它是指人们不愿意使用、购买或者接受某种产品、研究成果或者知识,不是出于技术或者法律等因素,而只是因为它源自其他地方,可以理解成一种傲慢和偏见。放在自己的系统中,就是避免由于自大和狂妄,导致忽略那些不是自己所提的改进点上带来的改进。这可能会导致我们忽略对某个特定问题的最佳模型。
超参数指影响的是模型配置的预设参数。许多模型都有超参数,比如支持向量机中的核函数、随机森林中的树,以及神经网络的架构。大部分超参数都会显著影响模型性能,并且没有“一刀切”的解决方法。也就是说,它们需要适合的特定数据集,以最大限度地利用模型。 随机搜索和网格搜索是目前常用的超参数优化策略,这两种策略虽然编写简单,但很难扩展到大量超参数或训练成本很高的模型中。因此,我们还需要探索更智能的搜索最佳配置的工具,相关研究可参考[Yang and Shami,2020]。此外,除了数据挖掘管道的其他部分外,我们还可以使用AutoML技术优化模型及其超参数的选择,相关综述可参见[He,2021]等人的工作。
5. 优化超参数和特征选择时要小心
2018年Cai等人的调查已经发现,特征选择是模型训练的一个常见阶段。一般而言,执行超参数优化和特征选择的关键,在于要将其视为模型训练的一部分,而不是在模型训练之前对其进行操作。但事实上,我们经常就是在模型训练开始之前对整个数据集进行特征选择,而这将会导致测试集的信息提前泄漏给训练过程。理想情况下,如果要优化模型使用的超参数或特征,应使用与训练模型完全相同的数据。实现这一点的常用技术是嵌套交叉验证(也称为双交叉验证),它涉及到在主交叉验证循环内作为额外循环进行超参数优化和特征选择。相关研究可参见[Cawley and Talbot,2010]。
首先,工作要尽可能的透明,给别人“站在你肩膀上”的机会。用通俗易懂的方式分享模型是非常好的方式,例如你能用一个脚本实现论文中所有实验,那么在发表论文时候,请分享这个脚本,这可以让其他人轻松复现,同时也能增加你的信心。 这也会促使你更加小心的做研究,写出更加干净的代码,仔细的记录实验。值得一提的是,可重复性在机器学习社区被提到的次数越来越多,所以不透明的工作可能在未来无法发表。如何提高机器学习研究的可重复性:[Pineau et al., 2020]//arxiv.org/abs/2003.12206
2. 用多种方式体现结论
在评估和比较模型的时候,使用多个数据集进行测试是一种严谨的方法。这有助于克服单个数据集的缺陷,并有助于模型的完整性描述。另外,采用多个指标报告模型在数据集上表现,也能从不同的角度说明模型的性能。例如,如果决定用准确率衡量模型,那么如果加上对“类别失衡不太敏感”的指标则是极好的。如果使用部分指标,如精度、召回率、敏感度或特异度,也要包括一个能更全面地反映模型错误率的指标。此外,清晰、明确的指标也对解释模型有好处,例如如果报告AUC,请指明这是ROC曲线还是PR曲线下的区域。指标讨论请见[Blagec et al., 2020]//arxiv.org/abs/2008.02577
3. 数据支撑论据
为了避免其他研究员误入歧途,所以请不要提出无效的结论。一个常见的错误是:论文陈述背后没有训练和测试数据支撑。一个模型在某个数据集上表现优秀,并不意味着在其他数据集上也表现良好。所以,能从实验研究中推断出的东西总是有限的。一个重要原因是抽样偏差,即数据对真实世界并没有足够的代表性。另外,数据与数据之间可能存在重叠,非独立性的数据也有可能让模型产生偏差。 因此,不要过分渲染你的发现,并意识到其局限性。机器学习社区数据集调查:[Paullada et al., 2020]//arxiv.org/abs/2012.05345
4.谨慎使用统计检验
统计检验并不完美,保守的方法倾向于低估;自由(liberal)的方法倾向于高估。所以一个现实积极结果的测试并不总代表有意义,消极的测试结果也并不代表无意义。除了统计学意义之外,另一个需要考虑的问题是两个模型之间的差异是否真正重要。如果你有足够的样本,即使实际的性能差异微不足道,也可以找到显著的差异。所以,为了更好地说明某件事情是否重要,可以测量效应大小。常见的方法例如Cohen’s d统计、Kolmogorov-Smirnov等等。 p值的讨论参见[Betensky, 2019]://www.tandfonline.com/doi/full/10.1080/00031305.2018.1529624 5.洞察模型训练过的模型包含很多有用的信息。但许多研究者只说模型的性能指标,并没有对模型实际学到的东西给出见解。请记住,研究的目的不是为了获得比别人高一点的准确率,而是为了产生知识和理解。如果你能做到这一点,你就能在更好的刊物上发表论文。 因此,请仔细观察模型,并尝试了解模型的输出。对于相对简单的模型,如决策树,提供模型的可视化也是有益的,并且大多数库都支持这一功能。对于复杂的模型,如深度神经网络,考虑使用可解释的人工智能(XAI)技术来提取知识,虽然不太可能弄清楚模型到底在做什么,但总有些有用的见解。 数据驱动、知识感知的可解释人工智能研究综述见[Li et al. [2020]]//ieeexplore.ieee.org/document/9050829