python评分卡建模-卡方分箱(2)之代码实现
卡方值計算
計算卡方值的函數(shù)需要輸入numpy格式的頻數(shù)表。對于pandas數(shù)據(jù)集,只需使用pd.crosstab計算即可,例如變量“總賬戶數(shù)” 與 目標(biāo)變量 “是否壞客戶” 的頻數(shù)表,如下圖:
?
每一行代表一個區(qū)間(組)的頻數(shù),如上圖中第一行表示 總賬戶數(shù)在[2,3) 這個組內(nèi)對應(yīng)的好客戶3個, 壞客戶1個。
將頻數(shù)表轉(zhuǎn)成numpy數(shù)組,然后調(diào)用函數(shù)計算卡方值,計算邏輯如下:
1) 計算第 i 行的總數(shù)。
2) 計算第 j 列的總數(shù)。
3) 計算總頻數(shù) N。
4) 計算 第 i,j 格的期望頻數(shù)。
5)求的每個格中的卡方:
?
6) 由于期望頻數(shù) Ei,j有可能是0,此時上一步計算出來的結(jié)果無意義,需要清除,不計入最終結(jié)果。
7) 把所有格的卡方相加得到卡方值。
代碼如下
'author:xiaodongxu&monica'
ChiMerge分箱算法
卡方分箱函數(shù)可以根據(jù)最大分組數(shù)目和卡方閾值來控制最終的分箱數(shù)。
如果調(diào)用時既沒有設(shè)置最大分組數(shù),也沒有指定閾值,那么函數(shù)會自動使用95%的置信度設(shè)置閾值。
分箱邏輯是:
1)初始時,所有變量值都自成一組,統(tǒng)計頻數(shù)。
2)然后按照各組起始值從小到大,依次掃描,取出兩組拼成計算卡方值。
如果當(dāng)前計算出的卡方值小于已觀察到的最小卡方值,則標(biāo)記當(dāng)前坐標(biāo),并更新已觀察最小卡方值為當(dāng)前值。
3)掃描一遍后,如果當(dāng)前分組數(shù)大于最大分組數(shù),或者最小卡方值小于閾值,就將最小卡方值對應(yīng)的兩組頻數(shù)合并,區(qū)間也合并。并回第2步執(zhí)行。否則,停止合并。輸出當(dāng)前各組的區(qū)間切分點。
代碼如下
'author:xiaodongxu&monica'
變量值轉(zhuǎn)分組
卡方分箱完成后,得到了各個分組的區(qū)間起始值。對于任給的一個變量值x,可以使用如下的函數(shù)獲得分組值。
代碼如下
'author:xiaodongxu&monica'
需要注意的是,如果需要轉(zhuǎn)換的值x不在分箱區(qū)間之內(nèi),很有可能是異常值,不應(yīng)該期望上面的函數(shù)來處理這種情況,而應(yīng)采用專門的異常值處理程序。
評分卡建模中的使用實例
下面介紹一下評分卡建模中的卡方分箱的使用。先來看看數(shù)據(jù)集。
?
除了y變量外,還有3個變量:貸款額度(loan_amnt,數(shù)值型),總賬戶數(shù)(total_acc,數(shù)值型),地址州(addr_state,類別型)。
對總賬戶數(shù)total_acc進(jìn)行分箱:
根據(jù)分箱結(jié)果進(jìn)行轉(zhuǎn)換,衍生新的分組變量:
?
現(xiàn)在已經(jīng)將 total_acc衍生成為新的類別型變量 total_acc_chi2_group ,接下來可以用WOE編碼繼續(xù)加工,然后進(jìn)入模型啦。
總結(jié)
以上是生活随笔為你收集整理的python评分卡建模-卡方分箱(2)之代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做好信贷业务必须了解这八大问题!
- 下一篇: 客户流失预警模型-GBDT模型