1. 預備知識
1.1 KS-檢驗
KS-檢驗與t-檢驗等方法不同的是KS檢驗不需要知道數據的分布情況,可以算是一種非參數檢驗方法。當然這樣方便的代價就是當檢驗的數據分布符合特定的分布時,KS-檢驗的靈敏度沒有相應的檢驗來的高。在樣本量比較小的時候,KS-檢驗作為非參數檢驗,在分析兩組數據之間是否存在異常時相當常用。
PS:t-檢驗的假設是檢驗的數據滿足正態分布,否則對於小樣本不滿足正態分布的數據用t-檢驗就會造成較大的偏差,雖然對於大樣本不滿足正態分布的數據而言t-檢驗還是相當精確有效的手段。
KS檢驗使用的是兩條累積分布曲線之間的最大垂直差作為D值(statistic D)作為描述兩組數據之間的差異。在此圖中這個D值出現在x=1附近,而D值為0.45(0.65-0.25)。
1.2 CDF 累積分布函數
累積分布函數(Cumulative Distribution Function),又叫分布函數,是概率密度函數的積分,能完整描述一個實隨機變量X的概率分布。一般以大寫CDF標記,,與概率密度函數probability density function(小寫pdf)相對。
1.3 KS-檢驗D值計算
對以下兩組數據做KS-檢驗:
a = [1.26, 0.34, 0.70, 1.75, 50.57, 1.55, 0.08, 0.42, 0.50, 3.20, 0.15, 0.49, 0.95, 0.24, 1.37, 0.17, 6.98, 0.10, 0.94, 0.38]
b = [2.37, 2.16, 14.82, 1.73, 41.04, 0.23, 1.32, 2.91, 39.41, 0.11, 27.44, 4.51, 0.51, 4.50, 0.18, 14.68, 4.66, 1.30, 2.06, 1.19]
1.3.1 對a組數據做統計描述
Mean = 3.61
Median = 0.60
High = 50.6 Low = 0.08
Standard Deviation = 11.2
可以發現這組數據並不符合正態分布, 否則會有大約有15%的數據值小於-7.59(均值-標准差(3.61-11.2))。而數據中顯然沒有小於0的數值,所以該組數據不符合正態分布。
1.3.2 觀察數據的累積分段函數(Cumulative Fraction Function)
注:google為Cumulative Distribution Function
對a組數據從小到大進行排序:
sorted a=[0.08, 0.10, 0.15, 0.17, 0.24, 0.34, 0.38, 0.42, 0.49, 0.50, 0.70, 0.94, 0.95, 1.26, 1.37, 1.55, 1.75, 3.20, 6.98, 50.57]。
觀察發現前10%的數據(2/20)小於0.15,前85%(17/20)的數據小於3。所以,對任何數x來說,其累積分段就是所有比x小的數在數據集中所占的比例。
對於數0.15,其累積分段為10%,對於數3,其累積分段為85%......求出a組數據中所有數的累積分段值后繪制累積分段圖如下所示:

可以看到大多數數據都分布在左側(數據值比較小),這就是非正態分布的標志(注:正態分布兩邊小中間大)。為了更好的觀測數據在x軸上的分布,可以對x軸的坐標進行非等分的划分。在數據都為正的時候有一個很好的方法就是對x軸進行log轉換。
下圖就是對x軸的坐標做log轉換以后的圖:

把b組數據按上述方法做同樣處理,結果如下,其中實線表示a組數據的累積分段,虛線表示b組數據的累積分段:

可以發現a和b的數據分布范圍大致相同(0.1 - 50)。但是對於大部分x值,在a組數據集中比x小的數據所占的比例比b組中的要高,也就是說達到相同累積比例的值在b組中比a組中要高。
1.3.3 計算D值
KS-檢驗使用的是兩條累積分布曲線之間的最大垂直差作為D值(statistic D)來描述兩組數據之間的差異。在此圖中,D值出現在x=1附近,且D值為0.45(0.65-0.25)。
2. 為什么要做特征監控
舉一個例子:
眼看着雙十一快要到了,公司要做大促,實現留存拉新的目標,但面臨一個棘手的問題:總是有專業羊毛黨來薅羊毛。BOSS想到了公司新招了個算法調包俠小王,於是找到了他,讓他做一個識別羊毛黨的模型。
小王開始了工作,構造訓練集、選模型、調參、測試...
訓練集的數據如下所示:

可以觀察到,Time-to-order [s] 字段的分布是這個樣子的:

模型訓練完成后,BOSS在測試集上一看:”效果挺不錯的嘛,趕緊上線!對了小王,你呀還得再加一個新功能,監控一下CPU、內存、延遲的情況。“.......”好的!“
過了兩周....
BOSS找到了小王:”你這咋回事,我們這么多客戶,怎么一個羊毛黨都發現不了???“



小王也納悶:線下效果很好啊,這是為什么?



趕緊去查看歷史日志信息,迅速發現了問題:

原來這個Time-to-order [s] 特征是以毫秒為單位feed進模型的(不是以秒為單位)!所以導致所有的預測都是錯誤的!
雖然很快找到了原因,但兩周的時間仍然產生了諸多問題:
- 公司損失了很多錢。
- 開發人員沒有及時發現此問題。
- 開發人員本可以及時發現它並提供一個修復。
由於我們不能忽視預測質量的下降,所以我們需要持續監控已經部署的機器學習模型。當我們在某些領域開展業務時,往往面臨的一個挑戰是,我們模型的預測結果具有遲滯性。也就是說當我們注意到這個問題時,問題已經發生了。因此,需要監控實時流量中特征分布與模型評估測試集中特征分布之間的相似性,從而能夠立即發現並評估模型的輸入特征是否發生了重大變化。
3. 監控方案的設計
3.1 確保輸入特征的分布(總是)與訓練時特征的分布相同
這里是通過KS-檢驗實現。
3.2 數據聚合的窗口大小的設計

數據聚合的窗口設置較小,優點是可以快速檢測出是否有異常數據(特征),缺點是受短期季節性或短期活動等波動因素的影響較大。
數據聚合的窗口設置較大,優點是受短期的季節性等波動因素的影響較小,缺點是對異常數據的檢測緩慢。
3.3 已監控特征的分析頻次設計


高頻次分析的優點是可以更快地發現異常,缺點是計算復雜性高,成本高
低頻次分析的優點是不復雜,成本低,缺點是異常檢測緩慢。
3.4 監控界面設計
實際上,監控界面的設計和普通BI系統的區別不大。
在展示內容上,除了常見的模型CPU/GPU使用率、內存占用率、模型響應時長等,往往還會按模型分組、創建特征KS-檢驗直方圖、時間段選擇、異常特征展示、不同模型實時效果對比等信息。

4. 參考資料
[3] What’s your ML Test Score? A rubric for ML production systems
[4] Continuous Live Monitoring of Machine Learning Models with Delayed Label Feedback
