如何避免机器学习陷阱:一份给研究员的指南(3) How to avoid machine learning pitfalls: a guide for academic researchers

上文:如何避免机器学习陷阱:一份给研究员的指南(2)


如何避免机器学习陷阱:一份给研究员的指南(3)

How to avoid machine learning pitfalls: a guide for academic researchers

Michael A. Lones*

4.5 不要在不平衡的数据集上计算准确率

最后,需要注意你用来衡量模型效果的指标。例如,在分类模型中,最常用的指标是准确率,即模型准确分类的样本在数据集中的占比。如果你的类别是平衡的,也就是各个类别的样本数据差不多,那么这种方法是有效的。但许多数据集是不平衡的,这种情况下,准确性可能是一个非常令人误解的指标。试想这样一个数据集,其中90%是一个类,10%是另一个类。一个二分类模型不管输入是啥总是判定输出为第一个类,准确率高达90%,这样的指标没啥用。这种情况下,更合适的是使用像Cohen’s kappa cofficient(k)矩阵,或者Matthews Correlation Coefficient(MCC)矩阵,这两种度量都对类别不平衡不敏感。对于不平衡数据的讨论还可以【看这里】。

5. 如何公平比较模型

学术研究的基础之一是比较不同模型,但要真正公平正确的比较是困难的。如果你进行了不公平的比较,而且发表出来,其他研究人员可能被引入歧途。所以,一定要确保在相同背景下评估不同模型,在不同角度进行探索,同时一定要正确使用统计验证。

5.1 不要认为数字大模型就好

经常能看到论文宣称“在过去研究中,达到了94%的准确率,而我们的模型能达到95%,因此我们的模型更好”。更高的数字并不表示更好的模型,可能的原因有很多。例如,模型在同一数据集上训练评估,但数据的划分并不相同,可能就造成性能上一些小的差异。如果你使用不同的数据集,那差异可能巨大。另一个原因造成不公平对比的原因是,没有用相同数量的超参进行优化。如一个模型用的是默认超参设置,另一个进行了调优,那就是不公平的比较。出于这些原因,需要谨慎的与已发表的数据进行比较。为保证两种方法的公平比较,你应该实现所有你要比较的模型,并进行相同程度的优化,以及多次评估,然后使用统计验证,去决定最终差异是否显著。

5.2 比较模型时使用统计检验

如果你想让人们相信你的模型比其他人的要更好,那么统计检验是非常有用的工具。一般来说,有两类检验用于比较模型。第一类用于比较两个模型实例,比如两个训练好的决策树,像McNemar测试是公平比较两个分类器的常用手段,通过对比测试集每个样本不同分类器的输出标签完成比较。第二类是进行更一般的模型间对比,例如一个数据集上决策树或者神经网络哪个更好。这需要对每个模型进行多次评估,你可用使用交叉验证或者重复采用(或者你训练算法是随机的,你使用一样的数据多重复几次就好了)。测试并比较两者结果的分布。T检验是这类型比较的常用方法,但只有当两个分布是正态分布时结果才可靠,而实际通常不符合这一前提。更安全的选择是Mann-Whitney’s U检验,这个方法并不需要分布是正态的假设前提。更多信息【看这里和这里】。

5.3 正确进行多重比较

当你想用统计检验去比较两个以上模型时,事情变得复杂起来,因为进行逐对的多次比较有点像多次使用测试集,这会导致对于显著性的乐观解释。基本上,在你使用统计检验比较两个模型时,有可能在没有显著差异的地方发现显著差异。这是由测试的置信度表示的,通常设置为95%,这意味着20次测试中有1次给你假阳性的结果。就单个比较而言,这是可以接受的。但当你进行20次两两模型对比时,由于95%的置信度,其中一次就有可能是错的。这就是常说的多重效应,数据科学里称为数据疏浚或者P值操纵【看这里】。为了定位这个问题,你可以对多个测试进行修正。最常用的方法是Bonferroni校正,是一种非常简单的方法,基于正在测试的数据来降低显著性阈值【看这里】。当然还有其他方法,以及也有一些关于何时何地进行修正的讨论【看这里】。

5.4 不要总是相信社区基准测试结果

在某些领域,使用基准数据集来评估新的机器学习模型已经成为普遍现象。初始想法是希望每个人都使用相同数据来训练和测试他们的模型,那么模型的比较就会更加透明。不幸的是,这样的方式存在一些缺点,首先,如果对测试集使用是不受限制的,那就不能假设不会有人在训练阶段使用测试数据。而这种所谓的‘面向测试集训练’,会出现令人‘欣喜’的结果。一个更微妙的问题是,即使每个人都只使用一次测试集用于测试,但整个社区范围是在反复使用测试集。实际上,大量模型在同一测试集上测试比较,模型渐渐在过拟合这个测试集,并不是真的泛化性能优于其他模型。(译者:可能想表达的意思是社区里大家都基于测试集测试并公布结果,这个结果会被后来者看到,后来者又带着前人的经验继续训练新模型,测试集就变成验证集了,存在过拟合的可能)。基于这些原因和其他原因,你要谨慎的从社区里获取基准数据结果,不要认为小幅度的提高是很有意义的指示。更多关于共享数据集的使用讨论【看这里】。

5.5 思考模型的组合

虽然本章是讲如何比较不同模型,但机器学习并不总是只取其一。通常使用模型组合是非常有意义的。不同的模型探索不同的权衡,通过梳理多个模型,有时可以通过一个模型的优点来弥补另一个模型的缺点,反之亦然。这样的模型称为集成,而生成它们的过程称为集成学习。集成学习的方法有很多【看这里】。然而,它们可以大致分为两种,一种是相同的类型形成集成,如决策树集成;另一种是不同类型间的集成,如决策树,支持向量机和深度神经网络的集成。第一类有许多经典方法,如bagging和boosting。集成可以从现有的训练好的模型中形成,也可以模型作为过程中的一部分进行训练,目标通常是常见数据空间不同部分出现错误时选择不同模型进行处理。集成学习中考虑的问题通常是如何将不同的模型组合起来,实现这一目的的手段有很简单的(如投票)到更复杂的方法(用另一个模型聚合各个模型输出),后一种方法通常被称为叠加或者叠加泛化。


下文:如何避免机器学习陷阱:一份给研究员的指南(4)

你可能感兴趣的:(如何避免机器学习陷阱:一份给研究员的指南(3) How to avoid machine learning pitfalls: a guide for academic researchers)