首頁 > 科技週邊 > 人工智慧 > Python中使用Nannyml的端到端ML模型監視工作流程

Python中使用Nannyml的端到端ML模型監視工作流程

William Shakespeare
發布: 2025-03-08 10:55:11
原創
825 人瀏覽過

為什麼監視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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板