有案例有代碼,詳細模型分數
編輯導語:風控模型的應用場景非常廣泛,只要牽扯互聯網金融的行業就少不了風控,風控模型建好后還要映射到信用分數空間,才能呈現給用戶;本文作者分享了詳細的建模方法,教你如何建立模型分數,我們一起來看一下。
目前在個人信用風控建模領域主要使用的模型有兩種:
- 基于線性回歸分析的評分卡模型,常見于銀行背景的放貸機構;
- 基于大數據的機器學習模型,如隨即森林、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 協議
- 目前還沒評論,等你發揮!