有案例有代碼,詳細模型分數(下)

1 評論 5478 瀏覽 8 收藏 14 分鐘

編輯導語:風控模型的應用場景非常廣泛,只要牽扯互聯網金融的行業就少不了風控,風控模型建好后還要映射到信用分數空間,才能呈現給用戶;本文作者分享了詳細的建模方法,教你如何建立模型分數,我們一起來看一下。

承接上文《有案例有代碼,詳細模型分數》本文開頭告訴大家怎樣更合理的向客戶展示信用評估結果。把模型預測值映射到一個分數區間,比如350~950,分數越高信用越好。

很自然的我們就走到了這個最佳選擇,至于分數為什么定義在這個區間,我個人理解一是為了跟國際上主流的個人信用評分區間接軌;二是為了拉開用戶之間的分數差距。

4. 如何映射分數

最簡單最容易想到的是采用尺度變化,將模型預測結果線性的映射到350~950,然后找到cutoff 對應的分數X,告訴用戶分數高于X就可以拿到貸款。

等一下!如果過段時間模型更換了怎么辦?

模型換了,cutoff隨之變化,分數X也跟著變了。這時就會有一部分用戶瘋狂的呼叫客服問“為啥我的評分變高了,反而不能貸款?”

同時每次更換模型,后臺、前端都需要進行相應的邏輯、頁面修改,每次模型發布需要多個環節協作完成,是一種高耦合的工作方式。

于是你趕緊召集團隊成員討論解決方案,有人提出一個又簡單又好用的方案:分段尺度變換,將cutoff 固定為 680分(本文假定的)然后分成兩段作尺度變換。

總結分段尺度變換的優點:

  1. 模型切換用戶無感。無論模型的cutoff如何調整,用戶感知不到差別,只要分數超過680都可以成功申請到貸款;
  2. 解耦了模型團隊與開發團隊。也就是說當模型人員校準好評分后,后臺開發只需要設定680分通過,從此以后無論模型人員怎么更換模型,后臺開發都不用再重新修改代碼。

“`python

predict_desc = table.describe()[‘predict’]

# 這里用幾倍標準差確定上下界根據經驗設定,是為了避免outlier值使得分數過于集中在某個范圍

upper = min(predict_desc[‘mean’] + 5 * predict_desc[‘std’], 1)

lower = max(predict_desc[‘mean’] – 3 * predict_desc[‘std’], 0)

def get_score_linear(predict, upper, lower, cutoff):

“””

將模型打分結果尺度變換到350~950的分數區間

:param predict: float, 模型打分

:param upper: 模型打分上界

:param lower: 模型打分下界

:param cutoff: 680分位置對應的模型打分

:return:

“””

if predict > upper:

return 350

elif predict > cutoff:

return 680 – int((680 – 350) * (predict – cutoff) / (upper – cutoff))

elif predict == cutoff:

return 680

elif predict > lower:

return 680 + int((cutoff – predict) * (950 – 680) / (cutoff – lower))

else:

950

二、客群分層下的分數映射

1. 老用戶分層

敏銳的你發現,隨著用戶的復貸次數增多,原有盈虧平衡點的計算方式會使得拉新成本被計算了多次(用戶復貸幾次就多計算幾次)。

這也就引出了用戶分層的一種場景:區分新老客戶,分別建模,分別計算盈虧平衡點。

傳統的評分卡中A卡B卡也有異曲同工之處:

  • A卡用于貸前審批階段對借款申請人的量化評估,是使用最廣泛的;
  • B卡用于貸中階段,增加了借款人的還款及交易行為,預測借款人未來的還款能力和意愿;

綜合分析新老用戶分別建模的特點:

  1. 模型更準確。老客戶建模引入了歷史還款行為、交易行為,使得模型更準確。
  2. 老用戶的成本更低。拉新成本歸屬于邊際成本,當新用戶轉化為老用戶后,每多一次復貸都會將拉新成本攤平。那么就可以將拉新成本算在新用戶上,老用戶的成本得以降低,對逾期率有更大的容忍度;
  3. 提高復貸率,提高盈利。修正老客戶的盈虧平衡點,可以提高老客戶的通過率,從而提高復貸率,提高盈利。

那么我們再重新計算以下老用戶的盈虧平衡點:帶入公式計算得到盈虧平衡點 pd = 0.0217,在代碼中求得cutoff = 0.047。

同理,采用分段尺度變換方法可以將模型結果進一步映射到信用分數空間,這里不再贅述。

此時的你又開始思考如何做大做強。為了吸引更多用戶,留住優質客源,你跑斷了腿找到一個新的資本方,愿意以更低的資金成本給你提供資金來源。

于是你終于可以上線一款新產品:更低的利率給更好的你。

至此業務進入了多產品軌道。

2. 用戶質量分層以匹配不同利率產品

除了按照新老客戶性質分層,還可以按照用戶質量來劃分用戶。

將老用戶分為優質用戶和次優用戶,這樣做的目的是為優質用戶匹配優質產品,更低利率或更高額度。

按照這個思路就可以將用戶分為以下四個層次:

  • A — 老用戶中的優質用戶???資金成本0.02 利率?0.22 額度?5000
  • B — 老用戶中的次優用戶???資金成本0.04 利率?0.34 額度?3000
  • C — 新用戶中的優質用戶???資金成本0.02 利率?0.30 額度?3000
  • D — 新用戶中的次優用戶???資金成本0.04 利率?0.34 額度?1000

只以A、B類用戶舉例,同理帶入公式計算盈虧平衡點:


得到:

A類用戶盈虧平衡點?pd = 0.01467

B類用戶盈虧平衡點?pd = 0.02167

現實業務中可以將ABCD四類用戶評級結果直接反饋給用戶,比如我們??吹降狞S金會員、鉆石會員,本質上是類似的;

也可以按照分段尺度變換的思路將分數劃分多段,例如:

代碼可以參考前面二分段尺度變換的代碼,增加對應的判斷分支即可。

隨之而來的問題也就出現了:

  1. 如果產品越來越豐富,變換額度、利率,所需要計算的盈虧平衡點越來越多,那怎么辦呢?再使用分段尺度變換這種簡單粗暴的方法就顯得越來越笨拙了,也增加了出錯的概率。
  2. 當多個模型共同工作或切換備用模型時,如何保證分數尺度一致?這里尺度一致的意思是,兩個模型分數相同時對應的逾期率是否一致。

?三、多產品、多客群、多模型下數映射的產生——分數校準

為了能夠更好的進行風險定價,業務部門希望模型給出的分數能夠準確的反映出真實的信用風險等級。

這一過程稱為分數校準(Score Calibration)。

也就是說,我們最終的目標是:建立信用評估分數與預測逾期率的函數關系。

這里介紹一種常用的分數校準方法,通過該方法,可以由分數精準的計算出預測逾期率,反之亦可。

1. 建立Odds與分數的函數關系

熟悉業務的同學會知道,建模時逾期樣本非常少,更多的是信用良好的樣本。

原因我認為有兩點:

  1. 現實中好人是大多數的,這點不多解釋。
  2. 模型長期篩選的作用,通常我們已經得到還款結果的樣本是已經通過上一輪模型的一批樣本,壞用戶已經被上一輪模型過濾掉大部分了。

因此,逾期率與用戶數量是符合冪律分布的。也就是說隨著逾期率的升高,用戶數量呈指數下降。

進而在設計Odds與分數的函數關系時,對Odds取了一個log,再結合簡單的線性方程,加入截距A和斜率B進行線性擬合:

也叫做比率Odds,常用來評估風險。(ps:熟悉賭球的朋友會對比率很熟悉),同時有

由公式看出來分數與log(Odds)呈線性關系,表示分數每變化多少,逾期率會番翻。

要算出系數A、B的話,需要從業務角度先預設兩個前提條件:

我們設定時,應逾期率是0.0196,?當Odds按雙倍上下浮動時,分值對應變動100分。

這里設定的值只是為了演示計算,實際業務中應該根據業務情況制定合理的取值。

求解方程組計算得到A,B

上面這個公式就是分數與逾期率的函數關系,我們可以進一步把分數、Odds、逾期率的對照關系計算出來:

仔細觀察我們會發現,隨著逾期率PD越來越小,Odds其實近似等于逾期率,這就更方便業務團隊進行風險定價。

2. 建立模型結果與Odds的函數關系

  • 對于機器學習模型來說這里變量x可以是一個或多個模型預測結果;
  • 對于評分卡來說變量x就是原始特征;

從模型結果到Odds是一個線性回歸過程。

至此,我們就完成了一個標準的分數校準。

四、總結

我們回顧一下,隨著產品種類,模型數量的豐富,分數映射逐漸有了更多的要求以適應業務的需求和團隊協作的高效。

總結一下每個階段的優缺點:

 

本文由 @FAL金科應用研院 原創發布于人人都是產品經理,未經許可,禁止轉載。

題圖來自 unsplash,基于 CC0 協議

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 124

    回復