1. 程式人生 > >金融信貸風控(二)——資料預處理和特徵衍生

金融信貸風控(二)——資料預處理和特徵衍生

申請評分卡中的資料預處理和特徵衍生

構建信用風險型別的特徵

資料預處理

1、資料預處理
包括格式、缺失值的處理等。
缺失值包括如下幾種情況:

 1、完全隨機缺失
 2、隨機缺失
 3、完全非隨機缺失:與變數本身有關,比如富裕家庭不願意填收入

處理缺失值的方法:

1、補缺(平均值,眾數、中位數等)
2、作為一種狀態(一般為完全非隨機缺失)
3、刪除記錄或者變數。

2. 特徵構建:人工構建特徵或者學習特徵
常用的特徵衍生:

  計數:過去一年貸款的次數
  求和:過去一年內網店的消費總額
  比例:貸款申請額度和年收入的佔比
  時間差:第一次開戶距今時長
  波動率:過去3年內每份工作的時間的標準差

3. 特徵選擇:相關性、差異性、顯著性
4. 模型引數估計

特徵的分箱

分箱的定義
  • 將連續變數離散化
  • 將多狀態的離散變數合併成少狀態
分箱的意義
  • 穩定性:避免特徵無意義的波動帶來評分的波動
  • 健壯性:避免了極端值的影響
  • 可以將缺失值作為一個獨立的箱帶入模型
  • 將變數變換到相似的尺度上
  • 邏輯迴歸屬於廣義線性模型,表達能力受限;單變數離散化為N個後,每個變數有單獨的權重,相當於為模型引入了非線性,能夠提升模型表達能力,加大擬合
  • 離散特徵的增加和減少都很容易,易於模型的快速迭代
分箱的限制
  • 計算量大
  • 分箱後需要編碼

Best-KS

如何向門外漢講解KS值
評分卡模型的評價標準
KS=max(TPRFPR)KS=max(TPR-FPR)

這裡寫圖片描述
這裡寫圖片描述
在這裡插入圖片描述
這裡寫圖片描述

ChiMerge 卡方分箱法

卡方檢驗用於判別兩個變數之間是否有顯著的關聯關係,原假設為兩變數相互獨立,可參看卡方檢驗.

閱讀資料:
最優分箱–卡方分箱Chi-Merge
這裡寫圖片描述
這裡寫圖片描述
卡方統計量衡量了區間內樣本的頻數分佈與整體樣本的頻數分佈的差異性。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

#卡方分箱
import pandas as pd
import
numpy as np from scipy.stats import chi

WOE編碼

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
WOE表示的實際上是“當前分組中響應客戶佔所有響應客戶的比例”和“當前分組中沒有響應的客戶佔所有沒有響應的客戶的比例”的差異。可以直觀的認為woe蘊含了自變數取值對於目標變數(違約概率)的影響。

將上述公式做一些變換:
WOEi=log(Gi/BiGtotal/Btotal)WOE_i=log(\frac{G_i/B_i}{G_{total}/B_{total}})
WOE也可以這麼理解,他表示的是當前這個組中響應的客戶和未響應客戶的比值,和所有樣本中這個比值的差異。這個差異是用這兩個比值的比值,再取對數來表示的。WOE越大,這種差異越大,這個分組裡的樣本響應的可能性就越大,WOE越小,差異越小,這個分組裡的樣本響應的可能性就越小。

WOE編碼的意義

1、符號與好壞樣本的比例有關
2、要求迴歸係數為負(當好樣本佔比在分子上,壞樣本佔比在分母上時)

變數篩選

變數篩選的方法有:

  1. 帶約束:LASSO
  2. 特徵重要性:隨機森林
  3. 特徵資訊度:information value
  4. 模型擬合優度和複雜度:基於AIC的逐步迴歸

特徵資訊度

這裡寫圖片描述
這裡寫圖片描述
我們可以看到IV值其實是woe值加權求和。這個加權主要是消除掉各分組中數量差異帶來的誤差。
這裡寫圖片描述

def CalcWOE(df, col, target):
    '''
    :param df: 包含需要計算WOE的變數和目標變數
    :param col: 需要計算WOE、IV的變數,必須是分箱後的變數,或者不需要分箱的類別型變數
    :param target: 目標變數,0、1表示好、壞
    :return: 返回WOE和IV
    '''
    total = df.groupby([col])[target].count()
    total = pd.DataFrame({'total': total})
    bad = df.groupby([col])[target].sum()
    bad = pd.DataFrame({'bad': bad})
    regroup = total.merge(bad, left_index=True, right_index=True, how='left')
    regroup.reset_index(level=0, inplace=True)
    N = sum(regroup['total'])
    B = sum(regroup['bad'])
    regroup['good'] = regroup['total'] - regroup['bad']
    G = N - B
    regroup['bad_pcnt'] = regroup['bad'].map(lambda x: x*1.0/B)
    regroup['good_pcnt'] = regroup['good'].map(lambda x: x * 1.0 / G)
    regroup['WOE'] = regroup.apply(lambda x: np.log(x.good_pcnt*1.0/x.bad_pcnt),axis = 1)
    WOE_dict = regroup[[col,'WOE']].set_index(col).to_dict(orient='index')
    for k, v in WOE_dict.items():
        WOE_dict[k] = v['WOE']
    IV = regroup.apply(lambda x: (x.good_pcnt-x.bad_pcnt)*np.log(x.good_pcnt*1.0/x.bad_pcnt),axis = 1)
    IV = sum(IV)
    return {"WOE": WOE_dict, 'IV':IV}

單變數分析和多變數分析

單變數分析

這裡寫圖片描述

多變數分析

多重共線性
這裡寫圖片描述