用Python监测MLOps管道中的模型性能

点击参加51CTO网站内容调查问卷

译者 | 布加迪

审校 | 重楼

机器学习模型只有在生产环境中用于解决业务问题时才有帮助。然而,业务问题和机器学习模型在不断发展变化。这就要求我们维护机器学习,以便性能跟上业务KPI。这就是MLOps概念的由来

用Python监测MLOps管道中的模型性能

MLOps或机器学习运营是一整套用于生产环境中机器学习的技术和工具。MLOps处理的事情机器学习自动化、版本控制、交付和监测。本文重点介绍监测以及如何在生产环境中使用Python软件来监测模型性能

监测模型性能

我们谈论MLOps中的监测时,它其实指很多方面,因为MLOps的原则之一就是监测比如说:

  • 监测数据分布在一段时间以来的变化
  • 监测开发环境和生产环境中使用的功能特性
  • 监测模型衰减
  • 监测模型性能
  • 监测系统失效情况

MLOps中仍然有许多方面需要监测,但是本文重点关注监测模型性能。在本文中,模型性能是指模型利用没有见过的数据做出可靠预测的能力,用特定的度量指标(比如准确性、精度召回率等)加以衡量。

什么我们需要监测模型性能?为了保持模型预测的可靠性以解决业务问题。在部署到生产环境之前,我们经常计算模型性能及其对KPI的影响。比如说,如果我们希望模型仍然遵循业务需求,基准要求是70%的准确性,但低于这个标准不可接受。这就是为什么监测性能可以保证模型始终满足业务需求

使用Python,我们将学习如何实现模型监测。不妨从安装软件入手。模型监测方面有很多选择,但是就本文而言,我们将使用名为evidently开源软件包进行监测。

用Python设置模型监测

首先我们需要用以下代码安装evidently软件包。

pip install evidently

安装完软件包后,我们将下载数据示例,即来自Kaggle的保险索赔数据。此外,我们将在进一步使用这些数据之前清理数据。

import pandas as pd

df = pd.read_csv("insurance_claims.csv")

# Sort the data based on the Incident Data
df = df.sort_values(by="incident_date").reset_index(drop=True)

# Variable Selection
df = df[
 [
  "incident_date",
 "months_as_customer",
  "age",
 "policy_deductable",
  "policy_annual_premium",
 "umbrella_limit",
  "insured_sex",
 "insured_relationship",
  "capital-gains",
 "capital-loss",
 "incident_type",
  "collision_type",
 "total_claim_amount",
 "injury_claim",
 "property_claim",
 "vehicle_claim",
  "incident_severity",
 "fraud_reported",
 ]
]

# Data Cleaning and One-Hot Encoding
df = pd.get_dummies(
 df,
 columns=[
  "insured_sex",
  "insured_relationship",
 "incident_type",
 "collision_type",
  "incident_severity",
 ],
 drop_first=True,
)

df["fraud_reported"] = df["fraud_reported"].apply(lambda x: 1 if x == "Y" else 0)

df = df.rename(columns={"incident_date": "timestamp", "fraud_reported": "target"})

for i in df.select_dtypes("number").columns:
 df[i] = df[i].apply(float)

data = df[df["timestamp"] < "2015-02-20"].copy()
val = df[df["timestamp"] >= "2015-02-20"].copy()

在上面的代码中,我们选择了一些用于训练模型的列,将它们转换数字表示,并将数据分为参考数据data和当前数据val

我们需要MLOps管道中的参考或基数据来监测模型性能。它通常是训练数据分开来的数据(比如测试数据。此外,我们还需要当前数据或模型未看到的数据(入站数据)

不妨使用evidently来监测数据和模型性能。由于数据漂移会影响模型性能,所以它也是需要监测的对象

from evidently.report import Report
from evidently.metric_preset import DataDriftPreset

data_drift_report = Report(metrics=[
  DataDriftPreset(),
])

data_drift_report.run(current_data=val, reference_data=data, column_mapping=None)
data_drift_report.show(mode='inline')

数据集漂移

用Python监测MLOps管道中的模型性能

evidently软件包将自动显示一份报告,表明数据集所出现的情况。该信息包括数据集漂移和列漂移。对于上述示例而言没有出现任何数据集漂移,但是有两列出现了漂移。

用Python监测MLOps管道中的模型性能

报告显示,列property_claimtimestamp确实检测到了漂移。这些信息可以在MLOps管道中重新训练模型,或者我们仍需要进一步的数据探索。

如果需要,我们也可以在日志字典对象中获取上述数据报告。

data_drift_report.as_dict()

接下来,不妨尝试从数据中训练分类器模型,并尝试使用evidently来监测模型性能。

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier()
rf.fit(data.drop(['target', 'timestamp'], axis = 1), data['target']) 

evidently将需要参考数据集和当前数据集中的目标列和预测列。不妨将模型预测添加到数据集中,并使用evidently来监测性能。

data['prediction'] = rf.predict(data.drop(['target', 'timestamp'], axis = 1))
val['prediction'] = rf.predict(val.drop(['target', 'timestamp'], axis = 1))

捎带提一下,最好使用不是训练数据的参考数据来监测模型性能。不妨使用以下代码设置模型性能监测。

from evidently.metric_preset import ClassificationPreset

classification_performance_report = Report(metrics=[
  ClassificationPreset(),
])

classification_performance_report.run(reference_data=data, current_data=val)

classification_performance_report.show(mode='inline')

用Python监测MLOps管道中的模型性能

在结果中,我们得到的当前模型质量指标低于参考(由于我们使用训练数据作为参考,这在预料之中)业务需求而定上述度量指标表明我们需要采取的下一步。不妨看看从evidently报告中得到的其他信息。

用Python监测MLOps管道中的模型性能

类Representation报告显示了实际的类分布。

用Python监测MLOps管道中的模型性能

混淆矩阵显示了预测值与参考数据集和当前数据集中的实际数据的对比情况。

用Python监测MLOps管道中的模型性能

按类的质量度量指标显示每个类的性能如何。

与前面一样,我们可以使用以下代码将分类性能报告转换字典日志。

classification_performance_report.as_dict ()

以上就是全部内容。您可以在当前拥有的任何MLOps管道中设置模型性能监测机制,它仍然可以很好地工作。

结语

模型性能监测是MLOps管道中的一项基本任务,帮助确保我们的模型跟上业务需求。使用一个名为evidently的Python软件包,我们就能轻松设置模型性能监测机制,它可以整合到任何现有的MLOps管道中。

原文标题:Monitor Model Performance in the MLOps Pipeline with Python,作者:Cornellius Yudha Wijaya

© 版权声明

相关文章