在不久前,小編曾經寫過一篇基於真實數據的申請評分卡,今天小編給大家帶來的是行為評分卡。

先給大家簡單介紹下行為評分卡與申請評分卡的區別:

申請評分卡:用於貸前,即客戶申請的時候,給客戶信用評級使用,所使用的欄位維度大多數為客戶基本申請信息,如年齡,學歷,收入等跟第三方數據源能獲取到的貸前信息,如通話詳單,多頭借貸,收支等等,第三方數據比較多,小編就不一一介紹,申請評分卡在建模要求上也比行為評分卡嚴格很多,最重要的要求就是模型的穩定性。

行為評分卡:用於貸後管理,大多數公司用於預測申請後的客戶是否會變為M3欺詐客戶(M3指的是逾期90天以上),也有不少公司用於復貸客群。所利用到的數據通常是貸後行為,如還款行為,消費行為,貸後的多頭借貸行為等等。行為評分卡在建模過程中與申請評分卡沒有多大區別,唯一的不同點就是所截取的欄位維度不同,好了,言歸正傳。

小編現在使用的是類似銀行數據,該數據欄位比較少,僅有客戶還款行為,月消費行為,以及逾期狀態信息,今天的代碼演示不會跟申請評分卡那麼詳細,有興趣的小夥伴,可以查看《基於工業數據申請評分卡》。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib
from sklearn.model_selection import GridSearchCV
from sklearn.cross_validation import train_test_split,cross_val_score
from sklearn.metrics import confusion_matrix
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score,accuracy_score
from sklearn.model_selection import StratifiedKFold,KFold,StratifiedShuffleSplit
from sklearn.tree import _tree
from sklearn import tree
import warnings
matplotlib.use(qt4agg)
matplotlib.rcParams[font.sans-serif] = [SimHei]
matplotlib.rcParams[font.family]=sans-serif
matplotlib.rcParams[axes.unicode_minus] = False
pd.set_option(display.max_rows, 100)
pd.set_option(display.max_columns, 10000)
%matplotlib inline
warnings.filterwarnings("ignore")

def readfile(isdf):
if isdf:
df=pd.read_csv("D:/data/behavioural data.csv")
return df
trainData=readfile(isdf=True)

我們先來看下有些什麼欄位維度吧。

該數據全部為數值型變數,那是因為小編在這裡做過數據處理,為了更全面給大家介紹,小編後面會把部分變數作為分類型變數處理演示。

Features_number=value_count(train)
categoricalFeatures=Features_number[Features_number["vary_num"]<5]["name"].tolist()
numericalFeatures=Features_number[Features_number["vary_num"]>=5]["name"].tolist()

我們姑且把分組小於5的變數作為分類變數處理,以下為分類變數(無視label)

我們要先查看分類變數的好壞分布是否單調

發現分布不單調的變數有三個,這時候我們就要對三個變數做數據以及業務上的邏輯分析

def check_monotonous(train,var):
a=train.groupby([var])[label].mean().reset_index()
b=train.groupby([var])[label].count().reset_index()
c=pd.merge(a,b,on=var,suffixes=("_rate","_counts"))
return c

我們發現M2FreqL3M即過去三個月內 M2的次數,單從badrate上來講,3次的概率竟然小於2次跟1次的概率,顯然不符合常理,然後我們看見分組3隻有3個客戶,分組2也只有74個客戶,這樣的分組不代表普遍性,故我們需要重新分組把分類2,3全部合併到1裡面去。

其他的變數也是要同樣的人工合併,使之單調。

分箱要求除了單調外,我們的最小箱佔比也是要大於5%

def check_proportion(train,var):
a=train.groupby([var])["label"].count().reset_index()
a["proportion"]=train.groupby([var])["label"].count()/train.shape[0]
return a

small_bin_var=[]
for i in categoricalFeatures:
b=check_proportion(train,i)
if b["proportion"].min()<0.05:
small_bin_var.append(i)

我們來看看有多少分類變數最小分組小於0.05

部分變數分組佔比均小於0.05,需要對其合併,原則上是相鄰兩組合併,若合併後仍不滿足5%原則,需要繼續合併,合併過程小編就不在這裡演示了,小編在合併過程中發現有幾組變數最後合併僅剩兩組,仍不滿足5%原則,如下圖:

這樣的數據,就必須捨棄。

allFeatures.remove("M2FreqL1M")
allFeatures.remove("M2FreqL3M")
allFeatures.remove("M2FreqL6M")

說完分類變數,我們再來說一說數值型變數,連續性變數在做評分卡的時候通常是需要分組。為演示方便,小編直接用qcut等頻分箱處理,分組完畢後,依舊需要對數據重複分箱,確定單調性。

剩下的事情,就跟小編《申請評分卡》步驟基本一致,確定WOE編碼,查看IV。

我們發現,該數據有很多IV大於0.5。這其實是必然的,客戶變為壞,與他逾期與否,逾期幾次,有著很強的關係。即使是行為評分卡,小編也不建議大家將IV大於0.5的變數丟入模型。我們需要丟掉「超強變數」,「」超強變數「」一般是用作規則。

def get_lower_iv(df,var,IV_dict,target):
high_IV = {k : v for k, v in IV_dict.items() if 0.02<=v<0.5}
high_IV_sorted = sorted(high_IV.items(), key=lambda x : x[1], reverse=True)
short_list = high_IV.keys()
short_list_2 = []

for var in short_list:
newVar = var + WOE
df[newVar] = df[var].map(WOE_dict[var])
short_list_2.append(newVar)
dfWOE = df[short_list_2]
dfnew=pd.concat([dfWOE,df[[target]]],axis=1)
return dfnew,high_IV_sorted

通過get_lower_iv函數丟掉「超強變數」:

同樣我們需要對變數做相關性分析,VIF方差膨脹因子分析,去到高度共線的變數,小編在這裡把相關性大於0.7的去掉,檢測最大VIF,最大為3.06,不存在嚴重共線性

X=train_WOE.drop("label",axis=1)
y=train_WOE["label"]
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
X_train[intercept] = [1] * X_train.shape[0]
X_test[intercept] = [1] * X_test.shape[0]

數據切分,確定截距項

import statsmodels.api as sm
LR = sm.Logit(y_train,X_train ).fit()
pred=LR.predict(X_test)

我們來看看變數係數

發現還是有不少變數是為正數的,那是因為變數間依舊存在共線性,一般這種處理方式有兩種,1,直接刪除係數為正的變數 2,利用特徵篩選,並按照特徵重要性依次加變數,再次訓練,直到整個模型變數係數第一次出現正數為止。

KS曲線:

ROC曲線:

客群分布:

概率轉為評分卡刻度見《基於工業數據申請評分卡

整體上效果還是比較明顯。

小編有話說

覺得此文好看,可以點擊右下角「好看」;覺得此文分享到朋友圈拉風,可以多分享到朋友圈讓更多人看到。

後台回復【B卡】即可獲取數據


推薦閱讀:
相关文章