天天看點

分享 | 關于人工智能算法模組化穩定性那些事兒

背景

“模組化”是算法、資料挖掘崗同學日常工作的一個重要部分。而模組化流程中,非常重要同時又容易被大家忽視的一個環節就是穩定性問題。

市面上關于模組化穩定性的文章不多,筆者決定與大家分享一下自己的經驗。

分享 | 關于人工智能算法模組化穩定性那些事兒

本文是自己的一些實踐經驗分享,盡量做到讓讀者看過之後就可以動手實踐。如果你之前從未進行過模組化穩定性方面的關注,那麼看過本篇分享後,取其中一二進行關注,相信能夠達到事先規避一些潛在的問題的效果。關于模組化穩定性方面本文未能涉及的地方,也歡迎大家踴躍在評論區補充和交流!

模組化過程中的穩定性,一般包括特征穩定性和模型穩定性,下面依次介紹給大家介紹。

特征穩定性

所謂特征穩定性,就是關注該特征的取值随着時間的推移會不會發生大的波動。

對特征穩定性的關注,一定一定要在模組化之前完成,從一開始就避免将那些本身不太穩定的特征選入模型。遺憾的是,很多做模型的同學并沒有留意這一點,而是喜歡在特征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語句來實施監控分析,并将執行結果做成報表以友善檢視,等等。

以上内容任何疏漏之處,懇請不吝指正。歡迎大家補充自己對模組化穩定性的實踐之道!

繼續閱讀