從0到1建立一張評分卡之模型建立

  評分卡建模常用邏輯迴歸模型,將邏輯迴歸輸出的概率值映射成分數,最後得到標準評分卡。關於評分卡映射的邏輯,可以看之前的文章邏輯迴歸評分卡映射邏輯
  下面接着分箱之後的數據開始建模。首先將每個變量分箱的結果進行轉換,得到每個變量對應的woe結果表。

# 變量woe結果表
def woe_df_concat(bin_df):
    """
    bin_df:list形式,裏面存儲每個變量的分箱結果
    
    return :woe結果表
    """
    woe_df_list =[]
    for df in bin_df:
        woe_df = df.reset_index().assign(col=df.index.name).rename(columns={df.index.name:'bin'})
        woe_df_list.append(woe_df)
    woe_result = pd.concat(woe_df_list,axis=0)
    # 爲了便於查看,將字段名列移到第一列的位置上
    woe_result1 = woe_result['col']
    woe_result2 = woe_result.iloc[:,:-1]
    woe_result_df = pd.concat([woe_result1,woe_result2],axis=1)
    woe_result_df = woe_result_df.reset_index(drop=True)
    return woe_result_df
df_woe_cat=woe_df_concat(bin_df_cat)
df_woe_num=woe_df_concat(bin_df_num)
df_woe=pd.concat([df_woe_cat,df_woe_num],axis=0)

  這一步的目的是將變量分箱之後的結果進行整理彙總,看一下變量分箱之後的大致情況。

  整理之後可以看到每個變量的分箱情況、每一箱的好壞佔比、WOE、IV值。注意,最好每一箱的WOE值不要超過1。附上檢驗WOE值是否大於1的代碼。

# 檢查某個區間的woe是否大於1
def woe_large(bin_df):
    """
    bin_df:list形式,裏面存儲每個變量的分箱結果
    
    return:
    woe_large_col: 某個區間woe大於1的變量,list集合
    woe_judge_df :df形式,每個變量的檢驗結果
    """
    woe_large_col=[]
    col_list =[]
    woe_judge =[]
    for woe_df in bin_df:
        col_name = woe_df.index.name
        woe_list = list(woe_df.woe)
        woe_large = list(filter(lambda x:x>=1,woe_list))
        if len(woe_large)>0:
            col_list.append(col_name)
            woe_judge.append('True')
            woe_large_col.append(col_name)
        else:
            col_list.append(col_name)
            woe_judge.append('False')
    woe_judge_df = pd.DataFrame({'col':col_list,
                                 'judge_large':woe_judge})
    return woe_large_col,woe_judge_df

  接着就是將變量的值映射爲變量的WOE值準備入模。

# woe轉換
def woe_transform(df,target,df_woe):
    """
    df:數據集
    target:目標變量的字段名
    df_woe:woe結果表
    
    return:woe轉化之後的數據集
    """
    df2 = df.copy()
    for col in df2.drop([target],axis=1).columns:
        x = df2[col]
        bin_map = df_woe[df_woe.col==col]
        bin_res = np.array([0]*x.shape[0],dtype=float)
        for i in bin_map.index:
            lower = bin_map['min_bin'][i]
            upper = bin_map['max_bin'][i]
            if lower == upper:
                x1 = x[np.where(x == lower)[0]]
            else:
                x1 = x[np.where((x>=lower)&(x<=upper))[0]]
            mask = np.in1d(x,x1)
            bin_res[mask] = bin_map['woe'][i]
        bin_res = pd.Series(bin_res,index=x.index)
        bin_res.name = x.name
        df2[col] = bin_res
    return df2

  以上是轉化後的數據,所有變量的值都轉化成了對應的WOE值,後面就是進行建模。

feature_list=num_features+cat_features
x = df_train[feature_list]
y = df_train['y']

lr_model = LogisticRegression(C=0.1)
lr_model.fit(x,y)
df_train['prob'] = lr_model.predict_proba(x)[:,1]

  建模的代碼很簡單,以上幾行就完成邏輯迴歸建模的過程了。然後進行評分映射。以下代碼需要理解評分卡分數映射的邏輯。

# 評分卡刻度 
def cal_scale(score,odds,PDO,model):
    """
    odds:設定的壞好比
    score:在這個odds下的分數
    PDO: 好壞翻倍比
    model:邏輯迴歸模型
    
    return :A,B,base_score
    """
    B = PDO/np.log(2)
    A = score+B*np.log(odds)
    # base_score = A+B*model.intercept_[0]
    print('B: {:.2f}'.format(B))
    print('A: {:.2f}'.format(A))
    # print('基礎分爲:{:.2f}'.format(base_score))
    return A,B
cal_scale(50,0.05,10,lr_model)

  假定在5%的好壞比之下的分值爲50分,PDO爲10分,計算A和B兩個參數。A爲14.43,B爲6.78。

def Prob2Score(prob, A,B):
    #將概率轉化成分數且爲正整數
    y = np.log(prob/(1-prob))
    return float(A-B*y)
df_train['score'] = df_train['prob'].map(lambda x:Prob2Score(x,6.78,14.43))

  分數的計算公式即A-B*log(odds)。到此評分卡就建立完成了,後續還需要對模型進行評估、對評分卡的分數進行監控,在之前的文章中已經寫過。

  1. 風控模型評估
  2. 評分卡實現和評估

  評分卡系列是我自己從網上找的代碼和數據集,一點點實現了一遍,記錄一下自己學習的過程。後續會找一份機器學習模型的代碼練習。作爲初學者,本文理解尚有不到位之處,歡迎大家多多指正。量化成長軌跡,共同交流與成長。

【作者】:Labryant
【原創公衆號】:風控獵人
【簡介】:某創業公司策略分析師,積極上進,努力提升。乾坤未定,你我都是黑馬。
【轉載說明】:轉載請說明出處,謝謝合作!~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章