机器学习之避坑指南

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

👉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 regressiontree 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可解释人工智能技术提取相关信息。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习