1. 程式人生 > 實用技巧 >特徵錦囊:金融風控裡的WOE前的分箱一定要單調嗎?

特徵錦囊:金融風控裡的WOE前的分箱一定要單調嗎?

今日錦囊

特徵錦囊:金融風控裡的WOE前的分箱一定要單調嗎?


今天我們來講講一個金融風控裡的“常識點”,就是那種我們習以為常但若要講出個所以然來比較困難的點,正如標題所言:WOE前的分箱一定要單調嗎?????

✍️ 背景交代

相信每一個在金融風控領域做過模型的人,應該對分箱滿足badrate單調性有一定的認知,特別是在用邏輯迴歸做A卡的時候,老司機們會經常對我們說變數要滿足單調性,當變數單調了,再進行WOE轉換,然後作為LR的入參餵給模型,簡單訓練一下就收工。但作為一個合格的風控建模大師,僅僅知道這些套路還是不夠的,我們需要進一步去思考一下當中的原理,或者說是更進一步去追問一下自己:

LR模型的入參一定要WOE嗎?

WOE轉化前的變數分箱結果的badrate一定需要滿足單調性嗎?

連續變數難道就不可以直接進LR模型嗎?

希望大家在閱讀完本篇文章後,多多少少可以對上面的問題有一定的瞭解~

???? WOE回顧

在我們開始拆解問題前,有一個知識點需要回顧一下,那就是WOE。

WOE是weight of evidence的縮寫,是一種編碼形式,首先我們要知道WOE是針對類別變數而言的,所以連續性變數需要提前做好分組(這裡也是一個很好的考點,也有會說分箱、離散化的,變數優化也可以從這個角度出發)。

先給出數學計算公式,對於第i組的WOE可以這麼計算:

從公式上可以看出,第i組的WOE值等於這個組的響應客戶佔所有響應客戶的比例與未響應客戶佔所有未響應客戶的比例的比值取對數。對於上面的公式我們還可以 簡單做一下轉化:

所以,WOE主要就是體現組內的好壞佔比與整體的差異化程度大小,WOE越大,差異越大。

更多的內容可以瀏覽一下之前的文章《特徵錦囊:徹底瞭解一下WOE和IV》

???? LR模型的入參一定要WOE嗎?

The answer is no!並非所有LR的入參都需要WOE的,也可以是直接原始值入模型的。但存在即合理,為什麼大家都在說要對變數進行WOE編碼呢?我們可以引出下面兩個問題:

  • 什麼情況下用WOE比較合適?

  • 以及用WOE有什麼好處

我們知道,在風控領域的變數可以大致分為兩類,就是數值型變數以及類別型變數,前者就是類似於年齡、逾期天數等,後者就是職業類別、行業類別等。

針對類別型變數,我們很容易可以想到使用one-hot編碼來,但是這種編碼方式有一定的缺陷,那就是對於列舉值特別多的變數,獨熱編碼之後十分稀疏從而特徵空間很大,另外如果丟棄一部分維度則會造成資訊丟失,指不定這些是關鍵的資訊。以上的資訊說明了放入LR中很難有很好的效果。

而針對數值型變數,很多同學則會有更大的疑問,那就是為什麼要分箱然後又進行WOE轉換這麼麻煩,反正都可以直接入模型的,何必多此一舉?

當然了!這個想法也是沒錯的,在本小節開頭也已經說明了,並非要求所有的變數都要進行WOE編碼然後進入模型。而什麼情況下十分適合WOE轉換呢,那就是變數本身與y值並非存在直接線性關係的時候。

我們看上面的圖,“年齡”這個欄位經常性地會出現在我們的A卡模型裡,作為預測一個客戶信用水平的衡量指標。我們可以清楚知道,age這個變數的badrate分佈,經常性會呈現“U型”,業務解釋就是:年輕人和老年人的還款能力會比中年人的要低,風險也因此更高。從統計角度看,年齡與違約率,便不是一個線性關係!

我們回憶一下LR模型(Logistic Regression),從本質上講,LR就是經過對訓練集的學習,得到一組權值w,當有新的一組資料x輸入時,根據公式計算出結果,然後經過Sigmoid函式判斷這個資料所屬的類別。

假如我們的年齡就是上面的x1,並且模型只有一個變數,那麼隨著x1的變大, 的值也會不斷變大,而不是像上圖一樣呈現“U型”,說明了這是一個非線性的問題,但如果我們對年齡進行WOE轉換,就可以看到如右圖所示的那樣,隨著WOE的增大,goodrate也增大這種線性關係(badrate=1-goodrate,因此和badrate也是線形關係)。

以上也是使用WOE編碼的一個最大好處,也就是把badrate呈現非線性的變數轉換為線形,便於理解也便於後續模型求解。此外,WOE編碼還有一個好處,那就是具有“容錯性”,因為WOE編碼其實也可以理解為需要預先分箱,那麼對於異常值沒那麼敏感,對於單個變數的異常波動不會有太大反應。

???? WOE不單調可以進LR模型嗎?

那麼我們回到最初的問題,那就是如標題所說的:WOE前的分箱一定要單調嗎?結論是不一定需要單調。要深入瞭解這答案,我們可以看看下面兩個討論:

01 針對不同型別的變數

1)針對類別變數????

類別變數可以分有序和無序變數。

針對有序類別變數,比如像學歷,我們分箱的時候要保證原始順序的前提下,進行不同原始組別的合併,完成分箱,然後需要看分箱的badrate單調性,最後才來看WOE單調性情況。

針對無序類別變數,無序類別變數又可以根據列舉值的多少拆分為兩類:多列舉無序類別變數和少列舉無序類別變數。無論是哪一種,我們都可以根據對每個列舉值的badrate統計得到其量化指標,然後根據badrate進行適當的類別合併,完成分箱操作,這時候的分箱結果,天然單調!而針對少列舉無序類別變數,我們還可以根據業務認識,進行類別的合併,比如像中國大區欄位(華南、華北等),WOE編碼後,也不做嚴格的單調性要求。

2)針對數值變數????

進行合適的分箱演算法進行分箱後的bin,需要滿足badrate單調性,然後才進行WOE編碼。不過呢,這個也不是嚴格要求的。

02 為什麼需要WOE具備單調性

WOE不一定都需要是單調的,只要從業務角度可以解釋得通,那就沒有問題!就好像上面的那個栗子,年齡欄位,WOE就不是單調的,但從業務上可以解釋得通,那就沒有問題!

如果從業務上解釋是需要單調性,但分組後的WOE並沒有單調,那麼這時候有兩條路可以選擇,一是重新分組然後重新計算WOE,二是放棄這個變數。

最後提一下,如果不單調的變數不進行WOE編碼直接進入LR模型,一般都是很難求解的,因為很難找到一個線性公式來描述關係。

???? 結論覆盤

1)LR模型的入參不一定都要WOE轉換,直接進行模型也是可以的,只是遇上不單調的變數會比較難求解罷了,可選擇丟棄。

2)使用WOE編碼的一個最大好處是把badrate呈現非線性的變數轉換為線形,便於理解也便於後續模型求解,進行了WOE編碼的模型對於異常值沒那麼敏感,單個變數的異常波動不會對模型造成很大反應。

3)WOE並不一定都需要是單調的,只要從業務角度可以解釋得通即可

往 期 錦 囊

特徵錦囊:特徵無量綱化的常見操作方法

特徵錦囊:怎麼進行多項式or對數的資料變換?

特徵錦囊:常用的統計圖在Python裡怎麼畫?

特徵錦囊:怎麼去除DataFrame裡的缺失值?

特徵錦囊:怎麼把被錯誤填充的缺失值還原?

特徵錦囊:怎麼定義一個方法去填充分類變數的空值?

特徵錦囊:怎麼定義一個方法去填充數值變數的空值?

特徵錦囊:怎麼把幾個圖表一起在同一張圖上顯示?

特徵錦囊:怎麼把畫出堆積圖來看佔比關係?

特徵錦囊:怎麼對滿足某種條件的變數修改其變數值?

特徵錦囊:怎麼通過正則提取字串裡的指定內容?

特徵錦囊:如何利用字典批量修改變數值?

特徵錦囊:如何對類別變數進行獨熱編碼?

特徵錦囊:如何把“年齡”欄位按照我們的閾值分段?

特徵錦囊:如何使用sklearn的多項式來衍生更多的變數?

特徵錦囊:如何根據變數相關性畫出熱力圖?

特徵錦囊:如何把分佈修正為類正態分佈?

特徵錦囊:怎麼找出資料集中有資料傾斜的特徵?

特徵錦囊:怎麼儘可能地修正資料傾斜的特徵?

特徵錦囊:怎麼簡單使用PCA來劃分資料且視覺化呢?

特徵錦囊:怎麼簡單使用LDA來劃分資料且視覺化呢?

特徵錦囊:怎麼來管理我們的建模專案檔案?

特徵錦囊:怎麼批量把特徵中的離群點給“安排一下”?

特徵錦囊:徹底瞭解一下WOE和IV

特徵錦囊:一文介紹特徵工程裡的卡方分箱,附程式碼實現

特徵錦囊:今天一起搞懂機器學習裡的L1與L2正則化

???? GitHub傳送門

https://github.com/Pysamlam/Tips-of-Feature-engineering

原創不易,如果覺得這種學習方式有用,希望可以幫忙隨手轉發or點下“在看”,這是對我的極大鼓勵!阿里嘎多!????