摘要: 背景 「建模」是演算法、資料探勘崗同學日常工作的乙個重要部分。而建模流程中,非常重要同時又容易被大家忽視的乙個環節就是穩定性問題。 市面上關於建模穩定性的文章不多,筆者決定與大家分享一下自己的經驗。 本文是自己的一些實踐經驗分享,盡量做到讓讀者看過之後就可以動手實踐。
「建模」是演算法、資料探勘崗同學日常工作的乙個重要部分。而建模流程中,非常重要同時又容易被大家忽視的乙個環節就是穩定性問題。
建模過程中的穩定性,一般包括特徵穩定性和模型穩定性,下面依次介紹給大家介紹。
特徵穩定性
所謂特徵穩定性,就是關注該特徵的取值隨著時間的推移會不會發生大的波動。
對特徵穩定性的關注,一定一定要在建模之前完成,從一開始就避免將那些本身不太穩定的特徵選入模型。遺憾的是,很多做模型的同學並沒有留意這一點,而是喜歡在特徵ready後立刻開始建模,直到模型臨近上線,才意識到應該去看看有沒有不太穩定的特徵,一旦發現有特徵穩定性不滿足要求,則需要對其進行剔除後重新建模,導致了不必要的重複性勞動。
通常採用psi(populationstability index,群體穩定性指數)指標評估特徵穩定性。計算公式如下:
psi是對兩個日期的特徵資料進行計算,可以任選其一作為base集,另一則是test集(也有其他叫法為expected集和actual集)。
下面介紹特徵的psi是如何計算出來的,有了這個,就可以讀懂上面的公式了:
• 特徵取值等頻分段:對這個特徵在base集的取值進行等頻劃分(通常等頻分10份即可),用字母i表示第i個分段區間。
• 計算:
統計落在每個分段區間內的目標數量(如果是使用者特徵就是使用者數,如果是門店特徵就是門店數,etc),進一步得到數量佔比,
表示該特徵在base集中第i個取值分段中的數量佔比。
• 計算:
繼續按照第2步計算得到
,注意,分段還是採用第1步中產出的分段(依據base集產出的分段)。
• 根據前文的公式即可計算得到該特徵基於這兩個日期的psi。
當沒有其他工具可以借力的時候,根據上述流程便可輕鬆計算得到特徵psi。但是在螞蟻金服,因為演算法建模pai平台的存在,直接借助所提供的psi計算元件即可方便、批量地計算出特徵psi。
通常我會按照下圖所示的方式來做:
在上面這個例子中,我對上百個特徵計算psi,流程如下:
• 取20171130分割槽的資料作為base集,對所有特徵通過分箱元件進行特徵值等頻分段(上述步驟1),分箱之前進行隨機取樣的目的是減少資料量以加快分箱程序。
• 計算20171130分割槽與過往六個月分割槽的特徵psi,這就是psi元件做的事情,也就是前文所述步驟2~4。
通過這個流程,輕鬆計算得到了上百個特徵跨度1個月~跨度6個月的psi。通常,如果乙個特徵跨度6個月的psi取值小於0.1,那麼這個特徵被認為是穩定的(當然,也可以根據具體情況適當放寬0.1的標準)。
注意:並非所有psi值很高的特徵都不能用於建模,如果乙個特徵區分度很好但psi值不滿足預期(比如跨度6個月的psi大於0.1),但同時,該特徵的取值波動性從業務的角度可以解釋得通,那麼這樣的特徵用於建模也是可以的。
模型穩定性
相比特徵穩定性,模型穩定性涉及的東西比較多,需要根據模型的具體應用方式選擇性進行關注。通常,模型psi是必須關注的乙個指標。
模型psi
有了前文對特徵psi的介紹,理解模型psi就非常簡單了。
二分類模型的輸出一般都會有乙個取值為0~1之間的概率值(記作:prediction_prob),模型psi監控的就是這個值的穩定性。
將模型產出的prediction_prob理解為乙個特徵,就可以像計算特徵psi一樣計算得到模型psi了,不同的地方在於,特徵psi一般是對很多特徵一起做計算(假如準備了200個特徵進行建模,那就是對200個特徵計算psi),而模型psi通常只是對prediction_prob這乙個欄位做計算。計算方式同前文所述完全一樣,pai元件的使用也沒有任何不同,不再贅述。
模型穩定性的其他實踐
2.1 消除波動性
對於二分類模型,在實際業務中通常會直接拿著prediction_prob去用。例如,對於某個風險識別場景,根據prediction_prob對使用者進行准入或攔截(假如設定閾值為0.6,則prediction_prob小於0.6的使用者被攔截,不小於0.6的使用者被准入)。
但是會存在一些應用場景對穩定性要求更高。為了消除double型可能帶來的波動性,可以將小數對映為整數再使用,我們將這個過程稱為rank。
具體要將0~1的小數值對映到1~10還是1~100亦或是1~1000的整數區間,完全取決於應用場景對這個數值的精細化程度。這樣做對映以消除波動性是有道理的,它相當於把一定範圍內的波動遮蔽了。例如,某信用風險模型在10月份對使用者小c的打分為0.61,在11月份的打分為0.69(假如打分的差異僅僅因為該使用者在雙11期間瘋狂買買買所致,而事實上短暫性的買買買並不應該對使用者的信用風險評估造成影響),如果對映為1~10的整數區間後,連續兩個月份的打分都是7([0.6, 0.69]整個區間均被對映為7),從而達到遮蔽波動性的目的。
將0~1小數對映到整數區間的做法非常簡單:首先對原始小數列求分位數(如果要對映為1~10的得分區間就求十個分位點,如果要對映為1~100的得分區間就求一百個分位點),然後根據各分位點處的取值將原始值分為確定數量的區間(如果要對映為1~10的得分區間就是10個區間,如果要對映為1~100的得分區間就是100個區間),每個區間對映為乙個整數值,對映完畢。
2.2 rank遷移
當把prediction_prob rank到整數區間後,就有必要對rank後的結果實施必要的監控了。有兩個事情值得去做,其一是對分位點進行按月遷移監控(看分位點有沒有隨著時間的推移產生波動),其二是對rank後的整數進行月份間波動監控(看看每連續兩個月之間,全量使用者得分的波動性)。
計算上文所述指標的目的是為了實施每日監控,一旦出現不符合預期的情況就立刻通知到人。在螞蟻金服內部,可以借助相關平台實施所需的監控。當然,如果沒有這樣的平台,也可以通過其他的方式來做,比如:每日定時執行sql語句來實施監控分析,並將執行結果做成報表以方便檢視,等等。
人工智慧演算法分類
人工智慧演算法大體上來說可以分類兩類 基於統計的機器學習演算法 machine learning 和深度學習演算法 deep learning 總的來說,在sklearn中機器學習演算法大概的分類如下 1 回歸演算法 2 分類演算法 3 聚類演算法 4 降維演算法 5 概率圖模型演算法 6 文字挖掘...
人工智慧演算法 猴子摘香蕉
只有簡單的狀態顯示 include iostream using namespace std void at char monkeyplace,char boxplace void state int on,int hb char goto char st,char lt void act char...
人工智慧演算法綜述(二) RNN and LSTM
rnn 迴圈神經網路 and lstm 長短期記憶網路 lstm就是乙個rnn網路,外部的結構是一樣的,主要是單元的內在結構不同。或者說lstm是為了讓rnn能夠更好的處理nlp 自然語言問題 做的一些內部改造。我推薦這篇文章理解lstm 可能會比我自己說的更好,我這裡就簡單說一下,不涉及太多技術細...