1. 程式人生 > >評分卡系列(一):講講評分系統的構建

評分卡系列(一):講講評分系統的構建

https 決定 not 例如 exc cnblogs 中文 panda 賬戶

作者:JSong 時間:2017.12

我想通過幾篇文章,給評分卡的全流程一個中等粒度的介紹。另外我的本職工作不是消費金融的數據分析,所以本系列的文章會偏技術一些。

  • 數據分析工具主要有Python3及pandas、sklearn等科學計算包,另外也會有自己的工具包reportgen。
  • 信用記錄數據采用Lending Club的公開數據,特征數目和樣本數都比較理想。大家可以到官網(www.lendingclub.com)下載,或者關註我的微信公眾號後臺回復:?數據集 ? 下載(含變量介紹和中文對照)。
  • 為了講清楚所有事,文章中會包含數學公式和Python實現代碼

相信大家都知道自己的芝麻信用分,它可以提高花唄的額度,可以消費貸,可以不繳押金直接租車等。在未來,隨著信息化進程越來越快,信用只會越來越重要。從現在開始,我們除了賺錢養家外,還有一項重要的任務就是維護自己的信用。

信用評分卡是一個通過個人數據設法對其還款能力和還款意願進行定量評估的系統。在消費金融行業,信用評分卡主要有三種(A卡、B卡、C卡):

  • A卡:申請評分卡,側重貸前,
    在客戶獲取期,建立信用風險評分,預測客戶帶來違約風險的概率大小;
  • B卡:行為評分卡,側重貸中,在客戶申請處理期,建立申請風險評分模型,預測客戶開戶後一定時期內違約拖欠的風險概率,有效排除了信用不良客戶和非目標客戶的申請;
  • C卡:催收評分卡,側重貸後,在帳戶管理期,建立催收評分模型,對逾期帳戶預測催收策略反應的概率,從而采取相應的催收措施。

簡單來講,評分卡用信用分數來預測客戶的好壞,當判定你是一個“好人”時,你就可以享受銀行或者金融公司的信用卡服務或者消費貸服務。另外B卡和C卡涉及到很多業務數據,所以本文主要介紹的是A卡。

一套完整的評分卡系統分為如下幾個過程:

技術分享圖片

可以看到一共有六大模塊,作為評分卡的第一篇文章,我將簡單介紹一下每個模塊的內容和作用,後續將詳細介紹其中的三個模塊。

1. 數據檢驗和整理

數據檢驗是對數據的有效性進行檢驗,比如沒有150歲的人,或者沒有21歲就已持有銀行賬戶超過30歲的人。發現有特殊情況的,用特殊代碼如9999標記,但它不應該被簡單理解。如果存在缺失數據,規範做法是把它們作為缺失值進行編碼,而不是試圖估算填入一個實值。雖然這裏只用了幾句話來講數據檢驗,但這其實可能是建立評分卡最耗時的步驟。

2. 樣本細分

開始建立評分系統後,首先是決定是否要細分總體並為每部分建立不同的評分卡。例如為25歲以下和25歲以上的人各建立一個評分卡,或者為特殊行業的人建立一個評分卡。建立多個評分卡會帶來大量額外的工作,所以只在改進預測效果時使用。

樣本細分(segamentation)的理由有如下幾個:

  • 細分後不同部分的可得信息存在差異
  • 某個特征與其他特征相互關聯
  • 細分方法與貸款機構的經營策略相符

不同細分部分之間的信息差異可能是由可得數據的多少引起的。例如年輕人的數據通常有限,相對年長的人,他們的數據只是一份很“薄”的文檔。

如果存在高度相關但又有很強預測能力的幾個特征變量時,我們可能會向導將這些特征分開單獨使用。這能避免同一評分卡的預測變量相互影響。不過這在實踐當中並不多見,通常相關度也沒有大到必須要去處理它。

銀行也因為要對不同的人采用不同的策略而決定細分樣本。比如,相較與低收入人群或者老年人,銀行可能對高收入人群或年輕人更主動。建立不同的評分卡並設定合格臨界線,會使得交叉銷售和追加銷售的促銷政策實施起來都更加容易。

3. 特征工程

穩健的評分卡通常有10~20個特征變量,而可用的特征遠遠多於這個數量。為了評分卡的泛化性能和穩健性,我們要剔除變量並且對已有變量進行一些處理。特征工程的主要任務是變量衍生、變量剔除和特征處理和編碼。

有一些變量單獨使用時可能沒有具體的含義,如借款天數,需要進行衍生。

有一些變量區分好壞借款人的能力偏小,跟因變量幾乎無關系。還有一些變量與其他確定要使用的變量高度相關甚至存在共線性。還有一些變量在時間上不穩定,很難用於預測。要分析前兩個狀況,我們可以用卡方和信息量計算特征對因變量的貢獻。也可以用逐步回歸來確定那些重要的變量。還可以利用正則化(例如嶺回歸、LASSO回歸等)來檢測共線性,且使得特征的系數稀疏化。

最初的數據中,特征的類型往往是多樣性的,有連續的數值變量(如貸款金額),有無序的分類變量(如性別),也有有序的分類變量(如年齡段),還有還款日期等時間格式的變量、評價等文本型的變量等等。

對於分類變量,類別數目不能過多,要保證每類中含有總體一定百分比(至少5%)的樣本數量,這能避免計算屬性集分數時過大的樣本方差,通過粗分類減少類別數量能提高系統的穩健性。粗分類既是一門科學也是一門藝術,對序數變量來說要盡量保證每類中包含事實上相鄰的屬性。另外,就算類別數量合適,對於部分算法(如邏輯回歸、GBDT等)來說,還是不夠。我們要對這些變量進行編碼,常用的有啞變量(dumpy)方法和WOE編碼,前者將學歷變量(高中及以下、本科、碩士及以上)轉換成2(為避免共線性,所以只有2個)個變量:是否是高中及以下、是否是本科。後者通過計算每一個類別對因變量的WOE(證據權重)來重編碼。

對於連續數值變量,我們也可以將它離散化,也可以成為特征分箱。離散化的方法也有很多種,如等分、等頻、卡方分箱等。

4. 訓練測試集拆分

這個沒啥好講的,因為評分系統考慮的是其泛化性能,所以要留出一部分數據來評估。如果數據充足,我們傾向於分出20%~30%的樣本作為測試集。當然也不是所有情況都得拆分,例如隨機森林。

5.模型訓練

邏輯回歸是最經典的建立評分卡的方法,其最強大的理論優勢在於它直接給出了可加的對數比率分數,結果可以快速轉化成信用分數。不過邏輯回歸的缺點是準確率不足夠高,有時候我們也會用集成學習的方法、如GBDT、XGBoost等。這裏就不進一步展開各個算法的理論和優劣啦

6. 模型評估

當一個評分卡已經構建完成,並且有一組個人分數和其對應的好壞狀態的數據時,我們想知道所構建的評分卡是否可靠?可靠程度如何?而這取決於如何去定義這個“好”字。我們至少有三種角度可以來評估:

  • 評分卡分類劃分的準確程度,如錯誤率、準確率、召回率、F1
  • 評分卡的判別能力,評估評分卡將好人和壞人分離開的程度,如KS統計量、ROC曲線、GINI系數
  • 評分卡概率預測的校準精度

模型訓練好後,一般有兩種輸出值,一種是預測的類別(好人/壞人、0/1),一種是預測的概率,如該樣本被判別為壞人的概率值。當然後者可以通過設置閾值轉化成前者。

如果已經有了預測類別,那我們可以構建混淆矩陣,然後便可以方便的計算準確率、召回率、F1分數等

實際壞人 實際好人
預測壞人 TP(真正例) FP(假反例)
預測好人 FN(假正例) TN(真反例)

如果有預測概率,其實際上給的是好人的概率分布和壞人的概率分布。常用的有ROC曲線、KS距離和KL距離

one more thing

本文的最後,我們先來簡單看看LendingClub的數據,這裏就可以用到reportgen的新功能。之前我們要簡單了解一份數據,需要針對每個變量或者每一種類型的變量單獨畫圖。這裏我們將這件事封裝成了一個函數,並導出為PPTX,這樣便於我們在建模過程中反查看數據

我選用的是2016年Q4的數據,原始數共103546條,145個變量。數據獲取(含2016Q4、2017Q1、2017Q2、2017Q3、LCDataDictionary)可以關註公眾號並回復:?數據集 ? 下載

import pandas as pd
import reportgen as rpt

# 字段的中文對照表,暫時只翻譯了一部分
datadict=pd.read_excel(‘.\\LendingClubData\\LCDataDictionary.xlsx‘)
columnnew=dict(zip(datadict.loc[datadict[‘中文名稱‘].notnull(),‘LoanStatNew‘],datadict.loc[datadict[‘中文名稱‘].notnull(),‘中文名稱‘]))
data=pd.read_csv(‘.\\LendingClubData\\LoanStats_2016Q4.csv‘,skiprows=1)
data=data.rename(columns=columnnew)

# 去除缺失率大於80%的字段
missing_pct=data.apply(lambda x : (len(x)-x.count())/len(x))
data=data.loc[:,missing_pct[missing_pct<0.80].index]

rpt.AnalysisReport(data,‘LendingClub數據概覽‘);

生成的ppt如下:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

參考文獻

[1]. 消費信用模型:定價、利潤與組合

[2]. 利用LendingClub數據建模(網址:https://zhuanlan.zhihu.com/p/21550547 )

本系列文章

評分卡文章系列:

1、評分卡系列(一):講講評分系統的構建

2、評分卡系列(二):特征工程


個人公眾號,文章首發與此,轉載請聲明

技術分享圖片

評分卡系列(一):講講評分系統的構建