我的旅程,以改進Lazy Lantern的自動時間序列異常檢測模型
作為Insight資料科學研究員,我有機會與Lazy Lantern合作,Lazy Lantern是一家計算機軟體公司,使用機器學習為企業提供自主分析,以透過更好地瞭解使用者行為來制定資料驅動型決策。作為一名顧問,我的任務是改進Lazy Lantern使用的時間序列異常檢測模型。在本文中,我將引導您完成從發現問題和挑戰到實現不尋常但可行的解決方案的過程。
背景假設您擁有一個網站並在線銷售產品。不幸的是,對於您最近釋出的產品,您犯了一個錯誤,併為您的產品設定了低得離譜的價格。當然,您是一個忙碌的人,您沒有意識到定價錯誤。但是,當人們發現此"瘋狂交易"時,您網站上的訪問量可能會大大增加。如果您不能快速糾正錯誤,那麼您可能會蒙受巨大損失,就像2019年Prime Day活動中亞馬遜的定價錯誤一樣。但是,如果您有工具來監視網站上結帳的點選次數或"新增到購物車"按鈕的次數,則可以及時發現對該產品的異常高的需求,以採取糾正措施並節省您的工作!
> Pricing errors can be incredibly costly (Source: The Washington Post).
Lazy Lantern提供自動資料分析服務,用於監視網站和移動應用程式。他們的客戶只需要輸入要監視異常以及將異常通知傳送到何處的度量標準(例如結帳)。完成此操作後,Lazy Lantern使用其時間序列異常檢測模型透過計算使用者對指標提出的請求數量(即每小時每小時點選結帳次數並通知已確認的異常)來監視所選指標。透過選擇的通訊方式與客戶聯絡。
到目前為止,這聽起來很簡單,但是讓我分解一下幕後實際發生的事情。時間序列模型用於根據活動的歷史模式來預測"正常"點選率的範圍。如果觀測值超出"預測的正常"範圍的時間足夠長(3小時),則將計算異常得分並將其與閾值進行比較。最後,如果異常分數高於閾值,則將其作為異常活動報告給客戶端。當前部署的模型是使用由Facebook建立的開源庫Prophet構建的,以生成"預測的正常"範圍。下面的圖1總結了異常檢測的過程。
> Figure 1. How the anomalies are detected and reported by the current model in Lazy Lantern.
當前具有異常分數計算的模型對於捕獲持續很長時間的異常非常有效(圖2)。但是,根據設計,持續不到三個小時的潛在異常事件不會傳達給客戶端。
> Figure 2. Example plot representing the reported anomalies by the current model (red shaded areas) and missing an anomaly which lasted less than 3 hours ( red circled one, FN = false negative)
在這種情況下,我將這些短期異常稱為誤報(不通知客戶的情況)。但是,這些短期異常仍可能給企業造成重大的財務損失,並且還可能影響使用者體驗和品牌信譽。因此,Lazy Lantern希望找到減少這些錯誤否定的方法,並尋求新的方法以獲取有關如何改進當前模型的見解。
挑戰性在我進一步進行建模的思想過程之前,讓我澄清一下與該專案相關的挑戰。這些挑戰被認為是異常檢測模型,該模型應該與客戶端選擇的指標生成的任意時間序列都可以很好地協同工作。
挑戰1:Lazy Lantern的資料產品應該適合所有客戶,並具有不同的資料來源和不同的監控指標。
一種型別的模型應適合具有不同特徵(例如趨勢和季節性)的各種型別的時間序列。一種模型是指具有一組固定引數的時間序列模型。儘管使用一個特定時間序列的過去活動從網站/移動應用程式的每個選定指標中訓練了一個單獨的模型,但是無法針對時間序列的趨勢或季節性調整模型引數。即使對於一個網站,也要監視多個度量標準,每個度量標準都具有獨特的特徵,因此,如果每次訓練時都必須自定義模型,則效率不高。
挑戰2:推斷每個時間序列的特徵是不可行的,因為它需要一定數量的歷史資料或/和領域知識。
從第一個挑戰開始,假設模型引數未針對每個時間序列進行調整。如果訓練週期足夠長,則可能會捕獲趨勢或季節性等特徵,並具有自動調整的引數。但是,並非保證每個時間序列都有足夠長的歷史資料,尤其是從新客戶端收集的資料。因此,僅假設每個度量標準的過去活動僅可用於訓練模型,而不足以推斷有關時間序列的更多資訊。
從這兩點出發,即使我從公司資料庫中選擇具有豐富歷史資料的時間序列,並建立針對該時間序列進行了最佳化的模型,該模型也無濟於事,因為它是針對特定情況而量身定製的。這使得該專案變得非常規,因為通常會構建時間序列模型來預測特定的關注指標,然後將其用於異常檢測。
瞭解當前模型並探索選項存在現有模型時,要做的第一件事就是理解模型的效能,並調整其引數以提高其效能。根據Facebook Research部落格上有關Prophet的文章,其建模方法描述為:
一個非常靈活的迴歸模型(有點像曲線擬合)代替了用於此任務的傳統時間序列模型,因為它為我們提供了更多的建模靈活性,使我們更容易擬合模型,並更優雅地處理丟失的資料或異常值。
此外,先知使用Stan進行模型擬合併生成不確定性區間(正常活動水平應屬於的範圍)。Stan是用於貝葉斯統計推斷的統計程式語言。要最佳化模型,需要更新季節性和趨勢引數,以便將它們用作先驗資訊。面對上述挑戰,無法為每個時間序列更新先驗資訊以最佳化模型。
另一方面,先知是構建具有一組引數的模型的最佳選擇之一,該模型僅使用歷史資料即可適應各種型別的時間序列。此外,它不需要對輸入資料進行預處理。例如,自動Arima自動生成引數的最佳組合,但是時間序列需要固定,這可能需要對某些資料集進行預處理。此外,與自動編碼器技術或聚類演算法不同,先知模型不需要多個時間序列特徵資料集即可進行預測以獲得良好的結果。
探索引數調整之後,我嘗試的第二件事是考慮更改圖1中描述的過程。但是我看不到批評或更改監視週期或閾值的直觀方法。例如,很難確定透過將監視時間從三個小時更改為兩個小時來計算異常分數來提高效能。即使標準的更改減少了所測試的特定時間序列的誤報,也可能會增加誤報,並且無法估算淨效果;所以我們不能說它有明顯的改善。實際上,它可能會在第一個挑戰點上產生一個新問題。在過程和測試中進行任意更改將是一種猜測和檢驗的方法,這是一個壞主意,尤其是因為我們甚至沒有標記的資料集來進行測試。
發揮創意:雙重檢查系統鑑於在使用Lazy Lantern當前使用的現有建模框架時遇到的困難,我又從頭開始(不要為我感到難過,我從以前的嘗試中獲得了很多見識)。當我與我的一位見解研究員討論我的掙扎時,她給了我一個雙重檢查系統的想法。因此,我開始尋找可以與當前模型作為附件配合使用的簡單直觀的異常檢測。最後,我最終使用移動平均值實現了低通濾波器(LPF)。移動平均值(滾動平均值)取整個資料集的子集的平均值,而低通濾波器是在訊號的頻率低於固定閾值時透過的濾波器,否則進行衰減。這裡的想法是,將新觀察到的點與固定時間視窗(μ)中過去的觀察值的平均值進行比較,如果新點與μ相距很遠,且其距離使用移動標準偏差(σ)進行了測量,則它將被視為異常值(異常)。
> Figure 3. How the low pass filter anomaly detection using a moving average works. The distance between the red point and the moving average (μ) of points inside the rectangle (window) is evaluated with the standard deviation(σ) of the points in the window as the unit. In this model, we consider the point as an anomaly if the distance is more than 3σ.
這種方法很容易實現。在熊貓中,用於DataFrame滾動(window = w)和rolling(window = w).std()的函式用於獲取視窗大小為w的μ和σ。
快要到了,但是不完全是。您可能想知道視窗大小w是否會改變結果,以及為什麼選擇3σ作為確定距離的標準距離。
如圖4所示,w更改異常檢測結果。但是,正如挑戰1所述,我們希望消除使用自定義模型引數的必要性,以使異常檢測方法在所有客戶用例中都具有魯棒性。
> Figure 4. Moving average and standard deviation changes depending on the window size thus the result of anomaly detection is affected.
為了使這種新方法在各種情況下都可靠,我利用了雙重檢查系統。具體來說,我在兩個模型之間構建了一個連線,以便當LPF檢測器將某個點視為潛在異常時,還可以使用Prophet模型生成的不確定性間隔來評估該點。這種方法防止了由LPF檢測器引起的其他誤報。這樣,我就專注於透過在LPF模型中使用多個視窗大小來檢測儘可能多的假陰性候選物件。從24小時到Prophet模型使用的總訓練資料長度(22天),以變化的視窗大小(以24小時為增量,w = 24、48,…,22×24小時)計算μ和σ。然後,如果對於任何對應的w,新的觀測點與μ之間的距離大於3σ,則LPF模型將其視為異常。根據經驗法則選擇3σ,並假設資料點來自高斯分佈。
LPF模型與Prophet模型可以很好地協同工作。儘管沒有標記的資料集可用於計算評估指標,但我還是手動標記了10個時間序列的假陰性,如圖2所示,使用LPF模型可以減少大約77%的假陰性。最終,Lazy Lantern將來將能夠從客戶那裡獲得反饋,以驗證組合建模方法,以在實施之後最佳化使用者體驗。
透過提出正確的問題並考慮資料產品的使用,我能夠提出一種創造性的分析方法,該方法利用了多種方法的優勢,同時最大限度地減少了孤立使用時這些模型的侷限性。此外,我很高興能與Lazy Lantern共享我在專案中學到的見識,並提供可行的解決方案來改進模型。最後,我要感謝Lazy Lantern的Bastien和Guillaume,讓我有這個令人難以置信的機會來研究模型,並在整個過程中給予瞭如此大力的支援。
您準備好改變並過渡到技術職業了嗎?註冊以瞭解有關Insight Fellows程式的更多資訊,並立即啟動您的應用程式。