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

0 評論 3165 瀏覽 5 收藏 10 分鐘

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

目前在個人信用風控建模領域主要使用的模型有兩種:

  1. 基于線性回歸分析的評分卡模型,常見于銀行背景的放貸機構;
  2. 基于大數據的機器學習模型,如隨即森林、XGBoost等,常見于互聯網金融領域。

這兩種建模方法無論哪種都需要將模型結果映射到信用分數空間,最終呈現給用戶一個能夠表征信用的分數,比如國內的芝麻分、美國的FICO分。

那么問題來了,模型結果和分數同樣都是數值,為什么不直接呈現模型結果?為什么還要進一步轉化為分數?為什么使用分數校準?

本文的目的就是要讓你知其然也知其所以然。

深入到業務中,帶你一步步搞懂分數映射產生的背景以及分數校準背后的業務需求;在了解了業務之后,你就會發現分數的意義和映射方法的內在邏輯。

一、分數映射的產生——一款產品一個模式

先從最簡單的情況入手,假設我們現在成立了一家小信貸公司,推出一款借貸產品,詳情如下:

(該產品數值僅作示意,不代表真實情況)

此時我們要解決的第一個問題是:如何讓這款產品盈利?

信貸業務能夠盈利的關鍵是還款人的利息能夠覆蓋壞賬損失(不能收回的各種應收款項)。

也就是說要盡可能的把錢借給信用良好、按時還款的用戶以保證產品盈利。

在產品參數確定后,逾期率是保證產品盈利的唯一影響因素。

這里要提一下關鍵的一點:如何定義逾期率?

在信貸領域通常逾期超過60天的用戶基本上就不會再還錢了,自然的我們就可以通過逾期超過60天的比例來衡量用戶的好壞程度。

在機器學習建模時,有時為了增加壞賬樣本的數量,也會將逾期超過30天的比例定義為逾期率。

1. 逾期率多久可以忍受

根據信貸業務盈利的邏輯,我們可以得到下面這個盈虧平衡的公式:

其中:

  • L ——?表示額度;
  • InterestRate?—— 表示貸款年化利率;
  • FundsRate —— 表示資金成本年化利率;
  • pd 表示逾期率(Probability of Default);
  • OperatingCost —— 表示運營成本;
  • NewCost —— 表示拉新成本,指獲取單個新客戶所支付的金額(拉新成本的定價要結合營銷方案具體問題具體分析)。

舉個簡單的例子,若從渠道購買流量,購買金額除以該渠道的新客戶數量就是該渠道的新客成本。

再比如舉辦拉新獎勵活動,成功拉取一個新用戶所需要支付的獎勵金額也是拉新成本。

總之拉新成本的計算要圍繞實際引流方案、投入來確定。

將產品詳情中數值帶入公式后計算得到?pd = 0.015?,即盈虧平衡點。

2. 如何確定模型穩定性是否發生了變化

什么是閾值cutoff?

我們先看一看真實的模型打分結果長什么樣子,這里用的是XGBoost模型:

  • label —— 樣本真實類別,0表示正常還款,?1 表示逾期;
  • predict —— 模型預測值。

對于二分類問題的模型,預測結果是一個0~1的小數,最終該觀測點被判定為哪個類別是由閾值所決定的:p >= cutoff 表示1, p < cutoff 表示0。

這里有個小問題:逾期率和模型結果的值域都是[0, 1],那么模型預測值等于逾期率這個假設成立嗎?

我們做一個簡單的統計,如下:

從均值、分位點的結果上看他們并不能直接劃等號。

理論上來說Linear Regression模型的輸出概率可以認為是真實概率,而其他分類器的輸出概率并不反映真實概率。

接下來我們需要將模型預測結果先排序,再分箱計算各個桶的逾期率,找到滿足盈虧平衡點要求的預測結果閾值,低于閾值通過貸款申請,反之則拒絕貸款申請。

“`python

def get_cutoff(data, bin_size, fpd):

“””

第一步:確定分箱箱數

第二步:按照predict分數排序,劃分bins

第三步:計算各個bins的逾期率,找到逾期率滿足盈虧平衡點的分界線

:param data: Dataframe類型,包含?label(是否逾期), predict(模型預測值)兩列數據

:param bin_size: 分箱個數

:param pd: 盈虧平衡點的逾期率

:return:

“””

bin_width = round((max(data[‘predict’]) – min(data[‘predict’])) / bin_size, 6)

bin_lst = [min(data[‘predict’]) + bin_width * i for i in range(bin_size + 1)]

bin_lst[0], bin_lst[-1] = 0, 1

data[‘bin’] = pd.cut(data[‘predict’], bin_lst)

bin_group = data.groupby(‘bin’)[‘label’].agg([ ‘mean’]).reset_index()

print(bin_group)

cutoff = None

for i in range(20):

if bin_group.iloc[i][‘mean’] > fpd:

cutoff = bin_group.iloc[i][‘bin’].left

break

return cutoff

“`

將上一環節計算出的盈虧平衡點0.015作為參數代入函數,返回cutoff值。

根據打印的分箱結果,可以看到在(0.0299, 0.0327)處,逾期率為0.015512,是第一個逾期率超過盈虧平衡點0.015的分箱。

因此把cutoff定為?0.0299,以保證拒絕掉不滿足盈虧平衡點的用戶。

3. 如何向客戶展示信用評估結果?

至此,你的小公司將面臨幾種選擇:

A. 直接告訴用戶貸款申請結果呢?通過或拒絕這樣做不是不可以,但給用戶的感覺有點霸道了(是不是很像申請信用卡的感覺,等了半個月被通知審核失?。?,這不是一個追求用戶體驗的互金小公司該有的服務態度。

B. 把模型預測值所在的分箱逾期率作為信用評估結果反饋給用戶呢?

這樣做也不是不可以,但設身處地的站在用戶角度想一想會怎樣?

用戶會不會產生疑問:

  • 這小數點后這么多位的數值到底是個啥?
  • 高了好還是低了好?
  • 從小到大我只見過1星到5星,0分到100分……

通常真實逾期率在小數點2位以后有所差別,顯然把逾期率反饋給用戶是不夠專業的;這還沒考慮是不是暴露了商業機密的問題,比如客群質量、定價等。

那怎樣更合理的向客戶展示信用評估結果呢,下篇告訴你!

 

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

題圖來自 unsplash,基于 CC0 協議

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發揮!