轉自:https://zhuanlan.zhihu.com/p/79934510
風控業務背景
在風控中,我們常用KS指標來評估模型的區分度(discrimination)。這也是風控模型同學最為追求的指標之一。那么,有多少人真正理解KS背后的內涵?本文將從區分度的概念、KS的計算方法、業務指導意義、幾何解釋、數學思想等多個維度展開分析,以期對KS指標有更為深入的理解認知。
目錄
Part 1. 直觀理解區分度的概念
Part 2. KS統計量的定義
Part 3. KS的計算過程及業務分析
Part 4. 風控中選用KS指標的原因分析
Part 5. ROC曲線的幾何繪制及理解
Part 6. 從幾何角度解釋KS與ROC的關系
Part 7. KS檢驗的理解應用
Part 8. KS的計算代碼(Python)
版權聲明©️
參考資料
Part 1. 直觀理解區分度的概念
在探索性數據分析(EDA)中,若想大致判斷自變量x對於因變量y有沒有區分度,我們常會分正負樣本群體來觀察該變量的分布差異,如圖1所示。那么,如何判斷自變量是有用的?直觀理解,如果這兩個分布的重疊部分越小,代表正負樣本的差異性越大,自變量就能把正負樣本更好地區分開。
打個比方,想象這個變量就是一雙手,把這兩個分布往兩邊拉開。這雙手的力量越大,兩個概率分布間隔就越遠,說明變量區分性就越好。
圖 1 - 正負樣本變量分布差異對比
Part 2. KS統計量的定義
KS(Kolmogorov-Smirnov)統計量由兩位蘇聯數學家A.N. Kolmogorov和N.V. Smirnov提出。在風控中,KS常用於評估模型區分度。區分度越大,說明模型的風險排序能力(ranking ability)越強。
KS統計量是基於經驗累積分布函數(Empirical Cumulative Distribution Function,ECDF)
建立的,一般定義為:
Part 3. KS的計算過程及業務分析
很多博客文章告訴我們,計算KS的常見方法是這樣的:
- step 1. 對變量進行分箱(binning),可以選擇等頻、等距,或者自定義距離。
- step 2. 計算每個分箱區間的好賬戶數(goods)和壞賬戶數(bads)。
- step 3. 計算每個分箱區間的累計好賬戶數占總好賬戶數比率(cum_good_rate)和累計壞賬戶數占總壞賬戶數比率(cum_bad_rate)。
- step 4. 計算每個分箱區間累計壞賬戶占比與累計好賬戶占比差的絕對值,得到KS曲線。也就是:
- step 5. 在這些絕對值中取最大值,得到此變量最終的KS值。
為幫助大家理解,現以具體數據(非業務數據)展示這一過程,如圖2所示。其中,total是每個分數區間里的樣本量,total_rate為樣本量占比;bad代表逾期,bad_rate為每個分數區間里的壞樣本占比。
圖 2 - KS計算過程表
那么,分析這張表我們可以得到哪些信息呢?
- 模型分數越高,逾期率越低,代表是信用評分。因此,低分段bad rate相對於高分段更高, cum_bad_rate曲線增長速率會比cum_good_rate更快,cum_bad_rate曲線在cum_good_rate上方。
- 每個分箱里的樣本數基本相同,說明是等頻分箱。分箱時需要考慮樣本量是否滿足統計意義。
- 若我們設定策略cutoff為0.65(低於這個值的用戶預測為bad,將會被拒絕),查表可知低於cutoff的cum_bad_rate為82.75%,那么將拒絕約82.75%的壞賬戶。
- 根據bad_rate變化趨勢,模型的排序性很好。如果是A卡(信用評分),那么對排序性要求就比較高,因為需要根據風險等級對用戶風險定價。
- 模型的KS達到53.1%,區分度很強。這是設定cutoff為0.65時達到的最理想狀態。實際中由於需權衡通過率與壞賬率之間的關系,一般不會設置在理想值。因此,KS統計量是好壞距離或區分度的上限。
- 通常情況下,模型KS很少能達到52%,因此需要檢驗模型是否發生過擬合,或者數據信息泄漏 。
KS值的取值范圍是[0,1],一般習慣乘以100%。通常來說,KS越大,表明正負樣本區分程度越好。KS的業務評價標准如圖3所示。由於理解因人而異,不一定完全合理,僅供參考。
圖 3 - KS的評價標准(供參考)
需要指出的是,KS是在放貸樣本上評估的,放貸樣本相對於全量申貸樣本永遠是有偏的。如果風控系統處於裸奔狀態(相當於不生效,隨機拒絕),那么這個偏差就會很小;反之,如果風控系統做得越好,偏差就會越大。因此,KS不僅僅只是一個數值指標,其背后蘊藏着很多原因,值得我們結合業務去認真分析。
當KS不佳時,為了達到KS的預期目標,我們可以從哪些方面着手去優化呢?一般建議如下:
- 檢驗入模變量是否已經被策略使用,使用重復變量會導致區分度不高。
- 檢驗訓練樣本與驗證樣本之間的客群差異是否變化明顯?樣本永遠是統計學習中的重要部分。
- 開發對目標場景更具針對性的新特征。比如,識別長期信用風險,就使用一些強金融屬性變量;識別欺詐風險,就使用一些短期負面變量。
- 分群建模或分群測算。分群需要考慮穩定性和差異性。
- bad case分析,提取特征。
若將表2數據可視化,就可以得到我們平時常見的KS曲線圖(也叫魚眼圖 ),其中橫坐標為模型概率分數(0~1),縱坐標為百分比(0~100%)。紅色曲線代表累計壞賬戶占比,綠色曲線代表累計好賬戶占比,藍色曲線代表KS曲線。
圖 4 - KS曲線
至此,我們已經基本了解KS的計算流程、評價標准、業務指導意義和優化思路。接下來,再給大家留下幾個思考題 :
- 為什么風控中常用KS指標來評價模型效果,而不用准確率、召回率等?
- 最大KS值只是一個宏觀結果,那么在不同cutoff內取到max時,模型性能有什么差異?
- 一般情況下,KS越大越好,但為什么通常認為高於75%時就不可靠?
Part 4. 風控中選用KS指標的原因分析
風控建模時,我們常把樣本標簽分為GBIX四類,其中:G = Good(好人,標記為0),B = Bad(壞人,標記為1),I = Indeterminate (不定,未進入表現期),X = Exclusion(排斥,異常樣本)。
需要指出的是,Good和Bad之間的定義往往是模糊、連續的,依賴於實際業務需求。這里舉兩個例子或許能幫助大家理解:
例1:模糊性
對於12期信貸產品,如果設定表現期為前6期,S6D15(前6期中任意一期逾期超過15天)就是1,否則為0;但是后來如果把表現期調整為前3期,那么對於“前3期都正常還款,但4~6期才發生逾期並超過15天“的這部分樣本而言,原本所定義的label就從1就變成0了。
因此,業務需求的不同,導致標簽定義不是絕對的。
例2:連續性
定義首期逾期超過30天為1,否則為0。但是,逾期29天和逾期31天的用戶之間其實並沒有不可跨越的硬間隔,逾期29天的用戶可能會進一步惡化為逾期31天。
由於逾期的嚴重程度定義本身就帶有一定的主觀性,我們很難說逾期天數差幾天有多少本質的差異,所以哪怕我們為了轉化為分類問題做了硬性的1和0的界限定義,但在業務上理解還是一個連續問題。
因此在風控中,y的定義並不是非黑即白(離散型),而用概率分布(連續型)來衡量或許更合理。
我們通常用概率分布來描述這種模糊的軟間隔概念,也傾向於使用LR這種概率模型,而不是SVM這種以邊界距離作為優化目標的模型。
那為什么選擇KS指標呢?——KS指標傾向於從概率角度衡量正負樣本分布之間的差異。正是因為正負樣本之間的模糊性和連續性,所以KS也是一條連續曲線。但最終為什么取一個最大值,主要原因是提取KS曲線中的一個顯著特征,從而便於相互比較。
Part 5. ROC曲線的幾何繪制及理解
在風控場景中,樣本不均衡問題非常普遍,一般正負樣本比都能達到1:100甚至更低。此時,評估模型的准確率是不可靠的。因為只要全部預測為負樣本,就能達到很高的准確率。例如,如果數據集中有95個貓和5個狗,分類器會簡單的將其都分為貓,此時准確率是95%。
因此,我們更傾向於用混淆矩陣來評估模型分類效果。
圖 5 - 混淆矩陣
真陽率:![]()
假陽率:![]()
為簡化考慮,我們的風控系統只有一個信用評分模型,那么高於分數閾值就預測為good,反之為bad,予以拒絕。我們一般追求更高的TPR,也就是"抓對了";以及更低的FPR,也就是"抓錯了"。抓對了和抓錯了——是在模型決策的一念之間(不同的分數閾值),因此我們會設置不同的閾值來觀察這種變化規律。
在建立混淆矩陣的概念后,接下來介紹ROC曲線的繪制方法(后面將會以ROC曲線來輔助我們理解KS曲線)。
- step 1. 先按分數升序排列,計算某個閾值T下的TPR和FPR。
由於低於T,預測為bad(紅色區域),反之預測為good(綠色區域)。紅色區域內有樣本的真實bad和good標簽,我們統計以下2個指標:
1)TPR = 紅色區域(預測為bad & 真實為bad) / 整體區域真實為bad
2)FPR = 紅色區域(預測為bad & 真實為good)/ 整體區域真實為good
因此,可以把TPR理解為累積正樣本率(cum_bad_rate),FPR理解為累積負樣本率(cum_good_rate)。
圖 6 - TPR曲線繪制過程
- step 2. 重復step1多次,在不同閾值T下計算得到多個TPR和FPR。
- step 3. 以FPR為橫軸,TPR為縱軸,畫出ROC曲線(如圖7)。曲線下方的面積即為AUC值。
圖 7 - ROC曲線
我們該如何理解ROC曲線?
- 如果模型沒有任何排序性,那么正樣本在每個分數區間上均勻分布。此時,無論如何設置閾值,[0,閾值]這個分數區間內TPR將與區間長度成正比關系,所以就是對角線。
- 如果希望TPR盡可能高,FPR盡可能低,我們可以設計一個目標函數,這與KS的定義完全相同。
Part 6. 從幾何角度解釋KS與ROC的關系
為了更加直觀展示KS和ROC曲線的關系,我們將添加以下輔助線,從而得到圖8,其中包含4張子圖。
- 輔助曲線:TPR(圖8左上)、FPR(圖8右下)。
- 輔助直線:紅線為取得max_ks時的cum_bad_rate,綠線為取得max_ks時的cum_good_rate,藍線為max_ks。灰線BR為ROC曲線在R點的切線,且與對角線OD平行。
圖 8 - 左上—TPR,右上—ROC,左下—KS,右下—FPR
在添加輔助線后,可以得到以下關鍵數據點的坐標信息:
為什么要在R點加上一條切線? 這是因為KS = |TPR - FPR|,如果添加輔助線TPR = FPR + KS,那么這條直線的截距就是KS值。當與ROC曲線相切時,截距最大,也就對應max_ks。
從幾何意義上,KS曲線和ROC曲線的映射關系如下:
另外可以從圖中得出這些信息:
- 若希望KS盡可能大,那么R需要盡可能接近(0,1),此時AUC一般也會增大。
- 對於相同的KS值,在KS曲線上有兩個選擇,但TPR和FPR同時大或同時小。雖然我們的目的通常是抓對更多的壞人(TPR⬆),盡可能減少錯抓的好人(FPR⬇),但兩者需要trade-off。到底選擇哪個閾值,取決於業務目標:是希望對bad有更高的召回,還是對good有更低的誤傷?
- 由於KS只是在一個最大分隔點時的值,並不夠全面。通常我們也會同時參考KS和AUC(或Gini)
在理解KS和ROC曲線的關系后,我們也就更容易理解——為什么通常認為KS在高於75%時就不可靠?我們可以想象,如果KS達到80%以上,此時ROC曲線就會變得很畸形,如圖9所示。
另一個更重要的可能原因是,為了便於制定策略,模型評分在放貸樣本上一般要求服從正態分布。現實中不太可能出現如此完美的分類器,如果出現這種明顯的雙峰分布,反而就不合常理,我們就有理由懷疑其可靠性。( 值得一起探討)
圖 9 - 不同分布下的ROC曲線
Part 7. KS檢驗的理解應用
KS檢驗(Kolmogorov-Smirnov Test)是一種根據樣本來推斷總體是否服從某種分布的方法,因此也可以用來檢驗兩個經驗分布是否服從同一總體分布。
我們可以定義以下假設檢驗命題:
- 原假設H0 :好人、壞人的分數分布服從同一總體分布
- 備擇假設H1:好人、壞人的分數分布不服從同一總體分布
如果得到的p-value比指定的顯著水平(假設為5%)小,那么我們就可以拒絕原假設,認為兩個分布不服從同一總體分布。
Part 8. KS的計算代碼(Python)
def ks_compute(proba_arr, target_arr): ''' ---------------------------------------------------------------------- 功能:利用scipy庫函數計算ks指標 ---------------------------------------------------------------------- :param proba_arr: numpy array of shape (1,), 預測為1的概率. :param target_arr: numpy array of shape (1,), 取值為0或1. ---------------------------------------------------------------------- :return ks_value: float, ks score estimation ---------------------------------------------------------------------- 示例: >>> ks_compute(proba_arr=df['score'], target_arr=df[target]) >>> 0.5262199213881699 ---------------------------------------------------------------------- ''' from scipy.stats import ks_2samp get_ks = lambda proba_arr, target_arr: ks_2samp(proba_arr[target_arr == 1], \ proba_arr[target_arr == 0]).statistic ks_value = get_ks(proba_arr, target_arr) return ks_value