首页 >科技周边 >人工智能 >Python中使用Nannyml的端到端ML模型监视工作流程

Python中使用Nannyml的端到端ML模型监视工作流程

William Shakespeare
William Shakespeare原创
2025-03-08 10:55:11826浏览

为什么监视ML模型?

>

机器学习项目是迭代过程。您不仅会在jupyter笔记本中取得成功的模型。在模型在线之后,您甚至都不会停止,人们可以访问它。即使在部署后,您也必须不断照顾它,以便它与在开发阶段一样工作。

> Zillow的丑闻是如果您不会发生的情况,会发生什么。 2021年,Zillow由于其机器学习模式估计房价而损失了3.04亿美元。 Zillow超过7000户房屋,不得不以更低的价格卸载它们。该公司被自己的模型“剥夺”,不得不将其劳动力减少25%。

这些类型的静音模型故障在现实世界模型中很常见,因此需要在生产性能下降之前不断更新。不这样做会损害公司的声誉,对利益相关者的信任以及最终的口袋。

漂移检测:

>检测培训和生产数据之间的数据分布变化。
  • 绩效估算:>估计生产中的模型性能而没有立即地面真相。
  • >自动报告:生成有关已部署模型健康和性能的报告。
  • >
  • 警报系统:提供有关数据漂移和性能问题的警报。
  • 模型公平评估:监视模型的公平性,以防止偏见。 与ML框架的兼容性:
  • 与所有机器学习框架集成。
  • 用户友好的接口:
  • 提供一个熟悉的Scikit-Like界面。
  • 我们将学习这些功能的技术位。
  • 涵盖的先决条件 >我们将通过机器人掌握射箭的类比来学习模型监视的基本概念。
在我们的类比中:

机器人代表我们的机器学习模型。

目标代表我们模型的目标或目标。

>我们可以说这是一个回归问题,因为得分是根据箭头射向公牛眼的近距离计算的 - 中心中的红点。

>箭头和弓的特征,以及机器人的物理属性和环境条件(例如风和天气),是我们模型的功能或输入变量。
    >
  • >所以,让我们开始。
  • 数据漂移

    想象一下,我们已经仔细准备了弓,箭头和目标(如数据准备)。我们的机器人配备了许多传感器和相机,在训练过程中射击了10000次。随着时间的流逝,它开始以令人印象深刻的频率吸引公牛的眼睛。我们对性能感到兴奋,并开始将机器人及其副本出售给射箭爱好者(部署模型)。

    ,但是很快,我们会收到一系列的投诉。一些用户报告机器人完全缺少目标。惊讶的是,我们聚集了一个团队讨论出了什么问题。

    我们发现的是一个经典案例的数据漂移

    。机器人运行的环境发生了变化 - 不同的风模式,变化的湿度水平,甚至改变了箭头的物理特征(重量,平衡)和弓。

    输入功能中的这种现实世界转移已经脱离了机器人的准确性,类似于机器学习模型在输入数据(尤其是功能之间的关系,随时间变化)时的表现如何。 概念漂移

    解决这些问题后,我们发布了一批新的机器人。然而,在几周内,类似的投诉流动。困惑,我们更深入地挖掘,发现目标经常被用户取代。

    这些新目标的大小各不相同,并将其放置在不同的距离上。此更改需要对机器人的射击技术的不同方法 -

    概念漂移

    的教科书示例。 在机器学习术语中,概念漂移在输入变量与目标结果之间的关系发生变化时会发生概念漂移。对于我们的机器人而言,新的目标类型意味着它们现在需要以不同的方式适应拍摄,就像机器学习模型需要大量训练的数据动态时需要调整。

    更多的概念和数据漂移的实际示例

    要将积分驱动回家,让我们探索一些现实世界中的数据和概念漂移的发生方式。

    数据漂移示例

    1. 信用评分模型:经济转变改变了人们的支出和信贷习惯。如果信用评分模型无法适应,则可能会导致不合理的拒绝或冒险的批准。
    2. > 健康监测系统:在医疗保健中,用户人口统计或传感器校准的变化可能导致监测患者生命的模型的健康评估不准确。
    3. >
    4. 零售需求预测:在零售业中,消费者行为和趋势的转变可以使过去的基于销售数据的模型无效地预测当前产品需求。
    >概念漂移示例

    1. 社交媒体内容审核:内容审核模型必须不断适应不断发展的语言和文化现象,否则风险误导了被认为不合适的内容。>
    2. >
    3. >自动驾驶汽车:自动驾驶汽车中的型号必须针对基于区域的交通规则和条件进行更新。 >欺诈检测模型:
    4. 随着欺诈策略的发展,欺诈检测模型需要更新以识别新兴模式。
    5. 现在,让我们考虑一个端到端的ML监视工作流程。> 端到端的ML模型监视工作流如何?
    6. 模型监视涉及ML工程师应遵循的三个主要步骤。
    1。监视性能

    第一步当然是密切关注部署中的模型性能。但这说起来容易做起来难。

    >立即用于生产模型的地面真理时,很容易检测模型行为的变化。例如,用户可以立即在我们的机器人/射箭类比中分辨出什么问题,因为他们可以查看目标并告诉我们机器人错过了 - 直接地面真相。 相比之下,以预测贷款默认值的模型为例。这样的模型可以预测用户是否每月默认下一次付款。要验证预测,该模型必须等到实际付款日期。这是

    延迟地面真相

    的一个示例,在现实世界的机器学习系统中最常见。

    在这种情况下,等待地面真相以至于无法看模型是否表现良好是昂贵的。因此,ML工程师需要使用方法来估计模型性能。这是CBPE或DLE等算法进来的地方(稍后再介绍)。

    > 也可以通过测量直接业务影响,即监视KPI(关键绩效指标)来完成监视模型。在Zillow的情况下,适当的监视系统可以检测到损益并提醒工程师(假设)。

    2。根本原因分析

    如果监视系统检测到性能下降,无论该系统是否分析了实现的性能(以地面真相)或估计的性能(没有地面真相),ML工程师必须确定下降背后的原因。

    这通常涉及单独检查功能或组合数据(功能漂移)并检查概念漂移目标的目标。 根据他们的发现,他们采用了各种问题解决技术。

    3。问题分辨率

    这是一项非排他性的技术列表,可以减轻遗传后绩效降级造成的损害:

    >

    数据重新平衡:

    如果性能下降是由于数据漂移引起的,则调整训练数据集以反映当前条件是一个不错的选择。
      >
    1. >功能工程:更新或创建新功能可以提高模型性能。在概念漂移的情况下,这是一种很好的方法,其中输入和输出之间的关系发生了变化。
    2. 模型重新培训:一种更昂贵的方法是用新的数据对模型进行重新培训,以确保其保持准确。这对数据和概念漂移都很好。>
    3. 模型微调:
    4. 而不是从头开始重新培训,可以在最近的数据集中微调一些模型。这与深度学习和生成模型都很好。 >
    5. >异常检测:
    6. 使用异常(新颖)检测方法可能早日识别生产数据中的异常模式。 >领域的专业知识参与:
    7. 吸引领域专家可能会提供有关模型为什么表现不佳的深刻见解。>
    8. 每个方法都有其应用程序上下文,通常,您最终可能会实现它们的组合。> Nannyml 涉及此迭代过程的前两个步骤。所以,让我们开始吧。
    9. >步骤1:准备Nannyml的数据 除了培训和验证集外,Nannyml还需要两套称为参考和分析的其他集合,以开始监视。本节教您如何从任何数据中创建它们。>
    10. 首先,我们需要一个已经经过培训并准备部署到生产中的模型,以便我们可以监视它。为此,我们将使用Diamonds数据集并训练XGBoost回归器。
    加载数据,定义特征和目标

    导入模块后的第一步是从Seaborn加载钻石数据集。但是,我们将使用我专门为本文准备的数据集的特殊版本来说明监视的样子。您可以使用下面的摘要将数据集加载到环境中:

    >

    这个数据集的特殊版本具有一个名为“ Set”的列,我们将在第二秒中获取。

    >

    >目前,我们将提取所有功能名称,分类特征名称和目标名称:

    import warnings
    
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    import seaborn as sns
    import xgboost as xgb
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import OneHotEncoder
    
    warnings.filterwarnings("ignore")
    
    任务是回归 - 我们将预测钻石的价格鉴于其物理属性。

    钻石数据集相当干净。因此,我们执行的唯一预处理是将文本功能投放到PANDAS类别数据类型中。这是通过XGBoost启用自动分类数据预处理的要求。

    dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv"
    
    diamonds_special = pd.read_csv(dataset_link)
    diamonds_special.head()
    
    >让我们继续分类数据。

    >

    将数据分为四组

    >

    是的,您读了正确的。我们将将数据分为四组。传统上,您可能只将其分为三个:

    >

    • 训练集模型学习模式
    • 验证集用于超参数调整
    • >
    • 测试集在部署之前进行最终评估
    模型监视工作流程需要另一组来模仿生产数据。这是为了确保我们的系统通过使用正确的算法正确地检测到性能下降并报告出了什么问题。

    为此,我在“集合”列中标记了具有四个类别的钻石的行:

    >训练集代表70%,其余IARE分别为总数据中的10%。让我们将其拆分:
    # Extract all feature names
    all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist()
    
    # Extract the columns and cast into category
    cats = diamonds_special.select_dtypes(exclude=np.number).columns
    
    # Define the target column
    target = "price"
    

    但是,现实世界中的数据集不带有内置的设置标签,因此您必须自己手动将数据分为四组。这是一个使用Train_test_split从Sklearn中完成任务的函数
    for col in cats:
       diamonds_special[col] = diamonds_special[col].astype("category")
    

    >

    注意:
    diamonds_special.set.unique()
    ['train', 'val', 'test', 'prod']
    Categories (4, object): ['prod', 'test', 'train', 'val']
    
    使用“解释代码”按钮获取函数的逐条说明。

    > 现在,让我们继续进行模型培训。

    训练模型

    >在训练XGBoost模型之前,我们需要将数据集转换为DMATRICES。这是代码:

    现在,这是用已经调整过的超参数训练回归器的代码:>

    tr = diamonds_special[diamonds_special.set == "train"].drop("set", axis=1)
    val = diamonds_special[diamonds_special.set == "validation"].drop("set", axis=1)
    test = diamonds_special[diamonds_special.set == "test"].drop("set", axis=1)
    prod = diamonds_special[diamonds_special.set == "prod"].drop("set", axis=1)
    
    tr.shape
    (37758, 10)
    
    很棒 - 我们有一个模型,可以在验证集上实现RMSE的503美元。让我们在测试集上的最后一次评估模型:

    def split_into_four(df, train_size=0.7):
       """
       A function to split a dataset into four sets:
       - Training
       - Validation
       - Testing
       - Production
       train_size is set by the user.
       The remaining data will be equally divided between the three sets.
       """
       # Do the splits
       training, the_rest = train_test_split(df, train_size=train_size)
       validation, the_rest = train_test_split(the_rest, train_size=1 / 3)
       testing, production = train_test_split(the_rest, train_size=0.5)
    
       # Reset the indices
       sets = (training, validation, testing, production)
       for set in sets:
           set.reset_index(inplace=True, drop=True)
    
       return sets
    
    
    tr, val, test, prod = split_into_four(your_dataset)
    
    测试性能为551 $。那就足够了。

    创建一个参考集
    dtrain = xgb.DMatrix(tr[all_feature_names], label=tr[target], enable_categorical=True)
    dval = xgb.DMatrix(val[all_feature_names], label=val[target], enable_categorical=True)
    
    dtest = xgb.DMatrix(
       test[all_feature_names], label=test[target], enable_categorical=True
    )
    dprod = xgb.DMatrix(
       prod[all_feature_names], label=prod[target], enable_categorical=True
    )
    
    到目前为止,一切都很简单。现在,我们来到主要部分 - 创建参考和分析集。

    >

    >参考集是模型监视上下文中使用的测试集的另一个名称。 Nannyml在测试集上使用该模型的性能作为生产性能的基准。参考集必须具有两列,除了:

    的功能:
    • 目标本身 - 地面真相 - 钻石价格
    • 测试预测 - 我们将它们生成y_test_pred
    • >

    >现在,我们的测试集包含功能和目标,但缺少y_test_pred:

    import warnings
    
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    import seaborn as sns
    import xgboost as xgb
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import OneHotEncoder
    
    warnings.filterwarnings("ignore")
    

    >让我们添加:

    dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv"
    
    diamonds_special = pd.read_csv(dataset_link)
    diamonds_special.head()
    

    现在,我们将将测试集重命名为参考:

    # Extract all feature names
    all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist()
    
    # Extract the columns and cast into category
    cats = diamonds_special.select_dtypes(exclude=np.number).columns
    
    # Define the target column
    target = "price"
    

    创建分析集

    在这一点上,让我们想象我们的回归器已部署到云中。想象比实际部署模型更简单,这对于本文来说是过度的。

    我们部署了钻石定价模型后,我们收到了一个消息,即大量钻石即将到来。在货物到达之前,钻石的物理测量已作为产品发送给我们(我们仍在想象中),以便我们可以为它们创造价格并在我们的网站上开始营销。因此,让我们生成。

    在实际的钻石到达之前,

    >人类专家验证了我们的模型产生的价格,我们必须检查模型是否表现良好。我们不想在我们的网站上展示以不准确的价格显示钻石。
    for col in cats:
       diamonds_special[col] = diamonds_special[col].astype("category")
    
    为此,我们需要通过将y_prod_pred与新钻石的实际价格(地面真相)进行比较来衡量模型的性能。但是在验证价格之前,我们不会有真相。因此,我们需要在没有地面真理的情况下估算模型的性能。

    要执行此任务,Nannyml需要一个分析集 - 包含模型预测的生产数据的数据。

    创建分析集类似于创建参考:

    现在,我们准备估计回归器的性能。

    >

    步骤2:估计Nannyml

    的性能 Nannyml提供了两种主要算法,用于估计回归和分类模型的性能:

    diamonds_special.set.unique()
    ['train', 'val', 'test', 'prod']
    Categories (4, object): ['prod', 'test', 'train', 'val']
    

    >

    直接损失估计

    (DLE)的回归

    > 基于置信的性能估计

    (CBPE)用于分类

    • >我们将使用DLE算法来完成我们的任务。 DLE可以在没有地面真理的情况下衡量生产模型的性能,并报告各种回归伪对象,例如RMSE,RMSLE,MAE等 要使用DLE,我们首先需要对其进行拟合以建立基线性能。>
    • 在Nannyml中使用DLE估算性能
    • >初始化DLE需要三个参数 - 输入特征名称,包含测试地面真相的列的名称以及包含测试预测的列的名称。 >此外,我们还将RMSE作为度量和块的大小为250。
    我们有一个可以绘制的nannyml结果对象。让我们看看它产生了什么:

    import warnings
    
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    import seaborn as sns
    import xgboost as xgb
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import OneHotEncoder
    
    warnings.filterwarnings("ignore")
    

    Python中使用Nannyml的端到端ML模型监视工作流程

    >让我们解释图 - 它具有两个部分,可以在参考和分析集中显示性能。如果估计的生产RMSE超出了阈值,则Nannyml将其标记为警报。

    如我们所见,我们有一些生产数据的警报,这表明在最后一批中发生了一些腥的事情。

    >

    步骤3:估计与在监视中实现的性能

    我们的监视系统告诉我们,模型性能在生产中下降了大约一半。但这只是一个估计 - 我们不能肯定地说。

    >当我们绘制估计绩效时,货物已经到来,我们的钻石专家计算了他们的实际价格。我们将它们作为价格存储在产品中。

    现在,我们可以将模型的实现性能(实际性能)与估计的性能进行比较,以查看我们的监视系统是否运行良好。

    Nannyml提供了一个绩效calculator类来做到这一点:

    课程需要四个参数:

    dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv"
    
    diamonds_special = pd.read_csv(dataset_link)
    diamonds_special.head()
    
    Quards_type:是什么任务?

    >

    y_true:标签是什么?
    • y_pred:在哪里可以找到预测?
    • >指标:我用哪些指标来计算性能?
    • 通过这些并将计算器拟合到参考后,我们计算分析集。
    • 要比较aleadized_results与estated_results进行比较,我们再次使用视觉

    >好吧,看起来估计的RMSE(紫色)非常接近实际性能(已实现的RMSE,蓝色)。

    >这告诉我们一件事 - 我们的监视系统运行良好,但是我们的模型并非如此,正如损失上升所表明的那样。那么,原因是什么?

    我们现在将深入研究。
    # Extract all feature names
    all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist()
    
    # Extract the columns and cast into category
    cats = diamonds_special.select_dtypes(exclude=np.number).columns
    
    # Define the target column
    target = "price"
    
    >

    >步骤4:漂移检测方法Python中使用Nannyml的端到端ML模型监视工作流程

    如介绍中所述,模型失败的最常见原因之一是漂移。在本节中,我们将重点介绍数据(功能)漂移检测。

    >

    漂移检测是模型监视工作流程的根本原因分析步骤的一部分。它通常从多变量漂移检测开始。

    多变量漂移检测

    >最佳的多元漂移检测方法之一是使用PCA计算数据重建误差。它的运行效果非常好,甚至可以在特征分布中遇到丝毫漂移。这是此方法的高级概述:

    1。 PCA拟合参考并将其压缩到较低的维度-Reference_lower。

    在此步骤中,由于PCA的性质而丢失了有关原始数据集的一些信息。

    2。然后将Reference_lower解压缩到其原始维度 - reference_reconstructed。

    • 由于信息在步骤1中丢失,因此重建的数据将与参考完全相同。
    3。参考和参考_reconstructed之间的差异被发现并称为

    数据重建错误 - reconstruct_error。

      reconstruct_error作为比较生产数据的重建错误
  • 4。相同的还原/重建方法应用于生产数据的批次。

如果生产数据的重建误差高于基线,我们说这些功能已经漂移。

>
    该系统向我们发出警报,提示我们进一步调查生产数据
  • 这四个步骤在Nannyml中以DataReconstructionDriftCalcultator类的形式实现。这是使用它的方法:

>一旦我们有每个数据块的错误(每个数据250行),我们就可以绘制它:

import warnings

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder

warnings.filterwarnings("ignore")

dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv"

diamonds_special = pd.read_csv(dataset_link)
diamonds_special.head()
如我们所见,重建误差非常高,表明特征的漂移。我们也可以将错误与实现的性能进行比较:

Python中使用Nannyml的端到端ML模型监视工作流程

如我们所见,所有损失中的尖峰都与重建错误中的警报相对应。
# Extract all feature names
all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist()

# Extract the columns and cast into category
cats = diamonds_special.select_dtypes(exclude=np.number).columns

# Define the target column
target = "price"
>

单变量漂移检测Python中使用Nannyml的端到端ML模型监视工作流程

>数据重建误差是一个单个数字,用于测量所有功能的漂移。但是,单个功能的漂移呢?如果我们的数据集包含数百个功能,我们将如何找到最漂流的功能并采取适当的措施?

这就是我们使用单变量漂移检测方法的地方。 Nannyml提供了多种,具体取决于功能类型:

分类特征:

连续特征: wasserstein,kolgomor-smirnov test >
  • > Jensen-Shannen距离,Hellinger距离
  • 所有这些都将单个特征的分布与分析集的分布进行了比较。我们可以在UnivariatedRiftCalculator类中使用一些(甚至全部):> >唯一必需的参数是column_names,其余的可以使用nannyml设置的默认值。但是,为了使事情变得简单,我们正在使用Wasserstein和Jensen_Shannon来进行连续和绝对的特征。
  • >现在,我们有11个功能,因此呼叫plot()。show()可能不会产生最佳的结果。取而代之的是,我们可以使用一个警报计数等级
  • 来返回提供最多警报的功能(当考虑所有块时)。这是代码:
  • >一旦我们获得了排名结果,我们就可以打印其头部,因为它是熊猫数据框架:
>

for col in cats:
   diamonds_special[col] = diamonds_special[col].astype("category")

>我们可以看到最有问题的特征是颜色和深度。这并不令我感到惊讶,因为是我在写这篇文章之前人为地使他们漂流了。

>但是,如果这是一个现实世界中的情况,您将需要花一些时间来解决这些功能的问题。

>

结论

>我发现模型监视引人入胜,因为它破坏了一旦拥有良好的模型完成机器学习的幻想。随着地球的转变和用户模式的变化,很长一段时间都没有模型保持相关。这使得模型监视成为任何ML工程师技能集的关键部分。

>

今天,我们介绍了一个基本的模型监视工作流程。我们首先讨论了基本监测概念。然后,我们首先将目光投向了代码:我们将数据伪造成与Nannyml兼容的格式;创建了我们的第一个估计模型性能图,创建了另一个将其与实现性能进行比较的图。收到了一些警报,表现正在下降;用多元漂移检测对其进行了检查;发现重型特征漂移;通过单独的特征漂移检测对其进行了仔细检查;确定了漂流功能。

不幸的是,我们停止了问题解决方案。监视工作流程的最后一步超出了本文的范围。但是,我有一些很好的建议,可以涵盖它,更多地涉及模型监视:

>

机器学习监控概念课程
  • python课程中的机器学习监控
  • >
  • 我还建议阅读一些动手教程的保姆ML文档。
>

以上是Python中使用Nannyml的端到端ML模型监视工作流程的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn