風控業務背景

在風控中,我們常用KS指標來評估模型的區分度(discrimination)。這也是風控模型同學最為追求的指標之一。那麼,有多少人真正理解KS背後的內涵?本文將從區分度的概念、KS的計算方法、業務指導意義、幾何解釋、數學思想等多個維度展開分析,以期對KS指標有更為深入的理解認知。

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) 建立的,一般定義為:

ks = max{|cum(bad_rate) – cum(good_rate)|} tag{1}

Part 3. KS的計算過程及業務分析

很多博客文章告訴我們,計算KS的常見方法是這樣的:

  • step 1. 對變量進行分箱(binning),可以選擇等頻、等距,或者自定義距離。
  • step 2. 計算每個分箱區間的好賬戶數(goods)和壞賬戶數(bads)。
  • step 3. 計算每個分箱區間的累計好賬戶數占總好賬戶數比率(cum_good_rate)和累計壞賬戶數占總壞賬戶數比率(cum_bad_rate)。
  • step 4. 計算每個分箱區間累計壞賬戶占比與累計好賬戶占比差的絕對值,得到KS曲線。也就是: ks = |cum_goodrate – cum_badrate|
  • step 5. 在這些絕對值中取最大值,得到此變量最終的KS值。

為幫助大傢理解,現以具體數據(非業務數據)展示這一過程,如圖2所示。其中,total是每個分數區間裡的樣本量,total_rate為樣本量占比;bad代表逾期,bad_rate為每個分數區間裡的壞樣本占比。

圖 2 – KS計算過程表

那麼,分析這張表我們可以得到哪些信息呢?

  1. 模型分數越高,逾期率越低,代表是信用評分。因此,低分段bad rate相對於高分段更高, cum_bad_rate曲線增長速率會比cum_good_rate更快,cum_bad_rate曲線在cum_good_rate上方。
  2. 每個分箱裡的樣本數基本相同,說明是等頻分箱。分箱時需要考慮樣本量是否滿足統計意義。
  3. 若我們設定策略cutoff為0.65(低於這個值的用戶預測為bad,將會被拒絕),查表可知低於cutoff的cum_bad_rate為82.75%,那麼將拒絕約82.75%的壞賬戶。
  4. 根據bad_rate變化趨勢,模型的排序性很好。如果是A卡(信用評分),那麼對排序性要求就比較高,因為需要根據風險等級對用戶風險定價。
  5. 模型的KS達到53.1%,區分度很強。這是設定cutoff為0.65時達到的最理想狀態。實際中由於需權衡通過率與壞賬率之間的關系,一般不會設置在理想值。因此,KS統計量是好壞距離或區分度的上限。
  6. 通常情況下,模型KS很少能達到52%,因此需要檢驗模型是否發生過擬合,或者數據信息泄漏 。

KS值的取值范圍是[0,1],一般習慣乘以100%。通常來說,KS越大,表明正負樣本區分程度越好。KS的業務評價標準如圖3所示。由於理解因人而異,不一定完全合理,僅供參考。

圖 3 – KS的評價標準(供參考)

需要指出的是,KS是在放貸樣本上評估的,放貸樣本相對於全量申貸樣本永遠是有偏的。如果風控系統處於裸奔狀態(相當於不生效,隨機拒絕),那麼這個偏差就會很小;反之,如果風控系統做得越好,偏差就會越大。因此,KS不僅僅隻是一個數值指標,其背後蘊藏著很多原因,值得我們結合業務去認真分析。

當KS不佳時,為瞭達到KS的預期目標,我們可以從哪些方面著手去優化呢?一般建議如下:

  1. 檢驗入模變量是否已經被策略使用,使用重復變量會導致區分度不高。
  2. 檢驗訓練樣本與驗證樣本之間的客群差異是否變化明顯?樣本永遠是統計學習中的重要部分。
  3. 開發對目標場景更具針對性的新特征。比如,識別長期信用風險,就使用一些強金融屬性變量;識別欺詐風險,就使用一些短期負面變量。
  4. 分群建模或分群測算。分群需要考慮穩定性和差異性。
  5. bad case分析,提取特征。

若將表2數據可視化,就可以得到我們平時常見的KS曲線圖(也叫魚眼圖 ),其中橫坐標為模型概率分數(0~1),縱坐標為百分比(0~100%)。紅色曲線代表累計壞賬戶占比,綠色曲線代表累計好賬戶占比,藍色曲線代表KS曲線。

圖 4 – KS曲線

至此,我們已經基本瞭解KS的計算流程、評價標準、業務指導意義和優化思路。接下來,再給大傢留下幾個思考題 :

  1. 為什麼風控中常用KS指標來評價模型效果,而不用準確率、召回率等?
  2. 最大KS值隻是一個宏觀結果,那麼在不同cutoff內取到max時,模型性能有什麼差異?
  3. 一般情況下,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個指標:

因此,可以把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曲線?

  1. 如果模型沒有任何排序性,那麼正樣本在每個分數區間上均勻分佈。此時,無論如何設置閾值,[0,閾值]這個分數區間內TPR將與區間長度成正比關系,所以就是對角線。
  2. 如果希望TPR盡可能高,FPR盡可能低,我們可以設計一個目標函數,這與KS的定義完全相同。

ks = max (|TPR-FPR|) tag{2}

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曲線的映射關系如下:

另外可以從圖中得出這些信息:

  1. 若希望KS盡可能大,那麼R需要盡可能接近(0,1),此時AUC一般也會增大。
  2. 對於相同的KS值,在KS曲線上有兩個選擇,但TPR和FPR同時大或同時小。雖然我們的目的通常是抓對更多的壞人(TPR⬆),盡可能減少錯抓的好人(FPR⬇),但兩者需要trade-off。到底選擇哪個閾值,取決於業務目標:是希望對bad有更高的召回,還是對good有更低的誤傷?
  3. 由於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