深度学习架构师手册——探索模型评估方法

227 阅读34分钟

一个经过训练的深度学习模型,如果没有任何形式的验证,是不能部署到生产环境中的。在机器学习软件领域,生产环境指的是在实际运行环境中部署并操作机器学习模型,以便实际使用其预测结果。更广泛地说,模型评估在任何深度学习项目中都起着至关重要的作用。通常,深度学习项目会构建多个模型,最终会选择一个模型来服务于生产环境。一个良好的模型评估过程能带来以下益处:

  • 通过模型比较和指标,获得性能更优的最终模型
  • 通过了解常见的模型陷阱,减少生产环境中的预测失误
  • 通过模型洞察,使从业人员和最终模型行为更加契合
  • 通过成功指标的评估,提高项目成功的概率
  • 一个更少偏见、更公平的最终模型,产生更可信的预测

通常,模型评估过程会在整个机器学习生命周期中做出更有依据的决策。在本书第二部分的第一章中,我们将讨论所有有助于实现这些好处的模型评估类别。此外,我们将在接下来的四章中深入探讨其中一些类别,这些章节都属于本书的第二部分。本章具体将涵盖以下内容:

  • 探索不同的模型评估方法
  • 设计基本的模型评估指标
  • 探索自定义指标及其应用
  • 探索用于比较模型指标的统计测试
  • 将评估指标与成功关联
  • 直接优化指标

技术要求

在本章中,我们将使用Python编程语言进行实践实现。为了完成这部分内容,您只需要在Python中安装matplotlib库。

代码文件可在GitHub上找到:github.com/PacktPublis…

探索不同的模型评估方法

大多数实践者都熟悉与准确度相关的评估指标。这是最基本的评估方法。通常,对于监督学习问题,实践者会将准确度相关的指标视为金标准。在模型评估的上下文中,“准确度指标”一词通常用于统称各种性能指标,如准确率、F1分数、召回率、精度和均方误差。当与适当的交叉验证分区策略结合使用时,使用指标作为独立的评估策略可以在大多数项目中起到很大的作用。在深度学习中,准确度相关的指标通常用于监控每个训练轮次中模型的进展。监控过程随后可以扩展为执行提前停止,以便在模型不再改善时停止训练,并确定何时降低学习率。此外,训练过程结束时,可以加载最佳的模型权重,这些权重是在验证数据集上获得最佳指标分数时的权重。

仅依靠准确度相关的指标无法提供机器学习模型能力和行为的完整视图。在无监督学习项目中,这一点尤其明显,因为准确度指标较为表面,仅与特定的分布相关。更全面地了解模型可以让你在机器学习生命周期中做出更有依据的决策。以下是你可以通过多种方式获得对模型更深入了解的一些示例:

  • 模型洞察:模型洞察可以作为评估使用数据准确性的代理。如果数据被认为不准确或有一些细微的缺陷,你可以返回到机器学习生命周期的数据准备阶段进行修正。
  • 偏见检测:如果检测到偏见,可能需要重新训练模型以去除偏见。
  • 领域专家视角:评估模型是否能够识别领域专家所识别的模式。如果不能,可能需要使用不同的模型或数据准备方法。
  • 常识判断:必须考虑模型是否能够在预测中展现常识。如果不能,可能需要应用特殊的后处理技术来强制执行常识。
  • 其他性能指标:如推理速度和模型大小等,可能在选择模型时非常关键。你不希望选择一个过于缓慢或太大而无法适应目标生产环境的模型。

除了帮助项目朝着成功方向推进外,收集模型的洞察还可以帮助及早识别潜在问题。在第1章《深度学习生命周期》中介绍的机器学习生命周期中,重要的是要记住,项目可能在规划阶段或在提供模型洞察时失败。失败是机器学习过程中的自然一部分,事实上,许多项目本身并不打算成功。这可能是由于各种因素,比如数据工程不适合机器学习,或者任务过于复杂。然而,重要的是要尽快失败并放弃项目,这样才能将资源重新分配到更有可能成功的其他用例。如果项目非常关键且无法放弃,快速找出失败的根本原因可以通过将资源转移到修复问题上来提高项目的执行效率,并在机器学习生命周期的各个阶段之间进行循环过渡。为了使项目能够快速失败,你需要有一种负责任且自信的方式来判断模型是否未能按预期工作。总之,这种快速失败的能力非常有益,因为它节省了时间和资源,否则这些资源可能会被浪费。

以下是可以用于评估深度学习模型的一些方法,部分方法也可以用于非深度学习模型:

  • 评估指标工程:虽然许多项目中都会使用评估指标,但评估指标工程的实践往往被忽视。本章将深入探讨指标工程,并探索选择适当评估指标的过程。我们将首先讨论适用于各种问题类型的基础评估指标。然后,我们将探索如何将基础评估指标升级为特定于项目领域和用例的指标。简而言之,本章将帮助你理解指标工程的重要性,并指导你选择适合项目的指标。
  • 学习曲线:学习曲线确定了深度学习模型的拟合程度。
  • 提升图:提升图提供了预测模型性能的可视化表示。它展示了模型在预测正向结果时,相较于随机机会的表现有多好。
  • 接收操作特征(ROC)曲线:这是一种二分类模型性能的图形表示,绘制了不同分类阈值下的真正率(TPR)与假正率(FPR)。
  • 混淆矩阵:混淆矩阵是一种性能评估工具,用于衡量机器学习模型的分类准确性。它比较了模型预测的结果与实际结果,并以矩阵形式呈现。
  • 特征重要性:这是确定数据集中哪些特征对机器学习模型输出影响最大的过程。此外,它有助于识别给定问题中最重要的因素,并能帮助改善模型的整体性能。
  • A/B测试:机器学习中的A/B测试涉及比较两种不同模型或算法在特定任务上的表现,以确定哪个模型在实践中表现更好。这可以帮助实践者做出更有依据的决策,选择使用哪种模型或如何改进现有模型。
  • 群体分析:群体分析是一种技术,用于评估模型在不同用户子群体上的表现。它可以帮助识别模型是否在不同群体中表现不同,并有助于理解如何改进模型以适应特定群体。
  • 残差分析:残差分析是一种技术,用于检查回归模型的拟合优度,通过检查观察值和预测值之间的差异(残差)。它有助于识别残差中的模式或离群点,这些可能表明模型改进的领域。
  • 置信区间:置信区间是对估计值不确定性的度量。它们可以用来确定模型真实表现可能落在某个范围内的概率,具有一定的置信水平。置信区间对于比较不同模型的表现或判断模型表现是否具有统计显著性非常有用。
  • 收集预测洞察:这将在第11章《解释神经网络预测》中详细介绍。
  • 解释神经网络:这将在第12章《解释神经网络》中详细介绍。
  • 偏见与公平性分析:这将在第13章《探索偏见与公平性》中详细介绍。
  • 对抗性分析:这将在第14章《分析对抗性表现》中详细介绍。

本书只会涵盖与神经网络相关的方法。在下一节中,我们将从工程基础评估方法——模型评估指标开始。

工程基础模型评估指标

为你的用例工程化评估指标是一项常被忽视的技能。这很可能是因为大多数项目都是基于公开可用的数据集进行的,这些数据集几乎总是已经提出了某种评估指标。这包括Kaggle上的项目和许多人用来进行基准测试的公开数据集。然而,现实生活中并非如此,评估指标不会自动呈现给你。让我们在这里进一步探索这个话题,并掌握这项技能。

模型评估指标是监督学习项目中至关重要的第一个评估方法,排除基于无监督学习的项目。在不同的任务和目标类型下,存在一些基础的评估指标作为事实标准。此外,这些基础评估指标也有更定制化的版本,针对特定的目标进行调整。例如,生成式任务可以通过一种名为“平均意见分数”的特殊人工评分来进行评估。这里推荐的策略是:始终从基础指标开始,并逐步升级到能够反映错误在不同条件下如何正确分布的指标,这与构建模型时的推荐方法类似。

以下是不同条件下的基础评估指标:

二分类问题:
  • 准确率:这是正确分类的样本(真阳性和真阴性)占所有样本的比例。它是最广泛使用的评估指标。然而,实际上,这是一个偏斜的指标,由于大多数数据集中负类样本的自然过多,这可能会掩盖模型实际对正类预测性能的表现。如果有99个负样本和1个正样本,单纯预测负类可以获得99%的准确率!准确率仍然是模型评估的主要方法,但在实际应用中并不常用。当某人说模型很准确时,他们可能并没有使用准确率指标。
  • 精度:这是所有预测为正样本中的真阳性所占的比例。它是关注假阳性的一种强有力替代指标。二分类任务中需要设置预测阈值。
  • 召回率:这是所有实际正样本中的真阳性所占的比例。它是关注假阴性的一种强有力替代指标。二分类任务中需要设置预测阈值。
  • F1 分数:F1 分数是精度和召回率的调和均值。它提供了一个平衡的模型性能度量。调和均值的公式是: 11x1+1x2+...+1xn\frac{1}{\frac{1}{x_1} + \frac{1}{x_2} + ... + \frac{1}{x_n}}x1​1​+x2​1​+...+xn​1​1​ 其中 x1,x2,...,xnx_1, x_2, ..., x_nx1​,x2​,...,xn​ 是每个样本的值。还有 F2 分数,它给召回率赋予比精度更大的权重。如果你关心假阳性和假阴性同等重要,可以使用 F1 分数;如果你更关心假阴性而不是假阳性,可以使用 F2 分数。例如,在入侵检测的用例中,如果你希望捕获任何入侵者,假阴性是无法接受的,但假阳性是可以接受的,因此使用 F2 分数更好。请注意,使用调和均值而不是算术均值可以确保极端值受到惩罚。例如,召回率为1.0且精度为0.01时,结果将是0.012,而不是接近0.5。此处也需要设置预测阈值。
  • 接收操作特征曲线下的面积(AUC ROC) :这是ROC曲线下的面积,它衡量模型区分正负样本的能力。此处不需要设置阈值。推荐在正负类别平衡时使用,因为它不需要像 F1 和 F2 那样调节预测阈值。
  • 平均精度均值(mAP) :这是精度指标的扩展,不是使用单一阈值,而是使用多个阈值来计算精度,并将其平均,以获得在不同阈值下的更强鲁棒性的精度值。对于多个类别,独立计算平均精度并取其平均值,得到 mAP。
多分类问题:
  • 宏观平均:为每个类别分别计算二分类指标,然后取其平均值。
  • 微观平均:通过考虑预测的最大类别来确定整体的真阳性和假阳性率,然后使用这些比率计算总体精度。
回归问题:
  • 均方误差(MSE) :这是预测值与实际值之间的平方差的平均值。
  • 均方根误差(RMSE) :这是MSE的平方根。它提供与目标数据相同尺度的值,推荐使用RMSE而不是MSE。
  • 平均绝对误差(MAE) :这是预测值与实际值之间绝对差异的平均值。当你关心预测值和实际标签之间的差异而不关心符号时,使用MAE而不是RMSE。
  • 决定系数(R²) :这是衡量模型拟合数据的程度,范围从0(拟合差)到1(拟合好)。
多标签问题:
  • 标签排名平均精度(LRAP) :这是每个真实标签分配给特定样本的平均精度。它考虑了预测标签与真实标签的排名,并根据真实标签在排名中的距离分配分数。LRAP适用于电影推荐系统等用例,其中预测多个标签及其排名很重要。
图像和视频标签:
  • 峰值信噪比(PSNR) :这是基于原始图像与重建图像之间的差异,衡量重建图像或视频的质量。
  • 结构相似性指数(SSIM) :这是衡量两张图像或视频帧之间结构相似性的指标。
文本标签:
  • Bleu分数:这是衡量机器生成文本与人类生成文本之间相似性的度量,基于n-gram重叠。
  • 词错误率(WER) :这是基于词序列中的错误数量,衡量自动语音识别系统的错误率。
基于人工评分的质量指标:
  • 平均意见分数(MOS) :这是由人工观察者给出的主观质量评分,用于验证和校准客观质量指标。
  • 用户参与度:像网站或应用的停留时间、点击率或跳出率等指标可用于衡量用户参与度和满意度。
  • 任务完成率:这是成功完成指定任务或目标的用户比例,可用于评估产品或服务的可用性和有效性。

基础评估指标是一组常用的指标,应根据问题类型和条件作为你的首选指标。然而,选择使用哪种基础指标仍然取决于具体问题及其在模型性能方面的重要性权衡。接下来,提供一些步骤性建议,帮助你选择和使用合适的模型评估指标:

  1. 理解问题:考虑问题的性质、数据和期望的结果。这是帮助你识别最重要标准的关键步骤。
  2. 注意数据质量:数据质量的支柱(代表性、一致性、全面性、唯一性、公平性和有效性)将影响所选指标实际代表的含义。如果你在一个糟糕的数据集上评估模型的表现,那么所选的指标可能无法反映模型在真实数据上的表现。
  3. 考虑用户的视角:考虑与模型交互的用户或模型输出的用户,他们的期望和需求是什么?
  4. 定义清晰的目标:定义预测需要实现的目标,以及它们应该避免的相反行为。
  5. 选择与目标一致的指标:选择的指标应该与你的整体目标一致。例如,在癌症检测的二分类医学用例中,错误的癌症诊断可能会摧毁病人的一生,因此可以选择精度这样的指标来减少假阳性。
  6. 考虑常用的基础指标:考虑相似问题中常用的基础指标以及它们如何需要适应或修改以适应当前问题。
  7. 多指标评估:单一指标可能无法全面捕捉模型的表现,考虑使用多个评估指标来衡量模型表现的不同方面。
  8. 跨验证评估指标:确保指标在验证集和保留集上计算,而不仅仅是在训练集上计算。
  9. 直接优化评估指标:一些指标可以直接在深度学习库中复现并作为损失函数使用。通过直接优化指标,可能会帮助你获得更好的模型,特别是对于你选择的指标。

通过谨慎地考虑这些建议,你可以选择一个准确衡量问题相关方面的指标。最终,这将帮助你开发更准确、更有效的机器学习解决方案,从而提高模型的性能并获得更成功的结果。

基础评估指标是广泛用于评估模型表现的一组常见指标。然而,在某些情况下,特定问题可能有额外的标准和独特的行为,需要在评估模型表现时加以考虑。在这种情况下,可能需要采用替代或定制的指标,来更好地满足特定问题的需求。基础评估指标可以进一步适应你用来评判模型的额外理想。接下来的话题将探讨定制指标及其应用,包括何时使用它们作为适合特定用例的最佳指标。

探索自定义指标及其应用

基础评估指标通常足以满足大多数用例的要求。然而,自定义指标在基础指标的基础上进行了扩展,并结合了特定场景的额外目标。可以将基础指标看作是学士学位,而自定义指标则是硕士或博士学位。如果基础指标已经满足需求且没有其他额外要求,那么仅使用基础指标是完全可以的。

自定义理想通常在项目早期自然出现,并且高度依赖于特定的用例。大多数真实的用例不会公开其选择的评估指标,即使模型的预测结果是为了公开使用,比如OpenAI的ChatGPT。然而,在机器学习竞赛中,带有数据的真实用例的公司会公开其选择的指标,以便找到能够建立的最佳模型。在这样的项目竞赛环境中,主办竞赛的公司有动力进行高质量的指标工程工作,以反映其用例的理想。如果没有工程化一个合适的评估指标来匹配这些理想,这将影响最终的最佳模型,并最终导致公司付出金钱的代价。一些竞赛的奖金高达10万美元!

在本节中,我们将介绍一些常见的、公开分享的自定义理想及其相关的评估指标和用例,来自机器学习竞赛,这些内容可能对你有帮助,无论你的特定用例是什么:

理想与用例示例
理想用例自定义指标
对于时间序列回归点预测,目标是季节性的,并且可能会根据数据所在的季节而大幅波动。我们需要一个能够确保误差不会在任何一个季节中占据过多权重的指标。M5 预测竞赛——准确度(Kaggle):预测沃尔玛零售商品单位销量。该竞赛提供了沃尔玛的销售时间序列数据,数据按照层次结构组织,从商品级别开始,逐级到部门、产品类别和商店级别。加权均方根缩放误差(WRMSSE):这是RMSE的修改版本。在应用均方误差的平方根之前,WRMSSE将标准MSE除以最近一次观察值作为真实值的MSE。这样可以确保来自任何季节的所有RMSE都会缩放到相同的数值范围内。
有些标签/类别在现实中并不重要,可能是因为它们出现的频率较低,或者它们对预测后的决策影响较小。在评估模型时,不要过度关注不重要的标签,而应更多关注重要标签/类别的误差。RSNA 脑内出血检测(Kaggle):这是一个多标签分类问题,检测人类大脑医学图像中是否存在出血的类型和位置。一个特殊标签“any”用于表示所有未被具体标签列出的出血类型。这个标签的数据量是其他标签的2-3倍。加权多标签对数损失:尽管“any”标签的数据量更多,但它仍然被加权更多,这表明标签对指标的意义不仅仅取决于数据的稀缺性,更取决于具体问题的背景。
某些标签在实际使用中比其他标签更为重要,尽管它们的数据量可能较小。M5预测竞赛——准确度(Kaggle):预测沃尔玛零售商品单位销量。竞赛数据有一个层级结构,开始于商品级别,逐级到商店级别。WRMSSE:竞赛作者更重视那些销售额更高的产品单位销量预测。每个产品的权重由产品在过去28次观察中的销售量决定(销售单位乘以它们各自的价格)。
我们并不关心小的误差,因为它们可以容忍,但我们关心大的误差,因为它们可能会触发不想要的行为。Google Analytics客户收入预测(Kaggle):这是一个回归问题,预测在线商店的客户总收入。均方根对数误差(RMSLE):RMSLE在计算RMSE之前对预测值和实际值进行了对数变换,这有助于对大误差进行更重的惩罚。
说明:
  • 加权均方根缩放误差(WRMSSE) :用于处理季节性变化较大的时间序列数据,确保所有季节的误差具有相同的重要性。
  • 加权多标签对数损失:这种方法更重视某些重要标签的错误,而不仅仅依据数据量的多少。
  • 均方根对数误差(RMSLE) :通过对数变换来减少大误差的影响,适用于有显著偏斜的目标值,如收入预测。

这些自定义理想和指标示例为你提供了一个指导,帮助你根据具体问题开发适合的评估指标。通过理解这些特殊指标在特定领域中的使用,可以更好地理解在评估模型性能时需要考虑的因素。最终,关键是选择与目标一致、能准确捕捉问题领域最重要方面的指标。

接下来,我们将讨论一个健壮的策略,用于比较不同模型在不同交叉验证折叠或数据集划分下计算的多个指标值的性能表现。

探索用于比较模型指标的统计测试

在机器学习中,基于指标的模型评估通常涉及使用不同折叠或数据集划分(如保持集和验证集)中聚合的指标的平均值来比较各种模型的性能。然而,单独依赖这些平均性能指标可能无法全面评估模型的性能和泛化能力。更为稳健的模型评估方法是结合统计假设检验,用于评估观察到的性能差异是否具有统计学意义,还是由于随机因素导致的。

统计假设检验是用于确定观察到的数据是否提供了足够的证据,来拒绝原假设并支持备择假设的程序。这有助于量化观察到的差异是由随机机会还是由真正的效应引起的。在统计测试中,原假设(H0)是一个默认假设,表示变量之间没有效应或关系,作为与备择假设进行比较的基础,目的是确定观察到的数据是否提供了足够的证据来拒绝这一默认假设。为了比较多个数据集和划分中模型的指标性能,原假设通常是模型性能之间没有差异,而备择假设是存在差异。

总的来说,统计测试为客观确定性能差异是否显著或由偶然因素引起提供了一个正式框架。此外,统计测试通过考虑指标中的变异性和不确定性,提供了对模型性能的全面理解。以下表格展示了你可以考虑使用的常见统计测试,包含了执行这些测试所需的Python代码、如何解释结果以及何时使用它们:

统计测试Python代码结果解释推荐使用场景
配对t检验from scipy.stats import ttest_rel t_stat, p_value = ttest_rel(model1_scores, model2_scores)如果p_value < 0.05,则模型之间存在显著差异。用于比较两个依赖样本且差异服从正态分布的情况。
Mann-Whitney U检验from scipy.stats import mannwhitneyu u_stat, p_value = mannwhitneyu(model1_scores, model2_scores)如果p_value < 0.05,则模型之间存在显著差异。用于比较两个独立样本,且数据为非正态分布或序数数据的情况。
方差分析(ANOVA)from scipy.stats import f_oneway f_stat, p_value = f_oneway(model1_scores, model2_scores, model3_scores)如果p_value < 0.05,则模型之间存在显著差异。用于比较三个或更多独立样本,且数据服从正态分布且方差相等的情况。
Kruskal-Wallis H检验from scipy.stats import kruskal h_stat, p_value = kruskal(model1_scores, model2_scores, model3_scores)如果p_value < 0.05,则模型之间存在显著差异。用于比较三个或更多独立样本,且数据为非正态分布或序数数据的情况。

表10.2 – 常见统计测试的Python实现、结果解释及使用推荐

这些建议可以帮助你根据数据的条件和假设选择合适的统计测试,比如样本数量、数据类型(依赖或独立)、数据分布(正态或非正态)。

接下来,我们将讨论如何将指标工程的结果转化为成功标准。

将评估指标与成功关联起来

在机器学习项目中,定义成功是至关重要的,应当在项目的早期阶段进行定义,正如在《第一章 深度学习生命周期》的“定义成功”部分所介绍的那样。成功可以定义为实现更高层次的目标,例如提高流程效率或相较于人工劳动提高流程准确性。在一些罕见的情况下,机器学习甚至可以使一些由于人类局限性而无法实现的流程成为可能。最终成功的目标是节省成本或为组织创造更多收入。

一个模型的指标表现分数为0.80的F1分数或0.00123的RMSE,并不意味着任何具体的含义,必须将其转化为在实际应用场景中的具体价值。例如,应该回答这样的问题:预计的模型分数是多少,才能让项目实现预期的成本节省或收入增长。量化模型性能所能带来的成功是至关重要的,特别是考虑到机器学习项目可能会花费很高的成本。如果模型未能达到某个水平,投资回报可能较低。选定评估指标后,设定一个现实可达且基于业务目标的成功指标阈值也同样重要。

作为总结,我们通过一个假设的应用案例来说明如何将评估指标与成功关联起来。

假设我们有一个使用图像数据来识别制造过程中的缺陷产品的用例。假设生产一个产品的成本为50美元,零售价格为200美元。如果该产品是缺陷品并且送到了客户手中,将导致额外的1000美元收费以及退还200美元的费用来补偿有缺陷的产品,可能还会造成伤害。另一方面,如果一个好的产品被错误地识别为缺陷产品并报废,将会产生250美元的成本;50美元用于生产,200美元是由于报废而失去的机会成本。

假设我们有一个包含10,000个产品图像的数据集,这是每月生产的产品数量。如果我们不使用模型,直接生产并运输所有10,000个产品,我们会有95个缺陷产品,生产成本为500,000美元(10,000 x 50美元),并且产生95,000美元的退货费用,总成本为595,000美元。销售掉所有非缺陷产品后,公司将获得1,981,000美元的销售收入(9,905 x 200美元)。总收入为1,386,000美元。

现在,考虑我们使用训练好的深度学习模型对这些图像进行分类,区分为“好”(负类)或“缺陷”(正类)。为了确保使用深度学习模型优化此过程是值得的,假设公司每年需要至少获得120,000美元的现金流才能使其具有价值。我们还考虑到维护机器学习模型的成本为每月20,000美元。任何指标中的阈值都需要与每月至少获得30,000美元的收益挂钩。

假设我们使用基于F得分的指标。由于假阴性对总收入的影响比假阳性更大,我们可能希望使用F2分数而不是F1分数。但具有相同指标分数的模型,是否会在这两个指标上产生不同的财务回报呢?这是一个关键问题,需要理解清楚,以便设定合适的成功阈值。让我们尝试使用Python代码分析得分的表现:

首先,定义实际的正样本和负样本数量以及总数据量:

actual_positive = 95
total_data = 10000
actual_negative = total_data - actual_positive

接下来,定义计算精度、召回率、F1分数和F2分数的方法:

def precision(tp, fp):
    denominator = tp + fp
    if denominator == 0:
        return 0
    return tp / denominator

def recall(tp, fn):
    denominator = tp + fn
    if denominator == 0:
        return 0
    return tp / denominator

def f1score(tp, fp, fn):
    prec = precision(tp, fp)
    rec = recall(tp, fn)
    denominator = prec + rec
    if denominator == 0:
        return 0
    return 2 * (prec * rec) / denominator

def fbeta(tp, fp, fn, beta=0.5):
    prec = precision(tp, fp)
    rec = recall(tp, fn)
    denominator = beta**2 * prec + rec
    if denominator == 0:
        return 0
    return (1 + beta**2) * (prec * rec) / denominator

接下来,定义计算最终现金流的方法:

def compute_total_cash(tp, fp, fn, tn):
    return tp * -50 + fp * -50 + fn * -1050 + tn * 150

使用compute_total_cash方法来计算当前设置下没有使用模型时的现金基线。这是为了找出需要多少现金成功阈值,才能使模型被认为足够有价值以使用:

baseline_cash = compute_total_cash(0, 0, actual_positive, actual_negative)
threshold_cash_line = baseline_cash + 30000

接下来,我们将模拟所有可能的真阳性(tp)、假阳性(fp)、真阴性(tn)和假阴性(fn)的组合,并计算F1和F2分数:

f1_scores = []
f2_scores = []
total_cash = []
for tp in range(0, 96):
    fn = 95 - tp
    for fp in range(0, actual_negative):
        tn = total_data - tp - fp - fn
        f1_scores.append(f1score(tp, fp, fn))
        f2_scores.append(fbeta(tp, fp, fn, beta=2.0))
        total_cash.append(compute_total_cash(tp, fp, fn, tn))

现在,我们将分别绘制F1和F2分数与总现金回报的关系,同时绘制水平线,表示threshold_cash_linebaseline_cash

import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, figsize=(18, 15))
axs[0].scatter(f1_scores, total_cash, alpha=0.01)
axs[1].scatter(f2_scores, total_cash, alpha=0.01)
for i in range(2):
    axs[i].axhline(y=baseline_cash, color='r', linestyle='dotted')
    axs[i].axhline(y=threshold_cash_line, color='y', linestyle='dashdot')

这将生成以下图形:

image.png

这张图表明,虽然F2分数对召回率赋予了更高的权重,但在较低得分范围内,F2分数有很大的波动。这里的目标是确保一个指标能够与成功正确地关联起来,因此在相同的分数下,现金波动较大不是一个理想的特征。在这种情况下,F1分数可能是更明智的选择。以最上方的水平线为参考(该线表示我们需要达到的最低30,000美元现金阈值),我们希望找到一个点,在F1分数图中,甚至无法达到低于阈值的得分。大致来说,0.65的F1分数应该可以保证模型能产生一个合格的得分。

这个例子展示了在选择指标时所需的分析深度,并找出一个能够直接与成功关联的阈值,同时考虑到盈利和损失。然而,重要的是要注意,并非所有机器学习项目都能用美元成本来衡量。有些项目可能与现金没有直接关系,这完全可以接受。然而,要想成功,重要的是以利益相关者可以理解的方式量化模型的价值。如果没有人理解模型所提供的价值,那么项目不太可能成功。

接下来,让我们深入探讨在深度学习模型中直接优化指标的思路。

直接优化指标

用于训练深度学习模型的损失函数和指标是两个独立的组件。为了提高模型在所选指标上的准确性表现,你可以直接针对该指标进行优化,而不仅仅是监控性能以选择最佳表现的模型权重并使用早停策略。换句话说,就是将指标作为损失函数直接使用!

通过直接优化感兴趣的指标,模型有机会以与最终目标相关的方式进行改进,而不是仅仅优化一个可能与最终性能无关的代理损失函数。这意味着,当直接使用指标作为损失函数时,模型的表现可能会大幅提升。

然而,并非所有的指标都能作为损失函数使用,因为并非所有的指标都是可微分的。记住,反向传播要求所有使用的函数都必须是可微分的,以便计算梯度并更新神经网络权重。需要注意的是,某些不连续的方法并不都是可微分的。以下是一些常见的不连续函数,它们不是可微分的,并附带NumPy方法,方便识别:

  • 最大值和最小值函数:要注意的NumPy方法有np.min, np.max, np.argmin, np.argmax
  • 裁剪函数:要注意的NumPy方法是np.clip
  • 其他需要注意的NumPy方法包括np.sign, np.piecewise, np.digitize, np.searchsorted, np.histogram, np.fft, np.count_nonzero, np.round, np.cumsumnp.percentile

此外,使用指标作为损失函数有时会导致次优性能,因为该指标并不总是能捕捉到模型需要学习的所有问题方面,以便获得良好的表现。问题的某些重要方面可能很难直接衡量或包含在指标中。这些方面可能是模型学习的基础,在此基础上,模型才能慢慢在所选指标上得到改进。例如,在图像识别中,模型需要首先学习识别更抽象的特征,如纹理、光照或视角,然后才能尝试提高准确性。如果这些特征未能在指标中体现,模型可能无法学习识别这些特征,从而导致性能不佳。一个好的解决方案是在初期使用更传统的损失函数进行实验,然后通过仅使用指标作为损失或将原始损失和指标损失的结合进行微调。

虽然在某些情况下使用指标作为损失函数可能会带来好处,但它并不是一种保证能提高性能的方法。这种方法的效果在很大程度上取决于具体的使用场景和所解决问题的复杂性。通过这种方法获得的性能提升可能微乎其微,甚至对于某些项目来说过于细微而不值得考虑。然而,在成功应用时,它可以带来有意义的性能改进。

总结

在本章中,我们简要概述了不同的模型评估方法以及如何用它们来衡量深度学习模型的表现。我们从指标工程开始,介绍了常见的基础模型评估指标。在此基础上,我们讨论了使用基础模型评估指标的局限性,并引入了根据特定问题量身定制模型评估指标的概念。我们还探讨了通过将评估指标作为损失函数直接进行优化的思路。虽然这种方法可能会带来好处,但也需要考虑潜在的陷阱和局限性,以及该方法适用的具体使用场景。

深度学习模型的评估需要仔细考虑合适的评估方法、指标和统计测试。希望在阅读本章后,我能帮助你顺利进入指标工程的领域,鼓励你按照提供的指导方针迈出深度指标工程的第一步,并突显指标工程作为提升模型评估的重要组成部分的价值。

然而,无论最终选择的指标多么好和合适,某些信息可能会隐藏在一个单一的指标值背后。在下一章中,我们将介绍一种关键方法,帮助揭示你神经网络模型在做出预测时所隐藏的(无论是有意还是无意的)行为。