用Python監測MLOps管道中的模型性能
譯文點擊參加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