本文基於Python軟件進行評分卡的制作及使用預測。主要包括確定觀察時間窗口、確定表現時間窗口、評分卡的制作、新數據的預測四大部分。內容涉及數據清洗、變量篩選、生成WOE 矩陣、IV值計算、ROC曲線、模型建立、模型評估預測等。
- 數據來源
本項目數據來源於kaggle競賽Give Me Some Credit。
- 流程如下
1.確定觀察時間窗口
- CID:用戶ID
- STAGE_BEF:本階段前的逾期階段
- STAGE_AFT:本階段進入的逾期階段
- CLOSE_DATE:本階段結束時間
1.1導包
1.2讀取數據及描述統計
根據描述結果可以看出最后一列即本階段結束時間最小值為0,且包含缺失值,故需要先處理缺失值再處理異常值0
1.3數據清洗
1.3.1去重
drop_duplicates是數據框去重的函數,可以根據指定的若干列(subset=)去重
1.3.2缺失值的處理
后4列缺失值比例相同約為0.08,若缺失值在同一行,則考慮刪除。所以驗證各列缺失值是否在同一行。
在同一行,刪除
1.3.3異常值的處理
replace:替換數據框中的指定值,輸入字典,鍵是被替換值,值是替換值
1.3.4生成衍生變量
從數據中的進入本階段時間和本階段結束時間(4,5列)抽取對應的月份信息 •從本階段進入的逾期階段(3列)中抽取逾期指標
1.4構建矩陣
這里的矩陣表示:
•相繼時間內逾期狀態的變化情況,相繼時間表示從一個月到下一個月
•每一行表示開始月份時的逾期狀態,每一列表示結束月份時的逾期狀態
•開始月份和結束月份是相繼的,即間隔一個月
1.4.1邏輯關系
1.每一行數據對應一個本階段的逾期狀態,對應兩個月份時間:進入本階段時間和本階段結束時間
- 可以將這兩個時間都理解為逾期狀態對應的時間,即逾期時間
- 生成逾期狀態數據框,每行對應三列:id,逾期狀態,逾期時間(包含進入本階段時間和本階段結束時間)
2.將逾期狀態數據框內轉置,生成時間數據框:行是id,列是逾期時間
- 轉置前事先對數據排序,去重,保留同ID,同時間下逾期狀態的最大值
3.使用時間數據框:由於列是已經排序的兩列,取前后相繼的兩列,即相繼的兩個月,統計逾期狀態變化的頻數,得到所有相繼兩列狀態變化的頻數
- 根據統計的頻數,構建矩陣,行表示相繼時間中開始時間對應的逾期狀態,列表示結束時間對應的逾期狀態
4使用得到的矩陣,生成新列:
- 每個狀態所有可能的變化,即行和
- 每個狀態所有不好的變化,即表示狀態的數字變大
- 每個狀態不好的變化的占比,即不好的變化除以所有可能的變化
1.4.2生成預期狀態數據框
1.4.3生成時間數據框
排序和去重:
- sort_values:依據值排序,缺失值默認在末尾.依據指定列進行排序,設置by=一列或多列(列表)列名即可
- drop_duplicates:根據若干列去重, 設置subset指定列,keep表示要保留的數據,可選"first","last",False(表示去掉所有重復的行)
- set_index:給出若干列,將列作為行索引(每行可以有多個索引)
- unstack:level=-1, fill_value=None, 第一個參數表示以哪列索引作為列, 默認最后一列, 相當於以選定的索引列作為列名, 其他作為行名
1.4.4生成矩陣
最終矩陣
繪圖觀察
- 可見M1是一個明顯的最低點和拐點,到M2階段以后壞客戶的比例迅速增加,因此這里選定的觀察時間窗口為M2,即30-60天,我們就可以定義逾期大於30天的客戶為壞客戶
- 可以根據業務需求進一步調整觀察時間窗口
2.確定表現時間窗口
使用用戶訂單時間表data/CreditFirstUse.csv:
- CID:用戶ID
- FST_USE_DT:用戶訂單時間
2.1數據讀取及描述
- 可見沒有缺失值,沒有重復訂單號
- 用戶訂單時間從2015年1月1日到2017年10月31日,初步判斷沒有異常值
2.2數據清洗
使用前面生成的時間數據框:
- 由於選取觀察時間窗口為M2,對於每個ID:
- 取逾期狀態大於等於2的首個月作為逾期月
- 逾期月表示客戶開始轉向壞客戶
- 使用逾期月生成新列
統計月份差異的頻數,並且排序
- 發現有的時間差是負的,把排序后前面負的時間差去掉
2.3定義y的總結
- 通過之前的數據篩選和匯總,我們定義觀察時間窗口為M2(30-60天),表現時間窗口為20
- 即對於所有客戶來說,我們認為在訂單生成20個月內
- 有M2以上的逾期,即逾期天數>=31天,為壞客戶
- 有M1以下的逾期,即逾期天數<=3天,為好客戶
- 中間狀態的樣本認為是不確定的不進入模型
3 . 評分卡制作
該數據是信貸數據,來自kaggle2011年的競賽數據:Give Me Some Credit,評判指標是AUC
- SeriousDlqin2yrs:出現90天或更長時間的逾期行為(即定義好壞客戶)
- RevolvingUtilizationOfUnsecuredLines:貸款以及信用卡可用額度與總額度比例
- age:借款人借款年齡
- NumberOfTime30-59DaysPastDueNotWorse:過去兩年內出現35-59天逾期但是沒有發展的更壞的次數
- DebtRatio:每月償還債務,贍養費,生活費用除以月總收入
- MonthlyIncome:月收入
- NumberOfOpenCreditLinesAndLoans:開放式貸款和信貸數量
- NumberOfTimes90DaysLate:借款者有90天或更高逾期的次數
- NumberRealEstateLoansOrLines:抵押貸款和房地產貸款數量,包括房屋凈值信貸額度
- NumberOfTime60-89DaysPastDueNotWorse:過去兩年內出現60-89天逾期但是沒有發展的更壞的次數
- NumberOfDependents:家庭中不包括自身的家屬人數(配偶,子女等)
3.1 讀取數據以及描述統計
修改列名:由於一些算法中,列名中的某些符號會帶來問題甚至報錯,例如這里的"-",會在回歸公式中被認為是減號,所以換成"_"
3.1.1去重
3.2缺失值處理
缺失值處理方法的選擇,主要依據是業務邏輯和缺失值占比,在對預測結果的影響盡可能小的情況下,對缺失值進行處理以滿足算法需求,所以要理解每個缺失值處理方法帶來的影響,下面的缺失值處理方法沒有特殊說明均是對特征(列)的處理:
- 占比較多:如80%以上:刪除缺失值所在的列
- 如果某些行缺失值占比較多,或者缺失值所在字段是苛刻的必須有值的,刪除行
- 占比一般:如30%-80%:將缺失值作為單獨的一個分類
- 如果特征是連續的,則其他已有值分箱
- 如果特征是分類的,考慮其他分類是否需要重分箱
- 占比少:10%-30%:多重插補:認為若干特征之間有相關性,則可以相互預測缺失值
- 需滿足的假設:MAR:Missing At Random:數據缺失的概率僅和已觀測的數據相關,即缺失的概率與未知的數據無關,即與變量的具體數值無關
- 迭代(循環)次數可能的話超過40,選擇所有的變量甚至額外的輔助變量
- 詳細的計算過程參考:Multiple Imputation by Chained Equations: What is it and how does it work?
- 占比較少:10%以下:單一值替換,如中位數,眾數
- 在決策樹中可以將缺失值處理融合到算法里:按比重分配
這里的占比並不是固定的,例如缺失值占比只有5%,仍可以用第二種方法,主要依據業務邏輯和算法需求
3.2.1查看缺失值分布情況
本數據的缺失值處理邏輯:
- 對於信用評分卡來說,由於所有變量都需要分箱,故這里缺失值作為單獨的箱子即可
- 對於最后一列NumberOfDependents,缺失值占比只有2.56%,作為單獨的箱子信息不夠,故做單一值填補,這列表示家庭人口數,有右偏的傾向,且屬於計數的數據,故使用中位數填補
- 這里沒必要進行多重插補,下面的多重插補只是為了讓讀者熟悉此操作
3.2.2多重差補
3.2.3單一值替換
3.3異常值處理
異常值常見的處理方法:
- 刪除所在的行
- 替換成缺失值,與缺失值一起處理
- 蓋帽法處理
結合業務邏輯和算法需求判斷是否需要處理異常值以及如何處理,一般情況下蓋帽法即可,即將極端異常的值改成不那么異常的極值,當然一些算法例如決策樹中連續變量的異常值也可以不做處理
3.3.1定義蓋帽法函數
互換y值(0,1互換)
3.4匯總清洗過程,生成函數
3.5 對每個x生成分箱對象
- 1.定義y的名字
- 2.初始化IV值對象
3.5.1 對“RevolvingUtilizationOfUnsecuredLines”分箱
保存IV值
對每個變量都進行上邊的步驟分箱
3.6查看所有IV值
IV(information Value):信息值,表示變量的重要性.
IV<0.02對預測幾乎沒用,應該刪除;0.02≤IV<0.1,有一定的幫助;0.1 ≤ IV < 0.3,對預測較重要;IV ≥ 0.3,對預測十分重要。
3.7 生成WOE數據
WOE(Weight of Evidence):證據權重,與違約比例同方向變動,可以看到不同分箱的重要性
之前smbin和smbin_cu得到的對象根據IV值篩選后,放在一個列表中
3.7.1使用smgen函數根據得到的列表生成新數據
3.7.2要求
- 抽取WOE列作為預測數據X
- 加常數項列
- 抽取響應列作為Y
3.8建模
建立邏輯回歸模型,擬合數據,查看回歸結果
可以看出NumberOfOpenCreditLinesAndLoans_woe不顯著,應該從模型中剔除
從3.7部分重新運行,模型回歸結果如下:
3.8.1查看多重共線性
根據VIF值判斷,大於10則存在多重共線性,顯然不存在。
3.9生成評分卡
- 根據邏輯回歸模型和之前篩選得到的列表,給定參數,生成評分卡
- 調整參數,使得評分卡分數范圍滿足需求
...
3.10模型評估
根據之前的分卡對象得到測試集分數
ROC曲線
由上圖可知AUC值0.86,說明該模型的擬合效果較好
4.新數據的預測
4.1讀取數據
4.2清洗數據
4.3生成WOE矩陣
抽取WOE數據生成預測用數據 •要加常數項列
4.4預測
4.4.1預測每一行數據是好客戶的概率
4.4.2預測每行數據的分數,生成總分數和每個特征的分數
4.5標簽
根據分數和訓練得到的閾值判斷客戶的好壞,好客戶是1,壞客戶是0
完結。