👉1.创建模型前
很多同学一上来就急着训练和评估模型,往往忽略了更重要的「做功课」,这些「功课」包括:
项目的目标是什么
实现这一目标,需要怎样的数据
数据会不会有局限性,如果有如何解决
这一领域的研发进展如何,已经做了什么
这些前置工作没有做好,光着急跑模型,那么最终很可能出现模型无法证明预期结论的尴尬局面。
了解并分析数据
数据来源可靠、收集方法科学且数据质量高,会对论文发表大有裨益。这里需要注意,**被广泛使用的数据集不一定都质量好,也有可能是因为它容易获取。**选取数据前先进行一些探索性的数据分析,排除数据的局限性。
不要查看全部数据,开始前就把测试数据区分出来
测试集的信息泄漏到训练过程,是机器学习模型不能泛化的一个常见原因。 为此,数据探索性分析阶段,不要过于细致地查看测试数据,避免有意或无意地做出无法测试的假设,限制模型的通用性。
温馨提示:做出假设是可以的,但是这些假设应该只被纳入模型的训练 (training) 中,而非测试 (testing) 中。
准备充足的数据
数据不够可能降低模型的概括性和通用性,这取决于数据集的信噪比 (Signal-to-Noise Ratio, SNR)。在机器学习研究领域中,一个常见的问题是数据量不够,这时可以通过交叉验证、数据增强等技术,提高现有数据的可用性。
积极向业务/领域专家请教
领域/业务专家具备丰富的市场反馈经验,可以辅助我们明确需要解决的问题、做合适的特征选择,起到事半功倍的效果。
提前思考模型的部署问题
需要尽早考虑模型部署问题, 如环境限制对模型复杂度的影响、是否有时间限制、如何与软件系统结合等等。
👉2.可靠地创建模型
以一种有组织的方式创建模型非常重要,这使我们可以正确地使用数据,并充分考虑模型的选择。
测试数据不能参与到模型训练过程中
一但测试数据参与到了模型的配置、训练或选择中,会极大影响数据的可靠性和通用性,这也是已发布的机器学习模型经常不能通用于现实世界数据的一个常见原因。
❎ 错误示例(注意规避):
数据准备期间,用整个数据集变量的均值和范围信息进行 variable scaling(正确做法是只在训练数据中进行)
在分割数据之前进行特征选择
使用相同的测试数据评估多个模型的通用性
在分割测试数据之前应用数据增强
为了避免以上问题出现,最好的办法就是在项目开始前,就划分出一个数据子集, 并且在项目结束时只使用这个独立的测试集来测试单一模型的通用性。
温馨提示:时间序列数据的处理要特别小心,因为数据的随机拆分很容易造成泄漏和过拟合。
尝试多个不同模型
世界上不存在放之四海皆通用的机器学习模型,我们的研究工作就是要找到适用于特定问题的机器学习模型。Python、R、Julia 等现代机器学习库, 只需对代码进行少量修改,就可以尝试多种模型,找到最有效的模型。
温馨提示:
不要使用不合适的模型,使用验证集而非测试集来评估模型
比较模型时,要优化模型的超参数,并进行多次评估,并在发布结果时纠正多重比较。
不要使用不合适的模型
现代机器学习库降低了机器学习的实施门槛,同时也使得我们很容易选用不合适的模型,如将适用于 categorical feature 的模型应用于包含 numerical feature 的数据集(如树模型更适合categorical feature),或者在该使用回归模型的时候使用分类模型。在选择模型时,应尽可能选用适合用例的模型。
深度学习有些时候并不是最优解
虽然深度神经网络 (DNN) 在某些任务上表现出色,但并不意味着 DNN 适用于所有问题, 尤其是当数据有限、 underlying pattern 相当简单,或模型需要可解释的时候,DNN 的表现可能并不如某些 old fashioned 机器学习模型,如logistics regression,tree model
优化模型的超参数
超参数对模型的性能影响巨大,且通常需要与特定数据集相匹配。无目的地进行测试,可能并不是找到合适超参数的最佳方法。推荐使用超参数优化策略,如 random search 和 grid search。
温馨提示:对于超参数数量巨大或训练成本较高的模型而言,这些策略并不适用,可以借助 AutoML、数据挖掘 pipeline 等技术来优化模型的选择及其超参数。
优化超参数及选择 feature 时需要额外细心
超参数优化和特征选择是模型训练的一部分,不要在模型训练开始前,对整个数据集进行特征选择,这会使得信息从测试集泄露到训练过程中。优化模型的超参数或特征,最好使用与训练模型完全相同的数据,一种常见的技术是嵌套交叉验证(也称双重交叉验证。
👉3.稳健地评估模型
不合理的模型评估非常普遍,这会阻碍学术研究的进展。因此,需要谨慎思考如何在实验中使用数据、衡量模型的真实性能并进行报告。
使用恰当的测试集
使用测试集来衡量机器学习模型的通用性,并确保测试集的数据是合适的。 测试集不应与训练集重叠,且需要涵盖更广泛的条件,如一个物体的摄影数据集,如果训练集和测试集都是在晴天的室外收集的,测试集就不是独立的,因为没有捕捉到更广泛的天气条件。
分割数据前不要进行数据增强
数据增强有利于平衡数据集和提高机器学习模型的通用性和稳健性,需要注意的是数据增强应该只应用于训练集,不涉及测试集,以防出现过拟合。
使用验证集
使用一个单独的验证集来衡量模型性能,这包含一组不直接用于训练,而是用于指导训练的样本。验证集的另一个好处是可以进行 early stopping。
对模型进行多次评估
模型的单一评估并不可靠,可能低估或高估了模型的真正性能, 为此,需要对模型进行多次评估,大多涉及到使用不同的训练数据子集对模型进行多次训练。交叉验证 (Cross-Validation) 是一种特别流行且种类众多的方法。
温馨提示:报告多次评估的均值和标准差的同时,建议保留单个分数记录,以备后续使用统计检验 (statistical tests) 对模型进行比较。
保留一些数据来评估最终的模型实例
对模型实例的通用性进行可靠评估的最佳方法,可能就是使用另一个测试集。 所以,如果数据量足够大,最好先保留一些,并用其对最终选定的模型实例进行无偏差 (unbiased) 的评估。
不要对非平衡数据集使用准确率
谨慎选择评估机器学习模型的指标,例如,分类模型最常用的指标是准确率 (accuracy),如果是平衡数据集(每个类别在数据集中都有类似数量的样本代表)效果就会很好;如果是非平衡数据集,准确率则可能是一个非常具有误导性的指标。
在这种情况下,最好使用 F1 score、AUC等对 class size imbalance 不敏感的指标。
👉4.公平地比较模型
对模型进行比较是必须的过程,但如果以不公平的方式进行比较,就会带偏大众。所以,需要确保在同一条件下评估不同模型,并正确使用统计检验 (statistical tests)。
对于模型而言,并不是数字越高性能越好
论文中常出现这种表述「此前研究中的准确率是 94%,本文模型准确率高达 95%,因此更好」。各种原因表明,更高的数字不等同于更好的模型, 如果模型是在同一个数据集的不同分区上训练或评估的,可能性能差异教小;如果是用了完全不同的数据集则可能性能差异巨大。没有进行相同数量的超参数优化也会影响模型性能差异。
因此,要想对两个模型科学地进行性能比较,应该将模型优化到相同程度,并进行多次评估,然后用统计测试的方法确定性能差异是否显著。
用统计检验比较模型
推荐用统计检验 (statistical tests) 比较两个模型的性能差异。广义上讲,比较机器学习模型的 test 分为两类:第一类用于比较同类模型实例, 如比较两个训练好的决策树时,可以选用 McNemar 检验;第二类适用于更通用的模型比较, 如比较决策树和神经网络哪个更适合时,选用曼-惠特尼 U 检验。
对多重比较进行校正
用统计检验比较两个以上模型有些复杂,multiple pairwise test 类似多次使用测试集,这可能导致对显著性 (significance) 过于乐观 (overly-optimistic) 的解释。
推荐使用多重检验 (multiple test) 校正来解决这个问题,如邦费罗尼校正 (Bonferroni correction)。
不要过于相信社区发布baseline的结果
对于某些领域的问题,很多人会选用基准数据集来评估新机器学习模型的性能,因为大家都是使用相同的数据来训练和测试模型,那么比较起来就会更加直观。这种方法有一些主要缺点。
首先,如果测试集的访问不受限,则不能保证别人没有把它作为训练过程的一部分,这会导致对于结果的过度乐观。此外,即使每个使用数据的人只使用了一次测试集,但总体而言,测试集被社区使用了很多次,这也会导致模型过拟合的发生。为此,应该谨慎地解读基准数据集的结果,对性能的提高进行合理研判。
👉5.经验总结
建模经验时刻进行总结,包括哪些尝试成功、哪些失败。 机器学习通常和 trade-offs 相关,一个模型在所有方面都比另一个模型好是很少见的。所以在经验总结时需要体现这一点。
经验需要透明
把所有实践工作都透明地分享出来, 这利于其他人重复这项实验,也方便人们比较模型。清晰地记录实验及写出整洁的代码,对自己和他人都有好处。机器学习模型越来越注重实验的可复现。
多种方式报告性能
在评估模型性能时,一个更严谨的方法是使用多个数据集, 这能帮助克服与单个数据集相关的任何缺陷,并给出模型性能的全面描述。为每个数据集报告多个指标是很好的做法,因为不同指标能呈现不同的结果,增加工作的透明度。
只针对数据进行归纳
不要提出无效结论,这会把其他研究人员带入歧途。一个常见的错误是,发表训练和评估模型的数据不支持的概括结论。模型在一个数据集上表现很好,不意味着在其他数据集上也做得好。虽然可以通过使用多个数据集获得可靠的 insights,但从实验中研究和推断出的东西总是有限的。不要夸大发现,意识到局限性。
谨慎报告显著性差异
上文探讨的统计检验,可以帮助检验模型间的差异。但统计检验并不完美,可能会低估或高估模型的显著性,出现假阳或假阴的问题。此外越来越多的统计学家主张放弃使用置信度阈值 (confidence threshold)、直接报告 p 值来测定模型显著性。
除了统计显著性,另一个要考虑的问题,是两个模型间的差异是否真的重要。因为只要样本足够,总是能找到显著的差异,哪怕实际性能差异微乎其微。所以在判断重要性时,可以衡量效应值 (effect size),方法包括 Cohen’s d statistic(更普遍)、Kolmogorov Smirnov(效果更好,推荐)等。
关注模型运行原理
训练过的模型包含众多有效信息,但很多作者只报告模型的性能指标,对模型原理不作解释。 研究的目的不是获得比别人稍高的准确率,而是总结知识并分享给研究社区,进而增加工作成果发表的可能性,如,对于决策树一类的简单模型,提供模型可视化;对于深度神经网络一类的复杂模型,考虑使用 XAI(可解释人工智能)技术提取相关信息。