基於變數KS最大化的分箱方案

寫在前面:

這是一個數學水帖。

  1. KS test傳送門: Kolmogorov–Smirnov test
  2. 強調:這裡是變數的KS值,而不是模型的KS值。變數的KS值意味著這個變數對好壞樣本的鑒別能力。這裡介紹的是一個對連續型變數的分箱方案,分箱後的KS值保持最大。

先直接上結論:

  1. 連續型變數:分箱後的KS值 <= 分箱前的KS值。
  2. 分箱過程中,決定分箱後的KS值的是某一個切點,而不是多個切點的共同作用。
  3. 這個切點的位置是原始KS最大的位置。

簡單證明:

這是一個範圍為[0,100]的連續型變數,曲線(實際上是密集的折線)是變數分箱前的累積分布函數,折線是分箱後的累積分布函數,切點是[10,20,30,40,50,60,70,80,90]。綠紅分別代表好壞樣本。從圖片可以看出,KS產生在x=60,KS value大概0.6。壞樣本的這個變數主要集中在低分段,好樣本的這個變數主要集中高分段。可以認為變數有較好的鑒別好壞的能力。

根據累積分布曲線的特性可以得出以下結論:

1.對於 forall xin[0,100] ,分箱前的兩條累積分布曲線的距離集合記為 D_{1}任意方式分箱後的兩條累積分布曲線的距離集合記為 D_{2} 。 有D_{2}subseteq D_{1}

因此,分箱後的KS值 <= 分箱前的KS值

2.當存在切點 x=c 時,分箱前c點的截距=分箱後c點的截距,且該截距大小不受其他切點位置的影響。(所以,即使原始的兩條累積分布曲線有交點,也不需要考慮局部最優和全局最優問題,這裡的就是全局最優)

分箱方法

其實只要把一開始KS最大的點作為切點,其他切點可以任意挑選了。記KS最大的切點為D,這裡提供兩種常規思路: 1. 按bin size向D的左右繼續找切點 2. 寫成迭代,在D的左右定義域內繼續找KS最大的切點(同時也要考慮bin size等一系列問題)

def FindKSPoint(GoodSample,BadSample): """ """ SampleFeature= np.concatenate([GoodSample,BadSample]) GoodCDF = np.searchsorted(GoodSample, SampleFeature, side=right) / (1.0 * GoodSample.shape[0]) BadCDF = np.searchsorted(BadSample, SampleFeature, side=right) / (1.0 * BadSample.shape[0]) return SampleFeature[np.argmax(np.absolute(GoodCDF - BadCDF ))]

最後

1. 這次內容偏嚮應用,不便具體展開,大家有時間可以自己做嘗試。

2. 後面沒多少精力更新信貸相關的東西了,歡迎大家來投稿。我可以幫忙審閱和做一些輕量級的數據測試。


推薦閱讀:

《紅樓夢》的作者有多少個,數據分析帶你來探索
七周數據分析師:第二周業務篇,有關業務思維的學習。
找工作難,面試失敗的核心原因已經找到
python基礎篇 (12) pyechart
數據分析師職業生涯規劃與等級

TAG:信貸 | 建模 | 數據分析師 |