模型上線後,如何做好模型監控

模型上線後,如何做好模型監控

模型訓練結束後纔是業務真正的開始
做好模型監控可以進一步幫助我們更好應用模型

簡述

每次模型訓練完成後,並不意味着項目的結束,在訓練模型後,我們還需要將其穩定上線,然後部署一套相應的監控體系,這時候模型纔開始穩定運行在業務場景中。在我們以往接觸的大多文章都只是告訴你如何構建模型,但是在模型上線後的監控同樣重要,我們需要通過對模型的監控來掌握模型運作情況,瞭解業務變化趨勢。

在我看來對模型的監控主要有兩方面:一方面是對模型本身的性能進行監控;另外一方面是監控業務信息,更瞭解業務發展情況。
對模型本身性能的監控主要涉及以下幾個關鍵指標:
0、Confusion Matrix
1、AUC(binary)
2、KS(binary)
3、PSI
4、Lift & Gain
5、MSE(Regression)

對業務信息的監控主要會設計以下指標:
1、評分監控(評分模型)
2、響應率監控
3、模型變量監控(缺失值,平均值,最大值,最小值等,變量分佈)
4、模型調用次數

對模型本身性能的監控

0、Confusion Matrix

混淆矩陣有幾個古老的概念:TP(實際爲正預測爲正),FP(實際爲負但預測爲正),TN(實際爲負預測爲負),FN(實際爲正但預測爲負)
在這裏插入圖片描述

通過混淆矩陣我們可以給出各指標的值:
查全率(召回率,recall):樣本中的正例有多少被預測準確了,衡量的是查全率,預測對的正例數佔真正的正例數的比率:
查全率=TP / (TP+FN)
Precision:針對預測結果而言,預測爲正的樣本有多少是真正的正樣本,衡量的是查準率,預測正確的正例數佔預測爲正例總量的比率:
Precision=TP / (TP+FP)
Accuracy:反應分類器統對整個樣本的判定能力,能將正的判定爲正,負的判定爲負的能力,計算公式:
Accuracy=(TP+TN) / (TP+FP+TN+FN)
但是往往準確率並不能直觀地反應模型的預測能力:
例如一個集合裏有100個樣本,99個正樣本和1個負樣本,全預測爲正樣本都有99%的準確度,但是沒有任何預測能力,後續的KS和AUC可以彌補這些不足。

F1度量
先看公式:
在這裏插入圖片描述

其中β表示查全率與查準率的權重

  1. β=1,查全率的權重=查準率的權重,就是F1
  2. β>1,查全率的權重>查準率的權重
  3. β<1,查全率的權重<查準率的權重

那麼問題又來了,如果說我們有多個二分類混淆矩陣,應該怎麼評價F1指標呢?
很簡單嘛,直接計算平均值就可以:可以計算出查全率和查準率的平均值,再計算F1;或者先計算TP,FP,FN,TN的平均值,再計算F1。
參考來源:https://www.zhihu.com/question/30643044/answer/48955833

1、KS&AUC

模型在上線應用後,也需要及時地進行驗證,在每一次樣本走完表現期後,需要及時地選取樣本進行驗證。關於這兩個指標應該不用做過多介紹,和我們在建模時使用的邏輯是一樣的。
計算公式:
在這裏插入圖片描述
關於KS&AUC推薦一個資料,裏面介紹相當詳細:http://rosen.xyz/2018/02/01/AUC%E5%92%8CKS%E6%8C%87%E6%A0%87/
KS&AUC 反映了模型開發期間與當前客戶的客羣變化,當KS和AUC相比建模時的數據沒有較大下降時都可以不重新訓練模型:
在這裏插入圖片描述在這裏插入圖片描述

#target rate & KS監控
logging.info('生成Targer rate & KS監控')	
monitor_fst.score_target_monitor(df_target_fst, lag_days=8, interval_days=7, date=run_date)	
monitor_fst.score_target_plot(show_days=10, lag_days=8, interval_days=7, keep_base=False, date=run_date)	
monitor_fst.ks_monitor_plot(show_days=10)	
logging.info('Targer rate & KS監控生成結束')

2、模型分數穩定性分析-PSI

目的在於分析衡量兩段時間(模型開發期間與目前)客戶的客層變化,作爲評分卡有效性的早期預警,並瞭解通過率的變動是否來自於客羣的變動。
PSI的計算公式:
PSI計算公式
PSI = sum((實際佔比-預期佔比) ln(實際佔比/預期佔比))*

舉例:
比如訓練一個logistic迴歸模型,預測時候會有個概率輸出p。
測試集上的輸出設定爲p1,將它從小到大排序後10等分,如0-0.1,0.1-0.2,…。
現在用這個模型去對新的樣本進行預測,預測結果叫p2,按p1的區間也劃分爲10等分。
實際佔比就是p2上在各區間的用戶佔比,預期佔比就是p1上各區間的用戶佔比。
如果p1和p2上各區間的用戶相近,佔比變化不會很大,預測的結果有額不會有較大差距,那麼模型相對比較穩定。
通過觀測這些PSI的大小和走勢,從而實現對評分卡穩定性的監測。通常PSI會以日、周和月爲維度進行計算,同時也會對評分卡模型中各個特徵變量分別做PSI監測。

判斷標準:
若PSI<0.1,表示客戶羣體從模型開發到實施的穩定性較高,模型不需要更新;
若0.1<= PSI <=0.25,表示客戶羣體發生了一定的變化,模型需要關注,隨時需要更新;
若PSI >0.25, 表示客戶羣體發生較大變化,模型需要更新。
在這裏插入圖片描述
模型分數的變化可能由特徵變化引起,也可能是模型本身不穩定引起,若是高分段總數量沒變,而PSI值變動較大,認爲需要重訓模型。若是PSI值沒變,高分段總數量變多,認爲整體用戶變好。

3、Lift 和Gain

Lift圖衡量的是,與不利用模型相比,模型的預測能力“變好”了多少,lift(提升指數)越大,模型的運行效果越好。
Gain圖是描述整體精準度的指標。
計算公式如下:
在這裏插入圖片描述
在這裏插入圖片描述

作圖步驟:

  1. 根據學習器的預測結果(注意,是正樣本的概率值,非0/1變量)對樣本進行排序(從大到小)-----這就是截斷點依次選取的順序
  2. 按順序選取截斷點,並計算Lift和Gain
    —也可以只選取n個截斷點,分別在1/n,2/n,3/n等位置
    例圖:
    在這裏插入圖片描述
    在這裏插入圖片描述
    詳細解釋:
    https://cosx.org/2009/02/measure-classification-model-performance-lift-gain/

4、MSE

MSE (Mean Squared Error)叫做均方誤差。看公式
在這裏插入圖片描述這裏的y是測試集上的。
用 真實值-預測值 然後平方之後求和平均。
猛着看一下這個公式是不是覺得眼熟,這不就是線性迴歸的損失函數嘛!!!對,在線性迴歸的時候我們的目的就是讓這個損失函數最小。那麼模型做出來了,我們把損失函數丟到測試集上去看看損失值不就好了嘛。簡單直觀暴力!
有時計算均方根誤差(RMSE)也可以。
不用解釋了吧
線性迴歸算法評價指標三連,可以靈活搭配:MSE、RMSE、R2_score
上面提到的這麼多指標不需要每一個都應用起來,可以根據需要選擇幾個核心指標應用就可以。

業務信息相關監控

0、評分分佈

通過對模型評分分佈的監控,我們可以知道每一個評分週期模型評分的變化情況,可以反映每一個評分週期裏不同分數段的佔比情況,對應的可能是業務的通過率或者拒絕率等;

#評分監控	
import logging	
monitor_fst = ModelMonitor(score_var='score', target='target', cut_points=fst_cut_points,	
output_path=os.path.join(output_path, 'monitor_file', 'fst'))	
logging.info('生成打分監控')	
monitor_fst.score_monitor(df_score_fst, valid=np.array([0.1] * 10), date=run_date)	
monitor_fst.score_monitor_plot(show_days=10, keep_base=False)	
logging.info('打分監控結果生成結束')

1、響應率變化情況

通過分析每一個表現期的響應率,可以清楚看到響應率的變化趨勢,同時可以看出真實響應率與預測的響應率之間的差距,
不過這個有一定的滯後性,通常需要等到樣本整個表現期走完,才能比較真實的target rate與預測值之間的差距。

2、變量監控

除了瞭解結果,我們也需要掌握每一個變量的變化情況,通過對變量分佈的監控,能很快的知道用戶羣體發生了哪些遷移,這些遷移對模型有哪些影響,這種變化是否是異常情況?還是有變化的趨勢?如果變量存在這種變化,我們是否需要refit模型?我們都可以從變量監控裏獲取這些信息。當然,對於模型refit的問題,不能僅僅依靠這一點來判斷,需要綜合其他指標來衡量,尤其是對模型本身性能的監控上。
例如下圖中對模型中一個變量分佈的監控:
在這裏插入圖片描述

#變量監控
logging.info('生成變量監控')
monitor_fst.var_monitor(df_orig_fst, file_name='var.csv',var_list=var_list_fst, cat_value_dict=cat_value_dict, date=run_date)
monitor_fst.var_monitor_plot('var.csv', show_days=10,var_list=var_list_fst,cat_value_dict=cat_value_dict, keep_base=False, num=6) 
#輸入你所需要的變量var_list_fstlogging.info('變量監控結果生成結束')

3、模型調用次數

對模型調用次數的監控在某種程度上不屬於模型監控的範圍,但是也有其存在的理由;尤其在特定的業務場景中,比如我們每天有固定數量的用戶經過模型評分來判斷是否被拒,如果某一天用戶數量激增或者驟減,也能從模型評分過程中及時發現問題。
在這裏插入圖片描述

有任何問題,歡迎私信。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章