機器學習項目是迭代過程。您不僅會在jupyter筆記本中取得成功的模型。在模型在線之後,您甚至都不會停止,人們可以訪問它。即使在部署後,您也必須不斷照顧它,以便它與在開發階段一樣工作。
> Zillow的醜聞是如果您不會發生的情況,會發生什麼。 2021年,Zillow由於其機器學習模式估計房價而損失了3.04億美元。 Zillow超過7000戶房屋,不得不以更低的價格卸載它們。該公司被自己的模型“剝奪”,不得不將其勞動力減少25%。這些類型的靜音模型故障在現實世界模型中很常見,因此需要在生產性能下降之前不斷更新。不這樣做會損害公司的聲譽,對利益相關者的信任以及最終的口袋。
目標代表我們模型的目標或目標。
>我們可以說這是一個回歸問題,因為得分是根據箭頭射向公牛眼的近距離計算的 - 中心中的紅點。
想像一下,我們已經仔細準備了弓,箭頭和目標(如數據準備)。我們的機器人配備了許多傳感器和相機,在訓練過程中射擊了10000次。隨著時間的流逝,它開始以令人印象深刻的頻率吸引公牛的眼睛。我們對性能感到興奮,並開始將機器人及其副本出售給射箭愛好者(部署模型)。
,但是很快,我們會收到一系列的投訴。一些用戶報告機器人完全缺少目標。驚訝的是,我們聚集了一個團隊討論出了什麼問題。我們發現的是一個經典案例的
輸入功能中的這種現實世界轉移已經脫離了機器人的準確性,類似於機器學習模型在輸入數據(尤其是功能之間的關係,隨時間變化)時的表現如何。 概念漂移
解決這些問題後,我們發布了一批新的機器人。然而,在幾週內,類似的投訴流動。困惑,我們更深入地挖掘,發現目標經常被用戶取代。
的教科書示例。
在機器學習術語中,概念漂移在輸入變量與目標結果之間的關係發生變化時會發生概念漂移。對於我們的機器人而言,新的目標類型意味著它們現在需要以不同的方式適應拍攝,就像機器學習模型需要大量訓練的數據動態時需要調整。
要將積分驅動回家,讓我們探索一些現實世界中的數據和概念漂移的發生方式。
第一步當然是密切關注部署中的模型性能。但這說起來容易做起來難。
延遲地面真相
的一個示例,在現實世界的機器學習系統中最常見。如果監視系統檢測到性能下降,無論該系統是否分析了實現的性能(以地面真相)或估計的性能(沒有地面真相),ML工程師必須確定下降背後的原因。
這通常涉及單獨檢查功能或組合數據(功能漂移)並檢查概念漂移目標的目標。 根據他們的發現,他們採用了各種問題解決技術。3。問題分辨率
這是一項非排他性的技術列表,可以減輕遺傳後績效降級造成的損害:
數據重新平衡:
如果性能下降是由於數據漂移引起的,則調整訓練數據集以反映當前條件是一個不錯的選擇。
導入模塊後的第一步是從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)
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)
創建一個參考集
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:
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")
要執行此任務,Nannyml需要一個分析集 - 包含模型預測的生產數據的數據。
創建分析集類似於創建參考:現在,我們準備估計回歸器的性能。
>
步驟2:估計Nannyml的性能
Nannyml提供了兩種主要算法,用於估計回歸和分類模型的性能: > (CBPE)用於分類 >讓我們解釋圖 - 它具有兩個部分,可以在參考和分析集中顯示性能。如果估計的生產RMSE超出了閾值,則Nannyml將其標記為警報。 >
>當我們繪製估計績效時,貨物已經到來,我們的鑽石專家計算了他們的實際價格。我們將它們作為價格存儲在產品中。 現在,我們可以將模型的實現性能(實際性能)與估計的性能進行比較,以查看我們的監視系統是否運行良好。 diamonds_special.set.unique()
['train', 'val', 'test', 'prod']
Categories (4, object): ['prod', 'test', 'train', 'val']
(DLE)的回歸
>
基於置信的性能估計
我們有一個可以繪製的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")
我們的監視系統告訴我們,模型性能在生產中下降了大約一半。但這只是一個估計 - 我們不能肯定地說。
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()
>
y_true:標籤是什麼?>好吧,看起來估計的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:漂移檢測方法
>
漂移檢測是模型監視工作流程的根本原因分析步驟的一部分。它通常從多變量漂移檢測開始。多變量漂移檢測
>最佳的多元漂移檢測方法之一是使用PCA計算數據重建誤差。它的運行效果非常好,甚至可以在特徵分佈中遇到絲毫漂移。這是此方法的高級概述:
在此步驟中,由於PCA的性質而丟失了有關原始數據集的一些信息。
2。然後將Reference_lower解壓縮到其原始維度 - reference_reconstructed。
數據重建錯誤 - reconstruct_error。
如果生產數據的重建誤差高於基線,我們說這些功能已經漂移。
>>一旦我們有每個數據塊的錯誤(每個數據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()
如我們所見,所有損失中的尖峰都與重建錯誤中的警報相對應。
# 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"
單變量漂移檢測
這就是我們使用單變量漂移檢測方法的地方。 Nannyml提供了多種,具體取決於功能類型:
分類特徵:
>我們可以看到最有問題的特徵是顏色和深度。這並不令我感到驚訝,因為是我在寫這篇文章之前人為地使他們漂流了。
>
>
不幸的是,我們停止了問題解決方案。監視工作流程的最後一步超出了本文的範圍。但是,我有一些很好的建議,可以涵蓋它,更多地涉及模型監視:
>
for col in cats:
diamonds_special[col] = diamonds_special[col].astype("category")
>我發現模型監視引人入勝,因為它破壞了一旦擁有良好的模型完成機器學習的幻想。隨著地球的轉變和用戶模式的變化,很長一段時間都沒有模型保持相關。這使得模型監視成為任何ML工程師技能集的關鍵部分。
>
以上是Python中使用Nannyml的端到端ML模型監視工作流程的詳細內容。更多資訊請關注PHP中文網其他相關文章!