点击参加51CTO网站内容调查问卷
译者 | 布加迪
审校 | 重楼
机器学习模型只有在生产环境中用于解决业务问题时才有帮助。然而,业务问题和机器学习模型在不断发展变化。这就要求我们维护机器学习,以便性能跟得上业务KPI。这就是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')
数据集漂移
evidently软件包将自动显示一份报告,表明数据集所出现的情况。该信息包括数据集漂移和列漂移。对于上述示例而言,没有出现任何数据集漂移,但是有两列出现了漂移。
报告显示,列“property_claim”和“timestamp”确实检测到了漂移。这些信息可以用在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')
在结果中,我们得到的当前模型质量指标低于参考(由于我们使用训练数据作为参考,这在预料之中)。视业务需求而定,上述度量指标表明我们需要采取的下一步。不妨看看从evidently报告中得到的其他信息。
类Representation报告显示了实际的类分布。
混淆矩阵显示了预测值与参考数据集和当前数据集中的实际数据的对比情况。
按类的质量度量指标显示了每个类的性能如何。
与前面一样,我们可以使用以下代码将分类性能报告转换成字典日志。
classification_performance_report.as_dict ()
以上就是全部内容。您可以在当前拥有的任何MLOps管道中设置模型性能监测机制,它仍然可以很好地工作。
结语
模型性能监测是MLOps管道中的一项基本任务,帮助确保我们的模型跟上业务需求。使用一个名为evidently的Python软件包,我们就能轻松设置模型性能监测机制,它可以整合到任何现有的MLOps管道中。
原文标题:Monitor Model Performance in the MLOps Pipeline with Python,作者:Cornellius Yudha Wijaya