? ? ? ?
今天老師帶著我們花了整整一天時間針對一份汽車貸款違約數據進行了一次信用風險建模。整個建模過程是在R語言上做的。現在我把今天學到的東西整體羅列一下。
? ? ? ?首先,向R中導入數據,通過setwd()創造導入途徑,然后用read.csv()對數據進行讀取。這里需要讀取兩份文件:一份是接受客戶貸款的的數據A,另一份是在客戶申請時被拒絕的客戶數據B。這樣做的目的是后期合并成一張數據,以保證最后的建模合理性。
? ? ? 接下來需要把數據集A中的解釋變量(自變量)和被解釋變量(因變量y)分開,目的為了做拒絕推斷。做法是由于自變量眾多,一般選取客戶近期的交易數據作為解釋變量,比如客戶的五年內信用不良事件數量,FICO打分,可循環貸款賬戶數量等。解釋變量就是是否違約。可通過篩選子集的方式,對數據集A和B建立解釋變量數據集Ax和Bx。
2.對數據集Ax和Bx進行數據清洗和數據標準化。
? ? ? ?首先對數據中的缺失值進行處理。第一步,下載dfexplore安裝包,通過dfplot()來檢查兩個數據集缺失值情況。圖中紅線即為缺失值。
然后創建一個函數用來求解缺失比例和缺失個數。函數如下:
NA-detect=function(data){
? ? ? res=cbind(sapply(data,function(x) sum(is.na(x)))),sapply(data,function(x) sum(is.na(x))/length(x))
colnames(res)=c(‘NA-number’,‘NA-proportion’)
return(res)}
通過NA-detect()查看缺失比例和缺失個數。
由于x變量均為連續變量,可用均值和中位數對數據進行填充。代碼如下:
? ? ?Ax[is.na(Ax$tot_derog),‘tot_derog’]=meadian(Ax$tot_derog,na.rm=T)
其它解釋變量填充一樣。當填充完畢后,需重新運行NA_detect(),檢查缺失值是否填充完畢。
其次,對數據集異常值也要進行處理。處理思想是把每個解釋變量按照從大到小進行排列然后把變量的最小和最大的1%的數據賦予新值(新值即是臨界點值)。方法是先建立一個函數:
outlier=function(var){
var[var<quantile(var,0.01)]=quantile(var,0.01)
var[var>quantile(var,0.99)]=quantile(var,0.99)
print(‘ok’)
return(var)}
然后應用for循環對Ax和Bx進行賦值。
最后對數據進行標準化,可以采用中心標準化和極差標準化兩種方式。
極差標準化算法較簡單易理解一點。代碼如下:
normalize=function(x){
? ?return((x-min(x))/(max(x)-min(x)))}
Ax=as.data.frame(sapply(Ax,normalize))
Bx=as.data.frame(sapply(Bx,normalize))
3.開始建模并預測。
第一步,合并解釋變量Ax與被解釋變量Y可通過cbind.data.frame()實現
orgin=cbind.data.frame(Ax,bad_ind)
通過Y變量與數據進行排序。
第二步,對數據集orgin進行數據分區,可采用隨機抽樣和分層抽樣兩種方式,這里介紹分層抽樣。需要先下載一個包sampling,然后調用strata分層抽樣函數對數據集orgin進行抽樣。抽樣的目的是得到訓練集合測試集。
分層抽樣代碼:
select=strata(orgin,stratanames=‘bad_ind’,size=table(orgin$bad_ind)*0.6),method=‘srswor’)$ID_unit
然后選子集得到訓練集被解釋變量train_y和解釋變量train,以及測試被解釋變量test_y和解釋變量test。
第三步,調優
調優的目的是讓預測模型盡可能準確。主要思想是通過KNN算法通過訓練集對測試集進行預測,然后拿測試數據預測得到的被解釋變量和測試數據真實被解釋變量做列聯表,有由于本次測試是風險評估,所以看各k值下不同的覆蓋率,得到最大覆蓋率所對應的k值等于1。
然后通過得到的k值,再次通過KNN算法對Bx數據進行預測。得到B預測值并合并到B表中。然后通過A數據集中bad_ind內數據求比值(得到比例為3.88,表示不違約客戶是違約客戶的3.88倍)。對B數據通過分層抽樣獲得相同比例的抽取。所獲得的數據集為C,然后刪除C數據集中和A不同的變量,對A和C進行合并。就得到一個既包括被接受樣本又包括被拒絕樣本的是否違約的數據集data了。
以上過程只是先找到合適的數據集進行建模。
接下來便開始進行建模。
第一步,違約推斷
將數據集data中分類變量轉換成因子。先找到data中分類變量,然后通過factor()轉換。
第二步,對數據集自變量進行粗略篩選。由于原始變量太多,因此在前期需要將不重要的變量進行踢出。
這里可先下載一個party的安裝包,調用隨機森林算法進行粗篩。方法是先調用cforest函數對原始數據進行隨機森林運算。然后通過varimp()計算各變量的差異重要性,并進行排序,可用過畫圖barplot觀察各個變量的差異重要性。最后根據業務經驗篩選出前()%的變量。我這里是60%。當然也可以通過IV算法,確定變量個數。
第三步,對變量進行細篩。所用方法是IV算法。大概意思是對每一個變量算出違約與不違約人數占樣本總數概率p1和p2,然后(p2-p1)*ln(p2/p1)求出每個變量的差異值。并根據差異值大小進行排序,差異值越大,對預測目標變量越有顯著意義。(哦,忘了,還需要對缺失值和異常值處理,這里就不多說了)
第四步,對數據data進行分區。即抽樣獲得訓練樣本和測試樣本。可通過sample()或者strata()獲得比例還是6:4最好。
第五步,對剩下的變量中連續變量進行分箱處理。可用woe分箱轉換。此算法主要為后期的打分做準備。可調用woe.replace()對訓練集進行分箱轉換。得到兩個新的轉換后數據集train_woe和test_woe.
第六步,建模。通過邏輯回歸進行建模。可調用用lm()函數。
模型評估有以下幾種可供參考:ROC模型,洛倫茲模型,累積提升度,K-S統計量等方法。
好了,先這樣,如有錯誤,請大家多多指正。