您當前的位置:首頁 > 歷史

拋開貪心演算法,來談談變數分箱這件"小事"

作者:由 1二叄 發表于 歷史時間:2018-06-02

在評分卡建模中,變數分箱是對連續變數離散化的一種稱呼。要將logistic模型轉換為標準評分卡的形式,這一環節是必須完成的。信用評分卡開發中一般有常用的等距分段、等深分段、最優分段。關於評分卡和分箱的步驟這裡不再贅述,有興趣可以參見下面的部落格,這位大兄弟講的很詳細了。

一般我們所採用的分箱都是有監督分箱,即需要標籤的參與,即透過對變數資料和標籤資料運用一定的演算法,使得分出來的箱iv最大或者別的什麼最大或最小(目標函式)。目前在行業裡,大家用貪心演算法進行分箱的較多,如best_ks,卡方分箱等。在這裡我把best_ks(也可以是best_gini,bestig等等)稱為自頂向下的切分方法(top_down),把卡方這一類稱為自底向上的聚合方法(down_top)。

那麼無論是top_down還是down_top,都只是求得了區域性最優,如果想解全域性最優呢?實際上分箱這個問題,可以當做規劃問題來解。下面我就用動規來解,我會給出一些公式和計算步驟。

例子:資料集[1,2,3,4,5],分3箱

首先先讓我們把分箱問題拆解:

1。先考慮把某個數字前面的數字分為2個箱,這個數字及後面的數字分為1個箱

2。在考慮把某個數字前面的數字分為1個箱,這個數字及後面的數字分為2個箱

3。最後,將這個數字及後面的數字分為3個箱

唉,等等。是不是發現了什麼?

是的,對於計算iv來說,問題3可以查閱問題2的答案,問題2可以查閱問題1的答案,這不就是動規的狀態轉移方程???

我們都知道在這個問題下

IV=\Sigma(iv_{i})

,也就是整體IV等於每個bin的iv之和,那麼在如上幾個子問題下我每次只需要求解這個數字及後面的數字分出的箱的iv之和即可(因為前面的我不需要考慮,在最後一個問題總會算到的)。

先來看第一個問題,不滿足分箱的用-1表示,滿足的則計算IV,計算步驟如下:

[ ] [ ] [1, 2, 3, 4, 5] -1

[ ] [ ] [2, 3, 4, 5] -1

[ ] [ ] [3, 4, 5] 0。01

[ ] [ ] [4, 5] 0。02

[ ] [ ] [5] 0。03

再來看第二個問題,同樣表示,在這裡我假設iv_func是計算iv的函式:

[ ] [1, 2, 3, 4, 5] -1

[ ] [2, 3, 4, 5] max(iv_func(2)+0。01,iv_func(2,3)+0。02,iv_func(2,3,4)+0。03 )

[ ] [3, 4, 5] max(iv_func(3)+0。02,iv_func(3,4)+0。03 )

[ ] [4, 5] iv_func(4)+0。03

[ ] [5] -1

寫到這一步,相信大家都能看出來了,透過計算右半部分的最大的IV值,再推一步就可以推到整個資料集在3箱下的最優的IV值(後面式子較長,我這邊就不推了,有興趣可以按照這個思路推一下)

先寫推導過程的原因是為了讓大家都能看得下去,看著這個推導過程,我們來寫下狀態轉移方程,在推導過程中我們可以看到,IV由兩部分組成,需要查閱之前步驟的iv我把它叫做iv_suf,需要準備計算的iv我把它叫做iv_cal:

IV=iv_{cal}+iv_{suf}=iv_{cal}+w[i-1][index]

(i>1)

式中,w指已經計算過的iv值,即iv_suf,i為第幾個問題,即這個數字及後面的數字分為幾個箱,index為分為i-1個箱時,需要查閱的列表在當時的索引。上式為i大於1的情況,i=1時,那就是問題1,這個方程就是

IV=iv_{cal}

(i=1)

理論部分告一段落,接下來是實戰驗證

本次使用的是一份真實信貸進件資料(抽過樣),先隨機抽一個連續變數來看分箱結果,第一張圖是ks,第二張是卡方,由於變數名涉密,我已隱去:

拋開貪心演算法,來談談變數分箱這件"小事"

拋開貪心演算法,來談談變數分箱這件"小事"

下圖是動規分箱得到的結果,可以看出在連續變數上動規分的iv更高

拋開貪心演算法,來談談變數分箱這件"小事"

再隨機抽一個離散變數來看分箱結果,第一張圖是ks,第二張是卡方,由於變數名和bin涉密,我已隱去:

拋開貪心演算法,來談談變數分箱這件"小事"

拋開貪心演算法,來談談變數分箱這件"小事"

下圖是動規分箱得到的結果,可以看出在離散變數上動規分的iv仍然更高

拋開貪心演算法,來談談變數分箱這件"小事"

下面來看執行時間,以下是執行環境:

CPU型號:Inter(R) Xeon(R) CPU E5-2650 v4 @2。20GHz

CPU(s):48

python版本:2。7。6

總樣本量16000+,變數數量6000+,單機環境執行,實際開啟的程序數為32,以下為三種方法分bin時間:

拋開貪心演算法,來談談變數分箱這件"小事"

可以看到的是動規使用的時間和貪心演算法不在一個數量級上,但是尚在可以容忍範圍之內。我對這種解全域性最優的方法理解為不批次使用的方法,即不要讓機器跑上幾個小時為了解所謂的全域性最優,因為這樣做顯而易見的會有以下缺點:

1。解出的最優解僅僅是當前資料最優解,我們所做的一切都是基於實際生產資料和本批資料保持同分布,然而實際上很難保證完全的同分布,因此訓練和實際是有所差異的,訓練擬合的越好也就意味著越不穩定。即犧牲一定的擬合能力對模型的穩定性是有好處的。

2。分出來的箱不一定有業務含義,如果要進行人工調整,就失去了求最優解的意義

以下是可以使用動規分箱的場景:

1。變數的業務含義極強,但是其他分箱法結果不理想,使用動規解最優解可以提高模型效果

2。模型效果不好的時候,可以嘗試使用,但是需要注意分箱的合理性。

最後總結一下:訓練模型,在變數上無小事,分箱這個事情,能人工參與進去還是儘量要參與進去,利用自己的業務經驗分箱,任何演算法都只能是一種輔助。如果單純依靠演算法分箱,也許測試的時候效果較好,但是上線用不了多久也許就會發生較大的偏移。

標簽: iv  分箱  數字  最優  func