用Python監(jiān)測MLOps管道中的模型性能
譯文點(diǎn)擊參加51CTO網(wǎng)站內(nèi)容調(diào)查問卷
譯者 | 布加迪
審校 | 重樓
機(jī)器學(xué)習(xí)模型只有在生產(chǎn)環(huán)境中用于解決業(yè)務(wù)問題時(shí)才有幫助。然而,業(yè)務(wù)問題和機(jī)器學(xué)習(xí)模型在不斷發(fā)展變化。這就要求我們維護(hù)機(jī)器學(xué)習(xí),以便性能跟得上業(yè)務(wù)KPI。這就是MLOps概念的由來。
MLOps或機(jī)器學(xué)習(xí)運(yùn)營是一整套用于生產(chǎn)環(huán)境中機(jī)器學(xué)習(xí)的技術(shù)和工具。MLOps處理的事情從機(jī)器學(xué)習(xí)自動化、版本控制、交付和監(jiān)測。本文重點(diǎn)介紹監(jiān)測以及如何在生產(chǎn)環(huán)境中使用Python軟件包來監(jiān)測模型性能。
監(jiān)測模型性能
當(dāng)我們談?wù)?/span>MLOps中的監(jiān)測時(shí),它其實(shí)指很多方面,因?yàn)?/span>MLOps的原則之一就是監(jiān)測。比如說:
- 監(jiān)測數(shù)據(jù)分布在一段時(shí)間以來的變化
- 監(jiān)測開發(fā)環(huán)境和生產(chǎn)環(huán)境中使用的功能特性
- 監(jiān)測模型衰減
- 監(jiān)測模型性能
- 監(jiān)測系統(tǒng)失效情況
MLOps中仍然有許多方面需要監(jiān)測,但是本文重點(diǎn)關(guān)注監(jiān)測模型性能。在本文中,模型性能是指模型利用沒有見過的數(shù)據(jù)做出可靠預(yù)測的能力,用特定的度量指標(biāo)(比如準(zhǔn)確性、精度或召回率等)加以衡量。
為什么我們需要監(jiān)測模型性能?為了保持模型預(yù)測的可靠性以解決業(yè)務(wù)問題。在部署到生產(chǎn)環(huán)境之前,我們經(jīng)常計(jì)算模型性能及其對KPI的影響。比如說,如果我們希望模型仍然遵循業(yè)務(wù)需求,基準(zhǔn)要求是70%的準(zhǔn)確性,但低于這個(gè)標(biāo)準(zhǔn)不可接受。這就是為什么監(jiān)測性能可以保證模型始終滿足業(yè)務(wù)需求。
使用Python,我們將學(xué)習(xí)如何實(shí)現(xiàn)模型監(jiān)測。不妨從安裝軟件包入手。模型監(jiān)測方面有很多選擇,但是就本文而言,我們將使用名為evidently的開源軟件包進(jìn)行監(jiān)測。
用Python設(shè)置模型監(jiān)測
首先,我們需要用以下代碼來安裝evidently軟件包。
pip install evidently
安裝完軟件包后,我們將下載數(shù)據(jù)示例,即來自Kaggle的保險(xiǎn)索賠數(shù)據(jù)。此外,我們將在進(jìn)一步使用這些數(shù)據(jù)之前清理數(shù)據(jù)。
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()
在上面的代碼中,我們選擇了一些用于訓(xùn)練模型的列,將它們轉(zhuǎn)換成數(shù)字表示,并將數(shù)據(jù)分為參考數(shù)據(jù)(data)和當(dāng)前數(shù)據(jù)(val)。
我們需要MLOps管道中的參考或基準(zhǔn)數(shù)據(jù)來監(jiān)測模型性能。它通常是與訓(xùn)練數(shù)據(jù)分開來的數(shù)據(jù)(比如測試數(shù)據(jù))。此外,我們還需要當(dāng)前數(shù)據(jù)或模型未看到的數(shù)據(jù)(入站數(shù)據(jù))。
不妨使用evidently來監(jiān)測數(shù)據(jù)和模型性能。由于數(shù)據(jù)漂移會影響模型性能,所以它也是需要監(jiān)測的對象。
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')
數(shù)據(jù)集漂移
evidently軟件包將自動顯示一份報(bào)告,表明數(shù)據(jù)集所出現(xiàn)的情況。該信息包括數(shù)據(jù)集漂移和列漂移。對于上述示例而言,沒有出現(xiàn)任何數(shù)據(jù)集漂移,但是有兩列出現(xiàn)了漂移。
報(bào)告顯示,列“property_claim”和“timestamp”確實(shí)檢測到了漂移。這些信息可以用在MLOps管道中以重新訓(xùn)練模型,或者我們?nèi)孕枰M(jìn)一步的數(shù)據(jù)探索。
如果需要,我們也可以在日志字典對象中獲取上述數(shù)據(jù)報(bào)告。
data_drift_report.as_dict()
接下來,不妨嘗試從數(shù)據(jù)中訓(xùn)練分類器模型,并嘗試使用evidently來監(jiān)測模型性能。
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf.fit(data.drop(['target', 'timestamp'], axis = 1), data['target'])
evidently將需要參考數(shù)據(jù)集和當(dāng)前數(shù)據(jù)集中的目標(biāo)列和預(yù)測列。不妨將模型預(yù)測添加到數(shù)據(jù)集中,并使用evidently來監(jiān)測性能。
data['prediction'] = rf.predict(data.drop(['target', 'timestamp'], axis = 1))
val['prediction'] = rf.predict(val.drop(['target', 'timestamp'], axis = 1))
捎帶提一下,最好使用不是訓(xùn)練數(shù)據(jù)的參考數(shù)據(jù)來監(jiān)測模型性能。不妨使用以下代碼來設(shè)置模型性能監(jiān)測。
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')
在結(jié)果中,我們得到的當(dāng)前模型質(zhì)量指標(biāo)低于參考(由于我們使用訓(xùn)練數(shù)據(jù)作為參考,這在預(yù)料之中)。視業(yè)務(wù)需求而定,上述度量指標(biāo)表明我們需要采取的下一步。不妨看看從evidently報(bào)告中得到的其他信息。
類Representation報(bào)告顯示了實(shí)際的類分布。
混淆矩陣顯示了預(yù)測值與參考數(shù)據(jù)集和當(dāng)前數(shù)據(jù)集中的實(shí)際數(shù)據(jù)的對比情況。
按類的質(zhì)量度量指標(biāo)顯示了每個(gè)類的性能如何。
與前面一樣,我們可以使用以下代碼將分類性能報(bào)告轉(zhuǎn)換成字典日志。
classification_performance_report.as_dict ()
以上就是全部內(nèi)容。您可以在當(dāng)前擁有的任何MLOps管道中設(shè)置模型性能監(jiān)測機(jī)制,它仍然可以很好地工作。
結(jié)語
模型性能監(jiān)測是MLOps管道中的一項(xiàng)基本任務(wù),幫助確保我們的模型跟上業(yè)務(wù)需求。使用一個(gè)名為evidently的Python軟件包,我們就能輕松設(shè)置模型性能監(jiān)測機(jī)制,它可以整合到任何現(xiàn)有的MLOps管道中。
原文標(biāo)題:Monitor Model Performance in the MLOps Pipeline with Python,作者:Cornellius Yudha Wijaya