持续创作,加速生长!这是我参与「日新方案 10 月更文挑战」的第18天,点击检查活动详情

假定您练习了一个猜测模型,并将其发布到出产环境。

现在,您依靠它来做出事务决策。您有必要保护、从头练习并密切重视您的模型。

它会呈现什么问题,以及怎么盯梢?

让咱们来看一个比如。这是一个关于咱们怎么练习模型、模仿出产环境运用并剖析其逐渐退化的故事。

任务:自行车需求猜测

在本教程中,咱们将处理需求猜测问题。

数据集。 咱们采用了关于自行车同享需求的 Kaggle 数据集。 咱们的方针是猜测每小时的自行车租赁量。 为此,咱们有一些关于时节、天气和星期几的数据。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

模型。咱们运用从一月份开始的四个星期的数据练习了一个随机森林模型。让咱们想象一下,在实践中,咱们刚刚开始数据搜集,这便是一切可用的数据。练习模型的功能看起来能够接受,所以咱们决定试一试。

反应

咱们假定咱们只在每周完毕时才了解ground truth(实践需求)。

这是现实世界机器学习中的一个现实假定。集成和更新不同的数据源并不总是那么简单。即便在实践事件发生之后!或许日常运用数据存储在本地,每周只发送和合并一次到数据库中。

当您为不同的未来一段时刻生成猜测时,或许会呈现相似的延迟。假如你猜测未来一周,那么这个规模将成为您的等待时刻。

模型检查。因为每周仅供给一次实践数据,因此咱们决定每次都运转惯例模型剖析。没有实时监控。相反,咱们组织了一项作业,生成一份标准的每周报表供数据科学家检查

怎么剖析模型功能?

为了在出产中剖析咱们的模型,咱们将运用 Evidently。 它是一个开源东西,可生成有关模型功能的交互式预构建报表。

为了运转它,咱们将行为数据预备为 Pandas DataFrame。

它应该包括:

  • 模型运用日志:模型中的特征和相应的猜测;
  • ground truth数据:作为咱们“target”的每小时租借自行车的实践数量。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

您能够运用此Jupyter notebook 示例依照咱们的步骤操作。

‍让咱们先看看咱们创建的模型的功能。 一旦咱们练习了一个模型,咱们就会获取咱们的练习数据集和猜测并将其指定为“Reference”数据。 请持续重视:这也将有助于咱们稍后参考这些数据。

reference = raw_data.loc['2011-01-01 00:00:00':'2011-01-28 23:00:00']

咱们能够直接从 DataFrame 中挑选这个时刻段,因为它有 datetime 作为索引

咱们还映射列以显现东西是什么并执行正确的剖析:

target = 'count'
prediction = 'prediction'
numerical_features = ['temp', 'atemp', 'humidity', 'windspeed', 'hour', 'weekday']
categorical_features = ['season', 'holiday', 'workingday']

默认状况下,Evidently 运用索引作为绘图中的 x 轴。 在这种状况下,它是日期时刻,所以咱们不显式添加任何内容。 不然,咱们有必要在列映射中指定它。

接下来,咱们调用回归模型的相应陈述。

regression_perfomance_dashboard = Dashboard(tabs=[RegressionPerformanceTab])
regression_perfomance_dashboard.calculate(reference, None, column_mapping=column_mapping)

并直接在 Jupyter notebook中显现成果。

regression_perfomance_dashboard.show()

咱们还将其保存为 .html 文件,以便轻松同享。

regression_performance_dashboard.save('regression_performance_at_training.html')

咱们能够看到模型质量很好,因为咱们只练习了四个星期的数据!

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

更多好消息:差错是对称的而且散布在零邻近。 没有明显的轻视或高估。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

咱们将持续将练习中模型体现的数据集作为咱们的”reference”。 它让咱们很好地感受到了咱们在出产运用中能够从咱们的模型中取得的质量。 因此,咱们能够将未来的体现与这个基准进行比照。

进入自然环境:出产环境的第 1 周

在出产环境中调查模型有简单的方针。咱们想检测是否有问题。

咱们还想诊断底子原因并快速了解怎么处理它。或许,模型退化得太快了,咱们需求更频频地从头练习它?或许,差错太高,需求对模型进行适配并重建?哪些新形式正在呈现?

在咱们的比如中,咱们首要检查模型在练习数据之外的体现怎么。

咱们持续运用Jupyter notebook 示例。出于演示目的,咱们在一个批次中生成了未来几周的一切猜测。实践上,咱们会在数据进入时按顺序运转模型

要挑选剖析的时刻段,咱们将在 DataFrame 中指明行。

让咱们首要将第一周的体现与咱们在练习中看到的进行比较。前 28 天是咱们的参考数据集;接下来的7个是出产数据集。

regression_performance_dashboard.calculate(
    reference, 
    production.loc['2011-01-29 00:00:00':'2011-02-07 23:00:00'],
    column_mapping=column_mapping
    )

报表出来了!咱们能够快速将出产功能与咱们的参考功能进行比较。

估计会呈现一些衰退,但总体上看起来并没有那么糟糕。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

差错略有添加而且倾向于轻视。

让咱们检查一下咱们的方针是否有任何计算改变。 为此,咱们将生成方针漂移报表。

咱们从 Evidently 选项卡调用陈述。 在回归模型中,咱们的方针是数值,所以咱们挑选一个匹配的报表:

target_drift_dashboard = Dashboard(tabs=[NumTargetDriftTab])
target_drift_dashboard.calculate(
    reference, 
    production.loc['2011-01-29 00:00:00':'2011-02-07 23:00:00'],
    column_mapping=column_mapping)

咱们能够看到,实践租借自行车数量的散布仍然非常相似。 更准确地说,相似性假定没有被拒绝。 未检测到漂移。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

咱们猜测的散布也没有太大改变。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

尽管如此,一个合理的决定是通过包含新一周的数据来更新您的模型。 这样,模型能够持续学习,咱们或许能够改进过错。

为了演示,咱们将持续看看作业真的出了问题发展得有多快。

持续下周!

第 2 周:未能坚持杰出状况

再一次,咱们将新的一周与参考数据集进行比照。

regression_perfomance_dashboard.calculate(
    reference, 
    production.loc['2011-02-07 00:00:00':'2011-02-14 23:00:00'], 
    column_mapping=column_mapping)

乍一看,第二周的模型体现不同不大。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

MAE 几乎坚持不变。 可是,轻视的倾向持续添加。 看来这个过错不是随机的! 均匀而言,咱们轻视了十辆自行车。

要了解更多信息,咱们将转到图表。 咱们能够看到该模型很好地捕捉到了全体的每日趋势。 所以它学到了一些有用的东西! 可是,在高峰时段,实践需求往往高于预期。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

在差错散布图中,咱们能够看到它是怎么变得“更宽”的,因为咱们有更多具有高差错的猜测。 向左的移动也是可见的。 在某些极端状况下,咱们有 -80 到 40 辆自行车之间的过错,这是曾经看不到的。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

让咱们也检查一下咱们的方针漂移。

target_drift_dashboard.calculate(
    reference, 
    production.loc['2011-02-07 00:00:00':'2011-02-14 23:00:00'],
    column_mapping=column_mapping)

作业变得有趣了!

咱们能够看到方针散布现在不同了:相似性假定被拒绝了。 从字面上看,人们正在租借更多的自行车。 这与咱们的练习时期在计算上是不同的。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

可是,咱们的猜测散布未能坚持! 这是模型退化的一个明显比如。 世界上发生了一些新的作业,但它错过了形式。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

进一步调查很诱人。数据中有什么能够解说这种改变吗?假如有一些新信号,从头练习或许会协助模型坚持杰出状况。

在方针漂移陈述中,有一个部分能够协助咱们探究特征与方针(或模型猜测)之间的联系。

‍阅读各个特征时,咱们能够检查是否发现任何新形式。 咱们知道猜测没有改变,所以咱们只重视与方针的联系。

例如,随着租借自行车数量的相应添加,似乎正在向更高的温度(以摄氏度测量)改变。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

这对模型是新的!

或许,它会在从头练习中采用这些形式。 但就目前而言,咱们仅仅持续下周而没有任何更新。

第 3 周:当状况变得越来越糟糕时

好吧,现在状况看起来的确很糟糕。 在第 3 周,咱们面对质量大幅下降。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

绝对差错和百分比差错均明显添加。

假如咱们检查这些图,模型猜测明显分散。 咱们还面对模型无法猜测的具有高需求量的新数据段

但即便在方针值的已知规模内,模型现在也会犯错。 自从练习以来,状况的确发生了改变。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

咱们能够看到模型不能很好地揣度。 猜测的需求量坚持在相同的已知规模内,而实践值正在达到峰值。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

假如咱们扩大特定日期,咱们或许会以为该过错在一天中的特定(活跃的)时刻更高。 咱们从晚上 10 点到早上 6 点做得很好!

可是,咱们在解说这种形式时应该当心。这也或许是因为其他一些相关要素,例如:在这些相同时刻的温度更温暖。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

Evidently 生成更多图表来显现过错。 在当前状况下,这些是描绘同一个故事的不同办法。 咱们有一个很大的过错,而且它明显倾向于轻视。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

在曩昔的几周中,这些相同模型质量问题的前期迹象已经显现。 随着改变的积累,它们被扩大了。

‍回归功能陈述还生成了一组调查,以深入了解体现不佳的段(segments)。 方针是探究特定的特征规模是否能够解说过错。

在咱们的示例中,咱们特别想了解模型轻视了方针函数的段(segments)。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

差错偏差表供给了更多细节。

咱们按“Range%”字段对其进行排序。假如特定特征的值在模型轻视或高估的组中存在明显差异,则该特征将排名靠前。

在咱们的比如中,咱们能够看到极端差错取决于“temp”(温度)和“atemp”(感觉温度)特征。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

在练习中,状况并非如此。 咱们在不同的温度下有各式各样的过错,没有共同的形式。

在这个快速剖析之后,咱们对模型功能及其弱点有了更具体的了解。 该模型面对着新的、异常高的需求量。 考虑到它是怎么练习的,它往往会轻视它。 最重要的是,这些过错底子不是随机的。 至少,它们与咱们调查到的温度有关。 温度越高,轻视的幅度越大。

它提出了模型曾经无法学习的与天气相关的新形式。 日子越来越温暖了,模型变得离群了。

假如咱们运转方针漂移报表,咱们还将看到特征和方针之间的线性相关性的相关改变。 温度和湿度脱颖而出。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

在这一点上,该模型似乎无用。这是一个生动的比如,说明在有限数据集上练习的模型怎么无法捕捉时节性形式。

咱们应该尽快从头练习,并经常这样做,直到咱们学会一切的形式。 假如咱们不习惯频频的再练习,咱们或许会挑选更适合时刻序列或推理更好的算法。

在它崩溃之前:数据和猜测漂移

在实践中,一旦咱们取得了ground truth,咱们的确能够快速纠正方向。 假如咱们在第一周后从头练习模型,它或许不会那么戏曲性地完毕。

可是,假如咱们没有可用的ground truth怎么办? 咱们能提早捕捉到这种退化吗?

在这种状况下,咱们能够剖析数据漂移。 咱们不需求实践值来计算差错。 相反,咱们的方针是检查输入数据是否发生了改变。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

再一次,让咱们将出产的第一周数据与练习中的数据进行比较。

当然,咱们能够检查咱们一切的特征。 但咱们也能够得出结论,分类特征(如“时节”、“假日”和“作业日”)不太或许改变。让咱们只看数字特征!

咱们指定这些特征,以便该东西运用正确的计算测验。 在这种状况下,它将是 Kolmogorov-Smirnov 测验。

column_mapping = {}
column_mapping['numerical_features'] = numerical_features

然后,咱们调用所选时刻段的漂移报表:

data_drift_dashboard = Dashboard(tabs=[DataDriftTab])
data_drift_dashboard.calculate(
    reference, 
    production.loc['2011-01-29 00:00:00':'2011-02-07 23:00:00'],
    column_mapping=column_mapping)

一旦咱们显现报表,它就会返回一个答案。 咱们能够在第一周看到特征散布的计算改变。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

让咱们扩大咱们平常的疑点——温度(temperature)。

该报表为咱们供给了关于特征散布怎么随时刻演化的两个展现。 咱们能够注意到调查到的温度是怎么一天天变高的。

这些值明显偏离了咱们在练习中看到的绿色走廊(与均匀值的一个标准偏差)。 从安稳的增加来看,咱们能够置疑有上升的趋势。

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

在这个图表中,咱们还看到:天气越来越温暖了。 这不是咱们的模型所习惯的!

如何在 20 天内损坏一个模型? 一个生产环境模型分析教程(Evidently)

正如咱们之前检查的那样,咱们在第一周后没有检测到模型猜测中的漂移。鉴于咱们的模型不拿手揣度,咱们不应该真的期望它。

这种猜测漂移或许仍然会发生,并会宣布比如输入数据损坏之类的信号。在其他状况下,假如咱们有一个更敏感的模型,咱们会调查到它。

尽管如此,仅数据漂移本身就能够供给超卓的前期监控,以检测改变并对其做出反应。

结语

频频的再练习是处理出产模型保护问题的一种办法。监控和可调查性添加了一层以保证模型质量。

为什么咱们应该将它包含在咱们的作业流程中?

  • 它加快了调试速度。每逢您的模型失利时,您都需求确认底子原因。预先构建的仪表板使其更快。
  • 它详细显现了功能。假如在穿插验证中只依靠聚合模型的功能,它或许会掩盖重要的形式。您的模型或许会在特定段上静默失利并需求重建。
  • 它有助于改进模型。您能够探究模型在何处以及怎么犯错。它有助于确认最佳模型架构、从头练习方案、生成特征工程的想法。或者,向您的主题专家提出正确的问题。
  • 它让你积极主动。数据输入的改变或许是模型质量的最重要目标。咱们期望在问题导致模型失利之前发现这些问题。

原文链接:How to break a model in 20 days. A tutorial on production model analytics