基於變數KS最大化的分箱方案
寫在前面:
這是一個數學水帖。
- KS test傳送門: Kolmogorov–Smirnov test
- 強調:這裡是變數的KS值,而不是模型的KS值。變數的KS值意味著這個變數對好壞樣本的鑒別能力。這裡介紹的是一個對連續型變數的分箱方案,分箱後的KS值保持最大。
先直接上結論:
- 連續型變數:分箱後的KS值 <= 分箱前的KS值。
- 分箱過程中,決定分箱後的KS值的是某一個切點,而不是多個切點的共同作用。
- 這個切點的位置是原始KS最大的位置。
簡單證明:
這是一個範圍為[0,100]的連續型變數,曲線(實際上是密集的折線)是變數分箱前的累積分布函數,折線是分箱後的累積分布函數,切點是[10,20,30,40,50,60,70,80,90]。綠紅分別代表好壞樣本。從圖片可以看出,KS產生在x=60,KS value大概0.6。壞樣本的這個變數主要集中在低分段,好樣本的這個變數主要集中高分段。可以認為變數有較好的鑒別好壞的能力。
根據累積分布曲線的特性可以得出以下結論:
1.對於 ,分箱前的兩條累積分布曲線的距離集合記為 ,任意方式分箱後的兩條累積分布曲線的距離集合記為 。 有 。
因此,分箱後的KS值 <= 分箱前的KS值
2.當存在切點 時,分箱前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
※數據分析師職業生涯規劃與等級