漂移:在生產環境中測試ML模型

2021年5月27日上午11:35(太平洋時間)

下載幻燈片

部署機器學習模型已經成為一個相對無摩擦的過程。然而,正確部署具有健壯測試和監視框架的模型是一項複雜得多的任務。在生產ML模型時,沒有一種萬能的解決方案,通常需要使用多個庫和工具進行自定義實現。然而,有一組核心的統計測試和指標應該在適當的地方來檢測數據和概念漂移等現象,以防止模型在不知不覺中變得陳舊並對業務有害。

結合我們與Databricks客戶合作的經驗,我們深入探討了如何使用MLflow、SciPy和statmodebeplay体育app下载地址ls等開源工具在生產環境中測試您的ML模型。通過這次演講,您將掌握在生產環境中測試模型和數據有效性的關鍵原則,以及一個使用MLflow來輔助該過程重現性的可推廣演示。

在本節中請注意:
Eng Chengyin, Databricks數據科學顧問
Niall Turbitt, Databricks的高級數據科學家

成績單

英格:大家好。歡迎來到我們的演講,在生產中測試機器學習模型。在本次演講結束時,您將獲得一套測試和開源包選項,以在生產中測試您的模型和數據的有效性。讓我先自我介紹一下。我的名字是Eng Chengyin。我是Databricks的數據科學家。我為客戶實施數據科學解決方案,也教授機器學習。我的背景是計算機科學、統計學和環境研究。在加入數據庫之前,我在人壽保險行業工作。

尼爾·特比特:大家好。我叫尼爾·特比特。我也是Databricks的高級數據科學家。與Chengyin類似,我在歐洲的EMEA ML實踐團隊工作。因此,我把時間花在與客戶合作,構建和部署可擴展的機器學習解決方案,以及交付課程,重beplay体育app下载地址點是使用Spark進行數據科學和機器學習。在加入Databricks之前,我的背景是在多個領域構建可擴展的數據驅動和機器學習解決方案,如供應鏈預測、物流優化和推薦係統。

engchengyin Eng:酷。在這次演講中,我們將討論機器學習的生命周期,為什麼我們應該關心漂移和測試,以及我們不僅應該監控什麼,而且應該如何監控。最後,我們還將向您展示我們已經實現的工作流的演示。目前,我們看到許多公司在該業務中采用了機器學習,但根據gardener分析,令人驚訝的是,85%的數據科學項目實際上失敗了。另一項技術研究分析顯示,隻有4%的公司成功部署了他們的機器學習模型。這裏的失敗比例相當驚人。讓我們來探究一下原因。機器學習項目失敗的原因有很多,這裏我們隻關注生產階段。機器學習模型在長期生產環境中無法發揮作用的主要原因是,大多數數據科學家忽視了在部署後維護機器學習模型的重要性。
我們中的許多人認為,在將模型交付到生產環境之後,我們的工作就完成了。因此,我們忽略了在生產中重新訓練和測試我們的模型和數據以確保模型質量隨時間一致的重要性。也許這並不令人驚訝,考慮到ML運維是機器學習的一組最佳實踐,操作化是一個相對新興的觀點。關於在哪裏應用統計測試有很多困惑。特別是,要用什麼測試。這就是我們最希望揭示的區域。我們希望在這裏回答你的第一個問題。我們應該使用哪些統計測試來監視生產中的模型?有一些專有軟件可以部分地解決這個問題,但是我們想要收回專有軟件的層次,並從統計的角度進行檢查。
我們想回答的第二個問題是,我可以使用什麼工具來協調數據和模型的監控,我們想演示如何僅使用開源工具來設置這一點。在這次演講中,我們將重點討論在批處理場景中測試表格數據,但統計測試也與流媒體和實時場景相關。您還可以借用相同的總體框架來適應其他類型的數據,例如圖像和文本。在這次演講中,我們不會涉及模型部署的任何策略。我們將不涉及代碼的單元測試或集成測試。因為測試和監視對於每個用例和領域都是獨一無二的。這篇演講絕不是關於何時更新模型的規定性模型。相反,我們將介紹如何檢測這些特征變化和運動靜止。在我們深入討論測試之前,尼爾,你能談談MLS周期和為什麼我們應該監測它嗎?

尼爾·特比特:當然。因此,在我們解決如何實現監控的主題之前,我認為我們需要首先確定監控在機器學習係統的整個生命周期中發揮作用的位置。如果我們從我們第一次遇到業務問題的基礎開始,我們可能會有業務利益相關者帶著他們認為可以用機器學習解決的問題來找我們。我們將與團隊一起確定這個項目的成功是什麼樣子的。特別是,建立一個可測量的業務度量來評估我們模型的成功。確定範圍後,我們希望開始與數據團隊合作,確定我們是否有必要的數據來解決這樣的問題。在一些工作之後,我們有必要的數據管道來開始進行一些探索性的數據分析,或者我們將開始創建一些特征,然後考慮,我們是否有一些預測特征,使我們能夠預測目標?
然後,我們將進入對數據建模的有趣部分,並進入將模型擬合到數據的迭代反饋循環,評估我們的模型性能。當我們開始查看結果時,我們想要迭代地調整我們的數據收集過程,我們可能想要更新我們的特征生成過程並調整模型超參數,以達到我們最終滿意的最終模型。在這個階段,我們可能會覺得我們已經接近成功了。我們有一個表現良好的模型,它與我們持有的眼睛測試數據集相比表現良好。這隻是一個按下部署按鈕的問題。然而,在某些方麵,這實際上隻是模型生命周期的開始。以下模型部署和模型監控的組件通常是人們所說的MLS,正如Chengyin提到的那樣。但事實上,這是在問,你如何操作一個ML模型?我們如何決定何時以及如何部署一個模型將高度依賴於許多因素。
從新數據到達的速度到我們的模型需要多長時間來訓練?對於所有的機器學習部署來說,真的沒有什麼靈丹妙藥。它最終將是非常貶低和具體的問題。在開發模型來解決給定的業務問題時,一旦模型投入生產,如何維護模型通常會被嚴重忽視。如果有一件事我希望你們能從這次演講中得到特別的收獲,那就是在開發MLS解決方案時,要花相當多的時間來考慮該解決方案的更高的生產版本,該解決方案將被測量和監控。為什麼顯示器?模型部署並不是真正的結束。如果我們認為預測模型的結果是模型識別預測目標上某些輸入特征集之間模式的能力的結果,那麼我們的模型隻有在新數據與它最初訓練的數據足夠相似的情況下才會表現良好。
即使我們經常在合適的數據集上訓練模型,傳入數據的分布也會隨著時間的推移而改變。這些變化可以從無數的來源中產生。舉幾個例子,如果我們考慮誤差,上遊誤差是不可避免的。數據中的很大一部分更改將是來自上遊數據生成過程的錯誤更改的結果。外部因素也是如此,我們可以考慮市場變化、人類行為變化,或者任何外部因素,這些因素可能會影響收集到的潛在數據。隨著時間的推移,用戶偏好的改變會對我們的模型產生巨大的影響。這些過多的更改來源會真正影響我們的模型的表現,最終導致模型性能下降。模型會隨著時間的推移而退化,而不是模型是否退化的問題。這更多的是一個模型何時會退化的問題,以及我們是否能夠在它發生之前或發生時識別它,這是在將模型部署到生產環境後持續監控模型的主要動機。
我開始提到它,但是模型退化的一個核心原因是一種叫做漂移的現象。為了讓我們理解我們應該對生產模型進行哪些統計測試,我們首先必須了解可能發生的各種類型的漂移。最普遍的漂移形式如下,特征漂移你可能經常聽到它被稱為數據漂移或協變量漂移,這通常發生在潛在的輸入數據以某種方式改變的時候。我們訓練模型的特征分布發生了顯著變化。標簽漂移是指我們的標簽分布因為外界的影響而發生了顯著的變化。這通常是由實際底層特性本身的變化引起的。預測漂移,與標簽漂移高度相關。但這與外界的影響無關,它實際上直接與模型的一個特征相關,而這個特征是我們模型預測的一個變化。
概念漂移的產生是由於一些外部影響的結果改變了我們模型學到的基本模式它不再有效。所以我們的特征和我們試圖預測的標簽之間的潛在本質是隨著時間而進化的。然後雙擊其中一些。看看功能標簽和產品漂移,這些都可以在非常相似的情況下出現,並且通常以一種受限的方式出現。所以一個可以導致另一個。一些文獻經常將這些不同形式的漂移歸入數據漂移的範疇。Chengyin將介紹我們如何使用相同的測試集來識別這些不同形式的漂移,但隻是為了說明像特征漂移這樣的東西是什麼樣的讓我們先看看下麵兩個特征分布。在分類特征的上下文中,特征漂移可能是觀察到的每個類的實例分布與我們預期的不同。
如果我們看一下數字特征的上下文,如果我們有一個特征,比如年齡,我們發現這個輸入特征的均值和方差隨著時間的推移而變化,特征漂移就會變得明顯。另一方麵,概念漂移可以以許多不同的方式表現出來,最終每一種不同的形式都需要不同的方法來檢測它,這使得它有點棘手。如果我們仔細研究一下這些,突然的概念漂移就是數據漂移,抱歉,是由於一些不可預見的情況而突然發生的漂移。像去年新冠肺炎大流行這樣的黑天鵝事件就是最好的例子。逐漸或增量的概念漂移是指我們的數據隨著時間的推移逐漸演變。最後,周期性的概念漂移會周期性地發生,可能在一年中的某個時間發生,就像黑色星期五和零售是周期性概念漂移的典型例子。
現在我們已經掌握了漂移的各種形式,也許我們想要問自己的最重要的問題是,作為識別漂移的結果,我們想采取什麼行動?特征漂移,其中底層輸入數據已經改變,可能需要對實際的特征生成過程進行調查。我們可能想要重新訓練我們的模型來捕捉底層數據中的這種變化,自由漂移,在這裏我們看到標簽的真實性不斷增長的顯著變化,可能是一個調查標簽生成過程的標誌,然後再調查輸入特征中是否有潛在的變化。預測漂移,即我們的模型預測的分布隨著時間的推移發生了顯著的變化,然後對模型訓練和數據生成過程進行一些調查,然後評估如果預測的變化對業務本身會產生什麼影響。
最後,概念漂移,有一些外部因素影響了我們輸入特征之間的關係。我們可能想看看我們如何以新的形式加入一些額外的信息並通過一些額外的特征工程來做到這一點,或者我們可能不得不考慮一個完全替代的方法來解決極端情況下的問題,或者另外,我們可以做一些重新訓練或關閉她的模型。一旦我們知道了我們想要識別的不同類型的漂移以及我們想要采取的行動,如果我們發現了它們,Chengyin現在要做的是告訴我們,我們可以利用哪些統計測試來識別它們。

Eng Chengyin Eng:現在讓我們看看實際測試和我們應該采取的統計檢查。對於模型特征和目標,我們應該監控它們的基本摘要統計信息和分布。我們還應該監視業務度量,以防業務度量的更改會影響模型的相關性和影響。最後但並非最不重要的是,我們還應該監控模型的性能,隻在生產中替換現有的模型。如果新的候選模型至少表現得同樣好或更好。現在讓我們轉向數據上的特定監視測試。我們應該首先確定哪些特征是數值的或分類的。對於數字特征,我們可以計算中值或平均值,最小值,最大值,缺失值的百分比。我們可以用來檢驗均值的統計檢驗是兩個樣本Kolmogorov-Smirnov,也稱為帶Bonferroni校正的KS檢驗。曼-惠特尼檢驗。 And the test for variance here is Levene test. Before we cover any of those tests for the category of features, we’ll go through the basic concepts of this test that we’ll be incorporating in our demo.
首先,讓我們用Bonferroni校正檢查KS檢驗。當我們想要比較兩個連續分布時,KS檢驗是有用的。零假設是X和Y分布來自同一總體。如果X和Y分布在某一alpha顯著性水平的P值(通常為0.05)上有足夠的差異,則我們拒絕原假設,並得出X和Y分布不是來自同一總體的結論。有時我們可能會遇到第一類錯誤,即當零假設為真時我們會拒絕它。我們重複這個KS多次,進行N次特征比較。那麼假陽性的比率實際上增加了。這就是為什麼我們需要Bonferroni校正來通過特征比較的總數來調整alpha值,以降低家族錯誤率。請注意,您將看到這種假設檢驗框架也會重複用於其他統計檢驗。
Levene檢驗專門比較兩個連續分布之間的方差。它有一個零假設,即兩個分布都來自方差相等的總體。如果Levene統計量的P值低於預設的alpha水平(例如0.05),則我們拒絕原假設,並得出兩個總體或兩個分布都具有不同的方差的結論。現在讓我們轉向分類特征的測試。與數值特征類似,我們還可以計算缺失值的百分比和其他彙總統計信息,包括我們的模式,這是最常出現的值和唯一級別的數量。在統計檢驗方麵,我們可以利用單向卡方檢驗。
單向卡方檢驗比較類別變量的期望列分布和觀察列分布。零假設是觀察到的分布,也就是輸入數據等於預期分布,也就是生產數據。與前麵類似,如果卡方統計量的P值在α 0.05處降低,那麼我們可以拒絕原假設。到目前為止,我們已經討論了很多關於我們應該用來監控數據的測試。下一張幻燈片中,我們將討論對模型有用的監測測試。關於模型,人們可能會關心許多不同的方麵。首先是目標和特征之間的關係。我們可能想要調查輸入和目標之間的相關性變化。
對於一個數值目標,我們可以用皮爾遜係數來計算係數,來計算相關性。對於分類目標,我們可以使用頻率表,也稱為列聯表。第二部分是模型性能,這對你們很多人來說可能是最明顯的。對於回歸模型,我們可以檢查均方誤差,誤差分布圖,r平方等等。對於分類模型,我們可以查看ROC、混淆矩陣、F1-score等。如果我們想要更細粒度地評估一個模型,我們還可以在特定的數據片上調查模型的性能,可能是按月、按產品類型等等。最後,我們還應該認識到訓練一個模型所花費的時間。即使是新模特也要花三倍的時間來訓練,這可能是一個可疑的跡象。
讓我們來看看我們可以用來測量和想要生產的工具。測量和監控生產中的模型。目前還沒有一個單一的開源解決方案為我們提供了一個健壯的方法來做到這一點。我們決定從幾個開源庫中提取一些測試,並將這些測試合並到我們的演示工作流程中。特別地,我們使用MLflow進行模型跟蹤,使用Delta進行數據跟蹤。對於統計檢驗,我們分別使用SciPy和statmodel中的兩個樣本KS檢驗、Levene檢驗和卡方檢驗。對於可視化,我們使用海運庫。對於初次接觸MLflow的讀者,我們將簡要介紹MLflow是什麼。它是一個開源工具,可以幫助mlop。
它共有四個組件:跟蹤、項目、模型和現代注冊表。所有這些組件都可以幫助我們的ML項目的可重複性。在演示中,我們將使用跟蹤模型和模型注冊表組件。它們幫助我們跟蹤我們的模型參數、度量性能和工件。它們可以幫助我們保存模型以及依賴關係需求,並幫助我們管理模型生命周期。您將在我們的演示中看到所有這些功能,這些功能允許我們重現結果並檢索曆史彙率。

尼爾·特比特:太好了。謝謝Chengyin。我們這裏有一係列筆記本電腦,我們將在其中模擬一個場景,我們想在生產中部署和維護一個模型。這將被要求每月進行預測。因為我們被封鎖了一段時間,我們想看看我們下次可以去哪裏度假。我們選擇使用包含夏威夷Airbnb房源的數據集,我們的目標是預測新房源的價格,給定的屬性包括臥室數量和房產,以及房產所在的社區。這裏需要設置一些東西。我們已經包括了很多筆記本,包括我們將在下麵這個位鏈接下瀏覽的這本。因此,如果您確實想自己運行它,並進一步詳細地查看代碼,請訪問bit.ly/dais_2021_drifting_Hawaii。
你會發現這個筆記本和兩個相關的設置筆記本一起,它將包括進行監控的實用函數,然後是實際的訓練設置本身。訓練設置將涉及一些訓練函數,我們使用這些函數來實際訓練模型本身。除了實際創建不同的數據集,我們用來複製不同月份的數據。我們在這裏還概述了一些需求。特別是,我們正在Databricks上測試它,並將其運行到ML。你在這裏看到的所有東西,我們都將使用開源庫和包。我們使用MLflow來跟蹤各種參數,delta來實際版本我們的數據本身。然後我們要做的實際基礎統計測試,我們會特別使用SciPy。我們在這裏要做的是模擬一個批量推理場景,我們要訓練,我們要部署,然後在生產中維護一個實際的模型,以預測夏威夷每月最高的掛牌價格。
這些數據每月都會到達,一旦我們部署了初始模型,我們的工作流程將是加載新一個月的傳入數據,應用任何傳入數據檢查,這將是做那種測試,就像Chengyin提到的做誤差和漂移評估。然後,我們將識別並解決數據本身中的任何錯誤。然後,我們將訓練一個新模型,然後在將模型轉移到生產環境之前應用我們必須應用的任何模型驗證檢查。如果這些檢查通過了,那麼我們將把新的候選模型部署到生產環境中。如果這些檢查失敗,那麼我們就不會部署候選模型。正如我們所說的,除了SciPy之外,我們還將使用MLflow Delta來進行實際測試,並對數據和模型本身進行版本控製。雖然我們專門在有監督ML問題本身的批處理設置中這樣做,但就統計測試而言,我們使用的這些相同的測試也適用於流和實時設置。
其他幾本筆記本包含,我說過,調整設置和實際實例化各種方法,我們將一直使用。我也會在一個新標簽中打開這些,這樣我們就可以在使用過程中看到它們。我要創建一些小部件。這些是Databricks實用程序,我們可以使用它們對筆記本進行參數化。我們會進一步使用這些變量,我會更詳細地解釋。讓我們模擬第一個月的訓練。接下來要發生的是,我們有一個月的數據,我們想要訓練一個模型,然後將該模型部署到生產中。因為我們沒有曆史數據來與生產中的現有模型進行比較,也沒有曆史數據來與新的候選模型進行比較。在將該模型投入生產之前,我們不會通過您那種強大的檢查和平衡。但是在現實環境中,您顯然希望在將模型轉移到生產環境之前確保它經過了可靠的測試。
讓我們創建這個即將到來的月數據並開始模型訓練。特別是在整個過程中,我們要做的是向這個金表追加數據。這就是我們要用來訓練的Delta表,我們很高興它自己已經清理了處理過的數據。特別是我們有這個金色的路徑,我們在移動,而不僅僅是為了在那裏創建一個幹淨的新版本的表。然後我們將加載這個月的0路徑。在整個過程中,我們將使用這些變量中的一些,這些變量是在訓練設置中創建的。讓你們看看它是什麼樣的。您將看到不同數量的導入,一些筆記本衝突。這裏執行的所有東西,也就是通過前兩個命令完成的基本上都是在這個筆記本設置中實例化那些變量。
我們已經加載了那個月的數據,我們把它保存到這個黃金路徑。我們要做的實際上是觸發我們第一個月的數據我會詳細分析這裏到底發生了什麼。而我們模型本身的實際跟蹤通道流量和訓練的房間滿足,都來自於這種訓練sklearn RF模型的方法。特別地,這將需要一個運行名,它將是MLflow運行。它會選擇一條黃金路徑,也就是到這個表的路徑。它會取模型參數,這是一個參數字典我們想要把它放進我們將要使用的隨機森林sklearn回歸模型中。這個misc參數是我們最終想要追蹤的任意參數當我們使用這個訓練sklearn方法時,它會被用於預處理。
讓我們看看這個方法中包含了什麼來發現它,特別是,它會調用這個create sklearn RF pipeline,它會構建那個sklearn pipeline,它包含數值階段,分類階段,把它們組合在一起,加上一個隨機森林漸進階段加上我們的模型參數,我們要把它放進我們的函數中。特別地,這將在我們的sklearn RF模型中被調用。就像我說的,MLflow運行的runum,我們將使用的gold delta表的delta路徑,模型參數和任何我們最終想要用來跟蹤的任意參數,然後再輸入到我們的預處理階段。我不打算一行一行地講,但我應該大致了解一下我們在做什麼?
特別是在整個監控筆記本中,我要指導的不是一行一行的代碼在做什麼,而是從概念上講,在哪裏進行測試,在哪裏進行訓練,以及在每個階段要做什麼測試。特別地,我們將使用MLflow來跟蹤和監視。跟蹤並記錄我們的模型參數。在我們最初訓練模型本身之後,我們可能需要使用的任何工件。我們還將啟用MLflow自動日誌記錄,這基本上將去掉我們需要跟蹤MLflow的任何參數。此外,它將跟蹤出實際的模型工件本身,然後我們將基本上跟蹤出一些我們想要使用的附加參數。
首先,我們要做的是載入實際的Delta表本身,重要的是這裏我們要記錄為路徑。我們用的那個金表的路徑是什麼?我們使用的表的版本是什麼?這在我們研究接下來幾個月的數據時很重要,因為最終我們想說的是給定這個版本的數據,數據是什麼樣子的?在接下來的幾個月裏,我們在這裏看到的分布是什麼,我們可以比較一下這兩個東西嗎?此外,這是什麼,然後做的是注銷各種參數,我們可能需要在網上看到,並有一個記錄。實例數,月份是多少?使用的訓練實例的數量是多少?使用的測試實例的數量是多少?
但重要的是,我們要追蹤所有額外的信息。我們正在創建隨機森林管道。我們正在將模型本身與我們的訓練數據相匹配。這裏我們也做了一個記錄用來符合這個模型的實際模式是什麼?該模型在預測時期望什麼?另外,評估模型本身。我們可以記錄指標嗎,這也是很重要的,我們可以這樣說,好吧,這個模型在這個特定的月份是這樣表現的。當我們經曆了這幾個月,能夠看到,好吧,隨著時間的推移表現如何?
讓我們執行這個單元格,如果我首先設置這個訓練。讓我們觸發實際運行本身。就像我說的,我們將開始創建MLflow運行並觸發實際的模型訓練本身。一旦該模型被執行,我們要做的就是利用MLflow模型注冊表。特別地,這將使我們能夠跟蹤我們模型的譜係。您將看到,當這個模型在訓練時,它將以MLflow本身的運行形式出現。我們在這裏所做的一切都是使用開源工具。盡管MLflow被很好地縫合到Databricks工作空間,這樣每當我們執行MLflow運行時,我們都會在側欄中看到它顯示為run。如果我點擊這個,我可以進行實際的MLflow實驗。
特別地,我們看到我們現在運行了第一個MLflow。點擊進入這個運行,我們可以看到運行名稱是第0個月,我們可以看到我的各種參數都已經注銷了。當我們說mlflow。autolog時很多都被自動去掉了。特別地,我們注銷的一些自定義參數是路徑和版本。隨著時間的推移,這一點會變得很重要,這是在這個月的數據上創建的。在這個特定的月份,它使用的是什麼版本的數據?此外,我們還為我們的培訓測試提供了各種指標。重要的是,我們還有實際的模型工件本身。特別是,這將是我們用擬合的隨機森林模型創建的管道。
我們可以在後麵加載這個來看看,這些曆史預測和這個模型的未來版本會有什麼不同?我們還注銷的其他東西是這個CSV,它捕獲關於傳入數據的一些彙總統計信息。我們隻是創建了一個笨重的數據幀,把它設置成CSV格式,你可以看到,我們有平均值,標記,各種彙總統計數據,我們最終可能會用到這些數據。處理參數,Jason隻是我們創建的一個以Jason為日誌的字典,但隻包含一些我們可能希望在一行中使用的任意雜項參數,例如月份是多少、在那個時間點上使用的各種分類列的目標列和數值列。
回到我們實際的筆記本上,我們有一個經過訓練的模型,我們要使用的是這個模型注冊表。就像我說的,這追蹤了我們模型的譜係。我們可以說這個模型處於分期階段。這是在生產中。並且能夠看到,嗯,一個模型實際上在哪裏,並幫助管理模型的整個生命周期的工作流程。特別地,我們要做的是在模型注冊表中創建版本1。如果我實際導航到模型注冊表本身,我將看到的是我有一個最近剛剛創建的版本,我們可以做的是將其遷移到登台或生產,然後在模型處於這些不同的階段時開始使用我們的模型。特別是在第一個月,我們要做的隻是直接過渡到生產階段。
同樣,您想要做的是嚴格檢查這個模型是否按預期執行,對Chengyin提到的一些數據切片執行,但為了演示的目的,我們直接過渡到分期,以便在後麵的幾個月裏,我們將看到我們可以與我們的生產模型進行比較。讓我們複製到第一個月,當新數據到達時。特別是,我們在這裏試圖模擬的是一些真實世界的場景,你可能有上遊數據問題,或者你實際上也可能有特征漂移。實際上我們把兩件事結合起來了。值得注意的是,我們重新創建了一些上遊數據清理過程更改,其中鄰裏清理丟失了一些條目。特別是,一些應該出現的社區現在沒有出現。此外,我們正在做的是重新創建一些上遊數據生成過程,這引入了我們的一個功能的縮放問題。
特別是,我們有複習分數閱讀。對於一個給定的列表,評論的總體評分是多少,以前是在0到100之間。我們在筆記本設置中所做的實際上是將比例調整到0到5之間來重新創建一個新的星級評級係統我們的目標是通過一些檢查比如我們之前提到的分布檢查和錯誤檢查我們能否在開始模型訓練之前檢測到這個問題?我們在這裏要做的工作流程是,首先,攝取數據,對新進入的數據進行一些特征檢查。一旦我們解決了任何問題,我們就會把它附加到我們的金表中,然後我們就會進行模型訓練。一旦我們有了模型本身,我們就可以進行實際的模型檢查,看看新模型與舊的曆史模型相比如何?
然後,如果給定的模型通過了所有的檢查和平衡,那麼我們就將其移植到生產本身。在我們開始之前,我想回到我們的模型,我們有這個現有的模型。如果我刷新這個,你會看到我們有這個版本1,它不在生產中。我們在模擬什麼?在這第一個月模擬特征漂移。因為我們的特征曆史上是在0到100之間,現在漂移到0到5之間,然後是上遊數據錯誤。高級社區的一些清潔問題出現了問題。至於將來我們會用到的各種檢查,我們會把它分解成不同的子集,所以我們可以把檢查應用到所有的特征上,比如缺少這個檢查,我們會應用什麼是空檢查分類。對於空值,我們期望的是什麼,一些數字特征檢查,這將是一些簡單的總結統計。這些數據與我們之前看到的數據有什麼不同?
一些分布檢驗,回到那些Kolmogorov-Smirnov檢驗,即成音在街上走過的檢驗,還有Levene檢驗,我們也看到了連續變量在分類方麵的檢驗。我們要做卡方檢驗看看,曆史數據和新數據之間的每一層的期望是否有效?比較起來怎麼樣?然後還要檢查曆史模式是什麼?現在新的電流模式是什麼?我們要做的是載入本月的一個誤差路徑。我們實際上已經在設置中創建了這個delta表,它重新創建了一些錯誤。我們會把它加載進去,我們會創建一個彙總統計。這實際上很有趣,在訓練函數中使用的是相同的彙總統計函數,然後我們退出。我們要做的就是從現有的生產模式中吸取經驗。 What does that mean? Again, if I go back to my model registry where I see this first version, if I click into this first version, all that the MLflow registry is it’s really tracking the lineage of models.
其中,這是指向第0個月第一次記錄的原始運行的指針。再一次,我們看到了版本是什麼,路徑是什麼,第0個月。最終我們在這裏能做的是,從生產模型中獲得底層運行。然後我們可以說,我可以加載這個表,前提是我知道路徑和版本。然後我要計算一些關於曆史數據的彙總統計數據我們用這些數據來訓練之前的模型。我們在這裏比較的是,我有一個新的月的數據,但我想把它與我們之前訓練過的曆史數據進行比較。讓我們開始做一些檢查。這些都是非常基本的檢查。看到這裏,在這個新的數據中,空的比例是多少,我們已經設置了這個空的比例閾值。特別地,這種檢查空比例的方法是我們在訓練設置筆記本中定義的。 Again, I’m not going to go through, well, what is really going on in the underpinnings here, but we’re just going to loop through each of the different features and say, does the amount of nulls exceed a certain threshold?
這個閾值我們隻是隨意設置了2.5在現實環境中,你會想要做一些試驗和錯誤來確定在一個任意的閾值中有多少null值是可以標記的。我們看到的是小區平麵圖顯示的是空值,空值的比例超過了0.6。這就意味著我們要進一步研究什麼是鄰裏淨化?回想一下我們在這裏試圖複製的東西,一些上遊數據問題,我們看到這個鄰域被清理了,我們插入了缺失的值。我們真的能馬上發現這一點。其次,我們要做的是應用一些統計檢驗,這將會說,我的曆史數據是什麼?我的新傳入數據是什麼?我基本上會說,對於我的數字列,根據一些統計閾值限製,也就是說,對於這個列表中的所有不同的統計數據,我想檢查的是,這個新的傳入數據與我們之前看到的相比,是否顯著增加或減少了某個閾值限製?
為了詳細分析,我們得到了這個新月份的彙總統計數據。我們有我們當前的生產模型彙總統計數據,這個模型是在這個模型上訓練的。我們有一些數字列,我們必須要經曆。特別地,這個目標列是我們想要在分析中包含的。我們說的是,如果任何東西超過了之前看到的50%的界限,就標記給我們。特別地,這是一種很幼稚的方法。你可以更聰明地實現這個,但這隻是一個基本的檢查,看看之前的彙總統計是什麼?什麼是新的彙總統計數據?僅僅就一個非常隨意的閾值而言,是否有顯著的增長?這裏到底有什麼? I know a couple of things standing out just terms of the median max for bedrooms has increased, the bedrooms and maximum nights already the thing that would flag an error here, or really warrant further investigation would be for review score rating and price. And basically we’re saying the price, the median, these have all for review score rating. These have all decreased substantially, from 95 to 3.48.
在價格方麵也是如此。我們所看到的是一個顯著的變化,所以這是全麵的增長。我們想要看的是,這些特征的分布是什麼它們顯示了這些顯著的變化?我們將創建一些箱形圖,這將創建一種非常自動的視覺檢測方法。有顯著差異嗎?我們之前看到的是回顧評分,這是針對我們當前的生產數據,我們使用的是0到100之間的數據。現在對於這個新的輸入數據,這是在0到5之間。這是一種非常快速的測試,說明這裏有些地方不正確。我們可以通過在KS測試上運行Levene測試來進一步驗證這一點。這些是成蔭帶我們做的測試。 In particular Levene test to say, is there a significant difference in our variances and the KS test with the Bonferroni correction to say, does the Kolmogorov–Smirnov tests detect a significant change in those two distributions? Just to run through this, what we’re going to do is use the current production model, what is the data frame that it used versus the current incoming month of data? What are the numeric columns to basically look through and say, do you detect any difference?
P閾值設置在頂部。這句話的意思是我想把它設為什麼顯著性水平。類似於Kolmogorov-Smirnov檢驗,我們說的是將這些與曆史數據和新傳入的數據進行比較,我想經曆的數字列是什麼?我想檢查的閾值是多少?這裏出現的一件事是,對於KS測試,Bonferroni校正alpha水平,我們看到複習分數評級有一個重要的價值。這就是說,新的審查評分分布與以前有了很大的變化。這就很值得我們研究新的分布是什麼?這些數據是如何在上遊生成的?這一階段值得關注的是,上遊數據是什麼?上遊數據有問題嗎? On the categorical feature side of things, we’re also going to implement a Chi-square test to see, well, do the levels of our categorical columns statistically, are they statistically different? In terms of expected count, we see that host is super host is significant, but only just significance.
同樣,這也需要一些研究,但這並不是我們所做的任何事情或我們實際合成的結果。這裏的選擇是我們一開始就發現了這些問題。我們必須和我們的數據團隊一起工作,好吧,有任何上遊數據處理顯著變化嗎?在這種情況下,我們要重複的是,好吧,我們已經解決了這些問題,為複習評分評分在社區中清理幹淨。我們對所做的更改很滿意,這個月我們有一個固定的delta路徑,它將載入。然後我們要把它附加到我們的黃金路徑上。我們現在有了這個帶有新數據量的黃金delta表,現在我們可以進行第二個月的訓練。在第一個月,我們將再次使用完全相同的模型參數,相同的雜參數。
你會注意到我們的實驗中加入了第二次實驗。然而,我首先要做的是注冊這個模型,然後將其轉換為登台。然後我可以展示給你們看。如果我們再次進行實驗,這隻是將我帶到MLflow UI中的一個單獨選項卡。特別地,我們看到的是我們有第二個月,如果我導航到那裏,我們有路徑,版本,以前的0現在是1,因為我們在第一個月使用了一個新版本的表,所有的參數都是我們之前見過的。度量標準,我們將看到的是測試,測試r平方實際上略有不同,我們仍然有那些相同的工件,我們之前看到過。特別是,我們現在在實際的模型注冊表中看到的,如果我們導航到那裏,我們有這個的第二個版本,它是9階段。
這最終就是我們要比較的東西。我有一個上個月的模型製作。我有一個新模型目前在分期。在將新的候選模型遷移到生產環境之前,我可以比較這兩個模型嗎?我應該通過一係列的測試來驗證,預測結果是什麼?它在當前生產模型中表現如何?實際上有很多方法可以做到這一點。我們將在這裏應用一個非常簡單的測試,說我有當前的登台運行,我可以再次獲得它,因為我們可以直接跟蹤沿襲到底層MLflow運行。我可以得到底層的MLflow運行實體,然後說,取在登台的模型。運行是什麼,並將運行與我當前的產品進行比較。
這是兩次不同的MLflow運行。它將應用最小模型r平方閾值。也就是說,根據這個指標,在這兩個不同的模型之間進行比較,應用這個指標來檢查這個模型是否超過了一定的閾值我們要說的是,你可以進行從階段到生產的過渡。我們在這裏必須要捕捉的是模型性能是否有顯著的退化。如果有像預測漂移這樣的東西,我們想要抓住這些預測與我們之前看到的相比發生了重大變化的地方。最終,我們想要捕捉的是,在我們將模型投入生產之前,我們想說,好吧,我們的實際指標隨著時間的推移表現如何?你需要長期跟蹤這個過程。鑒於我們看到我們的分期運行,雖然它不是很好,我們的散布分數,我們真的隻是試圖展示你如何編排模型本身的方法。
我們看到,根據我們的閾值,它稍微好一些,這個閾值是我們最初根據小部件設置的,我們要做的是將我們的模型轉換到生產環境,因為它現在的性能更好。如果我回到注冊表中的模型,我們現在將看到版本2現在將被遷移到生產環境中。以前的生產模型將被存檔。如果我導航到那個,我可以回到我的版本2。再一次,令人震驚的是回到我的第一個月,最終反饋到,這個我可以加載回去的底層模型本身。讓我們轉到最後一個場景,在第二個月,一些新數據到達。在這種情況下,我們複製的是我們的價格發生了顯著變化,但我們的特征沒有變化。
我們試圖在這裏綜合的是某種季節性。我們說的是一些新的月份數據包含了在度假旺季記錄的列表條目。結果,每一個上市的價格都被任意地提高了一些。我們在這裏模擬什麼?我們試圖模擬一些標簽漂移,因為之前我們的標簽有一定的分布,但現在它發生了一點變化,還有概念漂移,因為功能和標簽之間的潛在關係已經改變了,由於我們試圖引入的季節性。回到我們剛才討論的不同類型的概念漂移反複出現的概念漂移可以以某種節奏發生。
我們將使用和以前一樣的特性檢查。這些傳入的數據,在我們開始模型訓練之前,我們想要在開始訓練之前通過一係列的檢查來嚐試和捕捉。和傳入的新數據有什麼不同嗎?我們要做的是加載第二個月的數據,我們要創建一些關於它的彙總統計。我們將從當前生產模型中運行底層MLflow。我們將載入用於訓練上個月數據的delta表。從第一個月開始,然後我們將載入從前四個月開始的彙總統計數據。
特別地,我們會從缺失開始再次檢查,空的比例是多少?我們看到沒有什麼是好的,沒有什麼超過零比例閾值。同樣,這是你可以任意選擇的數字方麵的東西。我們要檢查的是所有數字特征,均值,中位數和標準差,最小值和最大值是否有明顯變化值得注意的是,均值和中位數價格在擬合方麵都發生了顯著變化。比前一個月高出50%以上。總的來說,這會給我敲響警鍾,好吧,我應該研究一下這個價格因為這個分布與我之前訓練的上個月模型相比確實發生了變化。
看看這個方框,很快就會發現,對於所有超過這個閾值的功能,我們看到的是,以前的價格在0到25000之間,現在從0到75之間大幅上漲。目測的分布已經發生了變化。我們可以通過方差檢驗來對其進行嚴格的統計。最終,你希望KS檢驗能檢測到分布的變化。k檢驗基本上是說這兩個分布,兩者之間有顯著的變化嗎?我們說的是價格,這兩種分布在統計上確實有顯著差異。在這個階段,這可能會引起人們的關注,好吧,這些數據有一些差異。最終,你可以選擇做的是繼續前進,說,好吧,如果我重新訓練這個模型,我能把這些新的變化融入到數據中並從中學到一些東西嗎?
此外,你還可以嚐試著手進行一些新的特征工程,其中包括一些季節性特征,比如,這個數據是在這個月記錄的,等等,以整合一些季節性信息,使其適合你的模型本身。在分類方麵,我們看到有一些分類上的差異分類變量在統計上是不同的預期種類。然而,看看這個,這沒什麼好擔心的,但它再次向你展示,有時你提出這些錯誤,它可能不一定是重大的改變,但再次,你應該解決這些問題,並相應地對待它們。這裏要做的是我們已經觀察到了標簽的轉移我們要做的實際上是重新訓練模型看看我們的表現如何?
我們會繼續說,把這個月的新數據添加到我們的金表中,然後我們會訓練一個新模型,盡管是在一個月的數據上。我們有第0個月,第1個月,第2個月,現在進來了,現在我們看到我們在實驗中有了一個新模型。同樣,我們要做的是,首先,注冊那個模型然後我們要把那個模型轉換到登台再次說明,我將回到實際注冊的模型本身很好,我們有一個版本的登台和應用那些我們之前看到的相同的模型檢查。我們將從當前登台模型獲得底層MLflow的運行。我們將再次應用相同的統計檢驗,好吧,新候選模型的性能如何?
這個r平方測試r平方和之前的r平方值比較如何?我們看到這裏有一個顯著的性能不佳,盡管我們將它們與不同的進行比較。它們被應用於不同的測試集。我們看到當時的測試在減少百分比方麵有很大的不同。再一次,這將是一個很好的理由去調查,為什麼一個新模型表現不佳?另外,我可以解決這個問題嗎?我能否用不同的超參數重新訓練模型並進行混合初級訓練?或者我是否會加入一些額外的新功能來捕捉季節性?在這種情況下,我們說當前的分期模型表現不佳,因此需要進一步研究。這確實向你們展示了端到端的過程如何使用開源工具,比如MLflow和delta這是關於可重複性的,真正捕獲了三次時間,能夠回到過去,說,好吧,這是我的模型。
在這個時間點上,這是我使用的數據版本,但是在測試和監控方麵,你如何使用SciPy這樣的包,好吧,把這些測試應用到這些數據集上,並且能夠說,好吧,這裏有一些變化,我的數據有一些明顯的錯誤。希望這能讓你們簡單地了解如何把這些東西結合起來我把它傳給Chengyin,讓他給我們一個結論。謝謝。

Eng Chengyin:感謝Niall的演示。希望通過演示,我們在這張幻燈片中涵蓋的概念變得更加清晰。回顧一下,隻需記住模型部署並不是結束。在生產中持續監視和測量您的模型是確保您的機器學習模型與業務相關且有價值的關鍵。其次,沒有一個適用於所有監控和測試的解決方案。希望您能夠將我們的示例框架應用到您自己的領域和用例中。您還應該添加其他相關的測試,以捕獲您感興趣的指標。
最後,不管您正在構建的用例是什麼,始終要確保您能夠跟蹤並重現您的模型結果。保持曆史性能記錄作為基線是至關重要的,並且在出現新的部署失敗時,您的係統應該足夠健壯以支持回滾。如果您有興趣了解更多關於這個主題的知識,我們提供了一些文獻和軟件包供您在演講後參考。希望你從今天的講座中學到了一些有用的東西。別忘了給我們反饋,告訴我們你從我們今天的演講中最大的收獲。希望能再見到你。

Chengyin英格

Eng Chengyin Eng是Databricks的數據科學顧問,在那裏她實施數據科學解決方案,並為跨職能客戶提供機器學習培訓。她在計算機專業獲得了碩士學位。
閱讀更多

尼爾Turbitt

Niall Turbitt是Databricks機器學習實踐團隊的高級數據科學家。與Databricks客戶合作,他構建和部署機器beplay体育app下载地址學習解決方案,以及交付…
閱讀更多

Baidu
map