1. 程式人生 > >評分卡模型開發--WOE值計算

評分卡模型開發--WOE值計算

轉自:https://cloud.tencent.com/developer/article/1016331

對入模的定量和定性指標,分別進行連續變數分段(對定量指標進行分段),以便於計算定量指標的WOE和對離散變數進行必要的降維。對連續變數的分段方法通常分為等距分段和最優分段兩種方法。等距分段是指將連續變數分為等距離的若干區間,然後在分別計算每個區間的WOE值。最優分段是指根據變數的分佈屬性,並結合該變數對違約狀態變數預測能力的變化,按照一定的規則將屬性接近的數值聚在一起,形成距離不相等的若干區間,最終得到對違約狀態變數預測能力最強的最優分段。 我們首先選擇對連續變數進行最優分段,在連續變數的分佈不滿足最優分段的要求時,在考慮對連續變數進行等距分段。此處,我們講述的連續變數最優分段演算法是基於條件推理樹(conditional inference trees, Ctree)的遞迴分割演算法,其基本原理是根據自變數的連續分佈與因變數的二元分佈之間的關係,採用遞迴的迴歸分析方法,逐層遞迴滿足給定的顯著性水平,此時獲取的分段結果(位於Ctree的葉節點上)即為連續變數的最優分段。其核心演算法用函式ctree()表示。 根據表3.13所示的定量入模指標,我們採用上述最優分段演算法,得到的最優分段結果分別如下。 對變數“duration”進行最優分段:

#對duration進行最優分段
library(smbinning)
result<-smbinning(df=data,y="credit_risk",x="duration",p=0.05)
result$ivtable

變數“duration”的最優分段結果,如表3.14所示

#對amount進行最優分段
result<-smbinning(df=data,y="credit_risk",x="amount")
result$ivtable

#對變數age進行最優分段
result<-smbinning(df=data,y="credit_risk",x="age")
result$ivtable

由於變數“installment_rate”的取值只有四個值,不適用於最優分段演算法,只能採用等距分段,等距分段結果如表3.17 所示:

#對變數“installment_rate"的等距分段
install_data<-data[,c("installment_rate","credit_risk")]
tb1<-table(install_data)
total<-list()
for(i in 1:nrow(tb1))
{
  total[i]<-sum(tb1[i,])
}
t.tb1<-cbind(tb1,total)
goodrate<-as.numeric(t.tb1[,"0"])/as.numeric(t.tb1[,"total"])
badrate<-as.numeric(t.tb1[,"1"])/as.numeric(t.tb1[,"total"])
gb.tbl<-cbind(t.tb1,goodrate,badrate)
Odds<-goodrate/badrate
LnOdds<-log(Odds)
tt.tb1<-cbind(gb.tbl,Odds,LnOdds)
WoE<-log((as.numeric(tt.tb1[,"0"])/700)/(as.numeric(tt.tb1[,"1"])/300))
all.tb1<-cbind(tt.tb1,WoE)
all.tb1

結束對連續變數的分段及其WOE值的計算,接下來我們需要對離散變數做必要的降維處理及其WOE值得計算。我們首先檢視下入模的定性指標的概況,如表3.18所示,程式碼如下:

discrete_data<-data[,c("status","credit_history","savings","purpose",
                       "property","credit_risk")]
summary(discrete_data)

由表3.18所示的入模定性指標的概況可知,定性指標“status” “credit_history”“savings”和“property”的維數最高為5維,最低為4維,而定性指標“purpose”的維數為10維,跟其他定性指標相比,明顯高出很多。此時,通常會造成“維數災難”,需要降維處理。在評級模型開發中的降維處理方法,通常是將屬性相似的合併處理,以達到降維的目的。

#對purpose指標進行降維
x<-discrete_data[,c("purpose","credit_risk")]
d<-as.matrix(x)
for(i in 1:nrow(d))
{
  if(as.character(d[i,"purpose"])=="car (new)")
  {
    d[i,"purpose"]<-as.character("car(new/used)")
  }
  if(as.character(d[i,"purpose"])=="car (used)")
  {
    d[i,"purpose"]<-as.character("car(new/used)")
  }
  if(as.character(d[i,"purpose"])=="radio/television")
  {
    d[i,"purpose"]<-as.character("radio/television/furniture/equipment")
  }
  if(as.character(d[i,"purpose"])=="furniture/equipment")
  {
    d[i,"purpose"]<-as.character("radio/television/furniture/equipment")
  }
  if(as.character(d[i,"purpose"])=="others")
  {
    d[i,"purpose"]<-as.character("others/repairs/business")
  }
  if(as.character(d[i,"purpose"])=="repairs")
  {
    d[i,"purpose"]<-as.character("others/repairs/business")
  }
  if(as.character(d[i,"purpose"])=="business")
  {
    d[i,"purpose"]<-as.character("others/repairs/business")
  }
  if(as.character(d[i,"purpose"])=="retraining")
  {
    d[i,"purpose"]<-as.character("retraining/education")
  }
  if(as.character(d[i,"purpose"])=="education")
  {
    d[i,"purpose"]<-as.character("retraining/education")
  }
}

new_data<-cbind(discrete_data[,c(-4,-6)],d)
woemodel<-woe(credit_risk~.,data = new_data,zeroadj=0.5,applyontrain=TRUE)
woemodel$woe

至此,整個模型開發過程中第四步的工作,我們已經基本完成了。可見,該步驟在整個模型開發過程中佔據非常重要的位置,定量和定性入模指標的篩選及其WOE值的計算,都會對整個信用風險評分卡產生重要的影響。在模型開發的第五步,我們將使用入模定量指標和入模定性指標的WOE值進行邏輯迴歸,並詳細講述生成信用風險評級模型標準評分卡的過程。