用戶貸款風險預測—特征提取


本次競賽提供的數據源一共有五個,依次做特征提取

一、信用卡賬單特征提取

1、基本思路:將數據分成時間已知時間未知兩部分,時間已知中再分成放款前的數據和放款后的數據,放款前放款后的再分成去重的數據和不去重數據,最終對數據做sum,count,mean,max,min,median,std等指標

#處理數據函數
def 信用卡賬單特征提取(data,feature,name):
    '''
    1、傳入的數據data
    2、用於合並輸出的feature
    3、用於更改命名的name
    '''
    columns_list = ['上期賬單金額','上期還款金額','信用卡額度','本期賬單余額','本期賬單最低還款額','消費筆數',
                    '本期賬單金額','調整金額','循環利息','可用余額','預借現金額度','還款狀態']
    for math_methor in ['sum','mean','max','count','min','std','var']:
        temp = data.groupby('用戶ID',as_index=False)[columns_list].agg(math_methor)
        temp.columns = ['用戶ID'] + [name + x + math_methor for x in temp.columns[1:]]
        feature = pd.merge(feature,temp,how='left')
    return feature

時間已知放款前未去重 = 訓練信用卡賬單表[訓練信用卡賬單表['時間']>0 & (訓練信用卡賬單表['時間'] <= 訓練信用卡賬單表['放款時間'])]
時間已知放款前已去重 = 訓練信用卡賬單表[訓練信用卡賬單表['時間']>0 & (訓練信用卡賬單表['時間'] <= 訓練信用卡賬單表['放款時間'])].groupby(['用戶ID','時間','銀行ID'],as_index = False).max()
時間已知放款后未去重 = 訓練信用卡賬單表[訓練信用卡賬單表['時間']>0 & (訓練信用卡賬單表['時間'] <  訓練信用卡賬單表['放款時間'])]
時間已知放款后已去重 = 訓練信用卡賬單表[訓練信用卡賬單表['時間']>0 & (訓練信用卡賬單表['時間'] <  訓練信用卡賬單表['放款時間'])].groupby(['用戶ID','時間','銀行ID'],as_index = False).max()
時間未知未去重 = 訓練信用卡賬單表[訓練信用卡賬單表['時間']==0]
時間未知已去重 = 訓練信用卡賬單表[訓練信用卡賬單表['時間']==0].groupby(['用戶ID','時間','銀行ID'],as_index = False).max()
所有數據未去重 = 訓練信用卡賬單表
所有數據已去重 = 訓練信用卡賬單表.groupby(['用戶ID','時間','銀行ID'],as_index = False).max()

feature = 訓練放款時間表
feature = 信用卡賬單特征提取(時間已知放款前未去重,feature,name = '時間已知放款前未去重')
feature = 信用卡賬單特征提取(時間已知放款前已去重,feature,name = '時間已知放款前已去重')
feature = 信用卡賬單特征提取(時間已知放款后未去重,feature,name = '時間已知放款后未去重')
feature = 信用卡賬單特征提取(時間已知放款后已去重,feature,name = '時間已知放款后已去重')
feature = 信用卡賬單特征提取(時間未知未去重,feature,name = '時間未知未去重')
feature = 信用卡賬單特征提取(時間未知已去重,feature,name = '時間未知已去重')
feature = 信用卡賬單特征提取(所有數據未去重,feature,name = '所有數據未去重')
feature = 信用卡賬單特征提取(所有數據已去重,feature,name = '所有數據已去重')

feature.to_csv('信用卡賬單特征1.csv')

通過上面的處理,一共得到了674個特征

2、統計上期賬單金額和上期還款金額的累計總額,和為零或者為負的個數

def 賬單還款金額(data,col,feature):
    temp = data.groupby('用戶ID',as_index = False)[col]
    x1 = temp.apply(lambda x : x.where(x<0).count())
    x2 = temp.apply(lambda x : x.where (x==0).count())
    x3 = temp.agg({col+'sum':np.sum})
    x3[col+'小於零'] = x1
    x3[col+'等於零'] = x2
    feature = pd.merge(feature,x3,how='left')
    return feature

feature1 = 訓練放款時間表
放款前數據 = 訓練信用卡賬單表[訓練信用卡賬單表['時間'] <= 訓練信用卡賬單表['放款時間']]
feature1 = 賬單還款金額(放款前數據,'上期賬單金額',feature1)
feature1 = 賬單還款金額(放款前數據,'上期還款金額',feature1)
feature1['放款前賬單差額'] =  feature1['上期賬單金額sum'] - feature1['上期還款金額sum']
feature1.shape

feature2 = 訓練放款時間表
放款后數據 = 訓練信用卡賬單表[訓練信用卡賬單表['時間'] >  訓練信用卡賬單表['放款時間']]
feature2 = 賬單還款金額(放款后數據,'上期賬單金額',feature2)
feature2 = 賬單還款金額(放款后數據,'上期還款金額',feature2)
feature2['放款前賬單差額'] =  feature2['上期賬單金額sum'] - feature2['上期還款金額sum']
feature2.shape

feature = pd.merge(feature1,feature2,on=['用戶ID','放款時間'],suffixes=('放款前','放款后'))
feature.head()

3、統計放款前放款后的賬單總額,最大值等信息

#刪除上期賬單和上期還款金額小於0的數據
d = 訓練信用卡賬單表
d1 = d[d['上期賬單金額']<=0].index.tolist()
d.drop(d1,axis=0,inplace=True)
d2 = d[d['上期還款金額']<=0].index.tolist()
d.drop(d2,axis=0,inplace=True)
d.shape

#放款前數據提取特征
data = d[d['時間'] <= d['放款時間']]
gb = data.groupby(['用戶ID','時間','銀行ID'],as_index=False)
x1 = gb['上期賬單金額'].agg({'放款前該銀行上期賬單金額總額':np.sum,'放款前該銀行上期賬單金額最大值':np.max})
x2 = gb['上期還款金額'].agg({'放款前該銀行上期還款金額總額':np.sum,'放款前該銀行上期還款金額最大值':np.max})
x3 = gb['循環利息'].agg({'放款前循環利息最大值':np.max})
x4 = gb['消費筆數'].agg({'放款前消費筆數最大值':np.max})

gb1 = x1.groupby('用戶ID',as_index=False)
gb2 = x2.groupby('用戶ID',as_index=False)
gb3 = x3.groupby('用戶ID',as_index=False)
gb4 = x4.groupby('用戶ID',as_index=False)

x11 = gb1['放款前該銀行上期賬單金額總額'].agg({'放款前該銀行上期賬單金額匯總':np.sum,'放款前該銀行上期賬單金額計數':np.size})
x12 = gb1['放款前該銀行上期賬單金額最大值'].agg({'放款前該銀行上期賬單金額最大值匯總':np.sum})

x21 = gb2['放款前該銀行上期還款金額總額'].agg({'放款前該銀行上期還款金額匯總':np.sum,'放款前該銀行上期還款金額計數':np.size})
x22 = gb2['放款前該銀行上期還款金額最大值'].agg({'放款前該銀行上期還款金額最大值匯總':np.sum})

x31 = gb3['放款前循環利息最大值'].agg({'放款前循環利息最大值匯總':np.sum})
x41 = gb4['放款前消費筆數最大值'].agg({'放款前消費筆數最大值匯總':np.sum})

feature = pd.merge(feature,x11,on='用戶ID',how='left')
feature = pd.merge(feature,x12,on='用戶ID',how='left')
feature = pd.merge(feature,x21,on='用戶ID',how='left')
feature = pd.merge(feature,x22,on='用戶ID',how='left')
feature = pd.merge(feature,x31,on='用戶ID',how='left')


#放款后數據提取特征
data = d[d['時間'] > d['放款時間']]
gb = data.groupby(['用戶ID','時間','銀行ID'],as_index=False)
x1 = gb['上期賬單金額'].agg({'放款后該銀行上期賬單金額總額':np.sum,'放款后該銀行上期賬單金額最大值':np.max})
x2 = gb['上期還款金額'].agg({'放款后該銀行上期還款金額總額':np.sum,'放款后該銀行上期還款金額最大值':np.max})
x3 = gb['循環利息'].agg({'放款后循環利息最大值':np.max})
x4 = gb['消費筆數'].agg({'放款后消費筆數最大值':np.max})

gb1 = x1.groupby('用戶ID',as_index=False)
gb2 = x2.groupby('用戶ID',as_index=False)
gb3 = x3.groupby('用戶ID',as_index=False)
gb4 = x4.groupby('用戶ID',as_index=False)

x11 = gb1['放款后該銀行上期賬單金額總額'].agg({'放款后該銀行上期賬單金額匯總':np.sum,'放款后該銀行上期賬單金額計數':np.size})
x12 = gb1['放款后該銀行上期賬單金額最大值'].agg({'放款后該銀行上期賬單金額最大值匯總':np.sum})

x21 = gb2['放款后該銀行上期還款金額總額'].agg({'放款后該銀行上期還款金額匯總':np.sum,'放款后該銀行上期還款金額計數':np.size})
x22 = gb2['放款后該銀行上期還款金額最大值'].agg({'放款后該銀行上期還款金額最大值匯總':np.sum})

x31 = gb3['放款后循環利息最大值'].agg({'放款后循環利息最大值匯總':np.sum})
x41 = gb4['放款后消費筆數最大值'].agg({'放款后消費筆數最大值匯總':np.sum})

feature = pd.merge(feature,x11,on='用戶ID',how='left')
feature = pd.merge(feature,x12,on='用戶ID',how='left')
feature = pd.merge(feature,x21,on='用戶ID',how='left')
feature = pd.merge(feature,x22,on='用戶ID',how='left')
feature = pd.merge(feature,x31,on='用戶ID',how='left')
feature = pd.merge(feature,x41,on='用戶ID',how='left')

 4、總體的爆卡次數和持卡數特征

#刷爆次數
d = 訓練信用卡賬單表
gb = d[d['信用卡額度']<d['本期賬單余額']].groupby('用戶ID',as_index=False)
x1 = gb['時間'].apply(lambda x : np.unique(x).size)
x2 = gb['時間'].agg({'爆卡次數':np.size})
x2['去重爆卡次數'] = x1
feature = pd.merge(feature,x2,on='用戶ID',how='left')
#銀行持卡數
gb = d.groupby('用戶ID',as_index=False)
x1 = gb['銀行ID'].apply(lambda x : np.unique(x).size)
x2 = gb['銀行ID'].agg({'持卡數':np.size})
x2['去重持卡數'] = x1
feature = pd.merge(feature,x2,on='用戶ID',how='left')

 

5、參考老段子特征

#參考老段子的特征
d=訓練信用卡賬單表

#老段子的特征...神了個奇
t1=d[(d['時間']>d['放款時間'])].groupby("用戶ID",as_index=False)
t2=d[(d['時間']>d['放款時間']+1)].groupby("用戶ID",as_index=False)
t3=d[(d['時間']>d['放款時間']+2)].groupby("用戶ID",as_index=False)

x=t1['時間'].apply(lambda x:np.unique(x).size)
x1=t1['時間'].agg({'老段子特征1' : 'count'})
x1['x1']=x

x=t2['時間'].apply(lambda x:np.unique(x).size)
x2=t2['時間'].agg({'老段子特征2' : 'count'})
x2['x2']=x

x=t3['時間'].apply(lambda x:np.unique(x).size)
x3=t3['時間'].agg({'老段子特征3' : 'count'})
x3['x3']=x

t=feature[['用戶ID']]
t=pd.merge(t,x1,how='left',on = "用戶ID")
t=pd.merge(t,x2,how='left',on = "用戶ID")
t=pd.merge(t,x3,how='left',on = "用戶ID")
t=t[['用戶ID','x1','x2','x3','老段子特征1','老段子特征2','老段子特征3']]

feature=pd.merge(feature, t,how='left', on = "用戶ID")

feature['老段子特征x']=(feature['x1']+1)*(feature['x2']+1)*(feature['x3']+1)

 

最后信用卡賬單的特征全部結束,一共輸出674+42個特征

 

二、銀行流水記錄特征提取

訓練銀行流水記錄表 = pd.read_csv('train/bank_detail_train.txt',names = ['用戶ID','時間戳','交易類型','交易金額','工資收入標記'])
訓練銀行流水記錄表['時間戳'] = 訓練銀行流水記錄表['時間戳']//86400
訓練放款時間表 = pd.read_csv('train/loan_time_train.txt',names=['用戶ID','放款時間'])
訓練放款時間表['放款時間'] = 訓練放款時間表['放款時間'] //86400
訓練放款時間表.head()
訓練銀行流水記錄表 = pd.merge(訓練銀行流水記錄表,訓練放款時間表,on='用戶ID')
訓練銀行流水記錄表.head()

#
feature = 訓練放款時間表
d = 訓練銀行流水記錄表
#==========================放款前==========================
gb1 = d[(d['時間戳'] <= d['放款時間']) &d['交易類型']==0].groupby('用戶ID',as_index=False)     #收入
gb2 = d[(d['時間戳'] <= d['放款時間']) &d['交易類型']==1].groupby('用戶ID',as_index=False)     #支出
gb3 = d[(d['時間戳'] <= d['放款時間']) &d['工資收入標記']==1].groupby('用戶ID',as_index=False)     #工資收入

x1 = gb1['交易金額'].agg({'放款前收入計數':np.size,'放款前收入總和':np.sum})
x2 = gb2['交易金額'].agg({'放款前支出計數':np.size,'放款前支出總和':np.sum})
x3 = gb3['交易金額'].agg({'放款前工資收入計數':np.size,'放款前工資收入求和':np.sum})

feature = pd.merge(feature,x1,on='用戶ID',how='left')
feature = pd.merge(feature,x2,on='用戶ID',how='left')
feature = pd.merge(feature,x3,on='用戶ID',how='left')

feature['放款前收入計數差值'] = feature['放款前收入計數'] - feature['放款前支出計數']
feature['放款前收入總數差值'] = feature['放款前收入總和'] - feature['放款前支出總和']
feature['放款前非工資收入計數差值'] = feature['放款前收入計數'] - feature['放款前工資收入計數']
feature['放款前非工資收入總數差值'] = feature['放款前收入總和'] - feature['放款前工資收入求和']
feature['放款前收入筆數乘以差值'] = feature['放款前收入計數'] * feature['放款前收入計數差值']
feature['放款前收入總數乘以差值'] = feature['放款前收入總和'] * feature['放款前收入總數差值']

#==========================放款后==========================
gb1 = d[(d['時間戳'] > d['放款時間']) &d['交易類型']==0].groupby('用戶ID',as_index=False)     #收入
gb2 = d[(d['時間戳'] > d['放款時間']) &d['交易類型']==1].groupby('用戶ID',as_index=False)     #支出
gb3 = d[(d['時間戳'] > d['放款時間']) &d['工資收入標記']==1].groupby('用戶ID',as_index=False)     #工資收入

x1 = gb1['交易金額'].agg({'放款后收入計數':np.size,'放款后收入總和':np.sum})
x2 = gb2['交易金額'].agg({'放款后支出計數':np.size,'放款后支出總和':np.sum})
x3 = gb3['交易金額'].agg({'放款后工資收入計數':np.size,'放款后工資收入求和':np.sum})

feature = pd.merge(feature,x1,on='用戶ID',how='left')
feature = pd.merge(feature,x2,on='用戶ID',how='left')
feature = pd.merge(feature,x3,on='用戶ID',how='left')

feature['放款后收入計數差值'] = feature['放款后收入計數'] - feature['放款后支出計數']
feature['放款后收入總數差值'] = feature['放款后收入總和'] - feature['放款后支出總和']
feature['放款后非工資收入計數差值'] = feature['放款后收入計數'] - feature['放款后工資收入計數']
feature['放款后非工資收入總數差值'] = feature['放款后收入總和'] - feature['放款后工資收入求和']
feature['放款后收入筆數乘以差值'] = feature['放款后收入計數'] * feature['放款后收入計數差值']
feature['放款后收入總數乘以差值'] = feature['放款后收入總和'] * feature['放款后收入總數差值']

 一共輸出26個特征

 

三、用戶瀏覽行為

用戶瀏覽行為表 = pd.read_csv('train/browse_history_train.txt',names=['用戶ID','時間','瀏覽行為','瀏覽子行為'])
用戶瀏覽行為表['時間'] = 用戶瀏覽行為表['時間']//86400
用戶瀏覽行為表.head()
訓練放款時間表 = pd.read_csv('train/loan_time_train.txt',names=['用戶ID','放款時間'])
訓練放款時間表['放款時間'] = 訓練放款時間表['放款時間'] //86400
訓練放款時間表.head()
用戶瀏覽行為表 = pd.merge(用戶瀏覽行為表,訓練放款時間表,on='用戶ID')
d = 用戶瀏覽行為表
feature = 訓練放款時間表
訓練放款時間表.head()
d.head()

#==========================放款前=============================
d = d[d['時間'] <= d['放款時間']]
feature = 訓練放款時間表
gb = d.groupby('用戶ID',as_index=False)
x1 = gb['瀏覽行為'].agg({'瀏覽行為sum':np.sum,'瀏覽行為mean':np.mean,
                     '瀏覽行為max':np.max,'瀏覽行為min':np.min,'瀏覽行為std':np.std,'瀏覽行為median':np.median})
x2 = gb['瀏覽子行為'].agg({'瀏覽子行為sum':np.sum,'瀏覽子行為mean':np.mean,
                     '瀏覽子行為max':np.max,'瀏覽子行為min':np.min,'瀏覽子行為std':np.std,'瀏覽子行為median':np.median})
xx = gb['瀏覽子行為'].apply(lambda x : np.unique(x).size)
x3 = gb['瀏覽子行為'].agg({'瀏覽子行為數':np.size})
x3['瀏覽子行為去重數'] = xx

feature = pd.merge(feature,x1,on='用戶ID',how='left')
feature = pd.merge(feature,x2,on='用戶ID',how='left')
feature = pd.merge(feature,x3,on='用戶ID',how='left')
feature.shape

temp = pd.get_dummies(d,columns=['瀏覽子行為'])
temp.head()
gb = temp.groupby('用戶ID',as_index=False)
x1 = gb['瀏覽子行為_1'].agg({'瀏覽子行為_1sum':np.sum})
x2 = gb['瀏覽子行為_2'].agg({'瀏覽子行為_2sum':np.sum})
x3 = gb['瀏覽子行為_3'].agg({'瀏覽子行為_3sum':np.sum})
x4 = gb['瀏覽子行為_4'].agg({'瀏覽子行為_4sum':np.sum})
x5 = gb['瀏覽子行為_5'].agg({'瀏覽子行為_5sum':np.sum})
x6 = gb['瀏覽子行為_6'].agg({'瀏覽子行為_6sum':np.sum})
x7 = gb['瀏覽子行為_7'].agg({'瀏覽子行為_7sum':np.sum})
x8 = gb['瀏覽子行為_8'].agg({'瀏覽子行為_8sum':np.sum})
x9 = gb['瀏覽子行為_9'].agg({'瀏覽子行為_9sum':np.sum})
x10 = gb['瀏覽子行為_10'].agg({'瀏覽子行為_10sum':np.sum})
x11 = gb['瀏覽子行為_11'].agg({'瀏覽子行為_11sum':np.sum})

feature = pd.merge(feature,x1,on='用戶ID',how='left')
feature = pd.merge(feature,x2,on='用戶ID',how='left')
feature = pd.merge(feature,x3,on='用戶ID',how='left')
feature = pd.merge(feature,x4,on='用戶ID',how='left')
feature = pd.merge(feature,x5,on='用戶ID',how='left')
feature = pd.merge(feature,x6,on='用戶ID',how='left')
feature = pd.merge(feature,x7,on='用戶ID',how='left')
feature = pd.merge(feature,x8,on='用戶ID',how='left')
feature = pd.merge(feature,x9,on='用戶ID',how='left')
feature = pd.merge(feature,x10,on='用戶ID',how='left')
feature = pd.merge(feature,x11,on='用戶ID',how='left')
feature1 = feature
feature1.shape

 

#==========================放款后=============================
d = 用戶瀏覽行為表
feature = 訓練放款時間表
d = d[d['時間'] > d['放款時間']]
gb = d.groupby('用戶ID',as_index=False)
x1 = gb['瀏覽行為'].agg({'瀏覽行為sum':np.sum,'瀏覽行為mean':np.mean,
                     '瀏覽行為max':np.max,'瀏覽行為min':np.min,'瀏覽行為std':np.std,'瀏覽行為median':np.median})
x2 = gb['瀏覽子行為'].agg({'瀏覽子行為sum':np.sum,'瀏覽子行為mean':np.mean,
                     '瀏覽子行為max':np.max,'瀏覽子行為min':np.min,'瀏覽子行為std':np.std,'瀏覽子行為median':np.median})
xx = gb['瀏覽子行為'].apply(lambda x : np.unique(x).size)
x3 = gb['瀏覽子行為'].agg({'瀏覽子行為數':np.size})
x3['瀏覽子行為去重數'] = xx

feature = pd.merge(feature,x1,on='用戶ID',how='left')
feature = pd.merge(feature,x2,on='用戶ID',how='left')
feature = pd.merge(feature,x3,on='用戶ID',how='left')
feature.shape

temp = pd.get_dummies(d,columns=['瀏覽子行為'])
temp.head()
gb = temp.groupby('用戶ID',as_index=False)
x1 = gb['瀏覽子行為_1'].agg({'瀏覽子行為_1sum':np.sum})
x2 = gb['瀏覽子行為_2'].agg({'瀏覽子行為_2sum':np.sum})
x3 = gb['瀏覽子行為_3'].agg({'瀏覽子行為_3sum':np.sum})
x4 = gb['瀏覽子行為_4'].agg({'瀏覽子行為_4sum':np.sum})
x5 = gb['瀏覽子行為_5'].agg({'瀏覽子行為_5sum':np.sum})
x6 = gb['瀏覽子行為_6'].agg({'瀏覽子行為_6sum':np.sum})
x7 = gb['瀏覽子行為_7'].agg({'瀏覽子行為_7sum':np.sum})
x8 = gb['瀏覽子行為_8'].agg({'瀏覽子行為_8sum':np.sum})
x9 = gb['瀏覽子行為_9'].agg({'瀏覽子行為_9sum':np.sum})
x10 = gb['瀏覽子行為_10'].agg({'瀏覽子行為_10sum':np.sum})
x11 = gb['瀏覽子行為_11'].agg({'瀏覽子行為_11sum':np.sum})

feature = pd.merge(feature,x1,on='用戶ID',how='left')
feature = pd.merge(feature,x2,on='用戶ID',how='left')
feature = pd.merge(feature,x3,on='用戶ID',how='left')
feature = pd.merge(feature,x4,on='用戶ID',how='left')
feature = pd.merge(feature,x5,on='用戶ID',how='left')
feature = pd.merge(feature,x6,on='用戶ID',how='left')
feature = pd.merge(feature,x7,on='用戶ID',how='left')
feature = pd.merge(feature,x8,on='用戶ID',how='left')
feature = pd.merge(feature,x9,on='用戶ID',how='left')
feature = pd.merge(feature,x10,on='用戶ID',how='left')
feature = pd.merge(feature,x11,on='用戶ID',how='left')

feature2 = feature
feature1.shape

 

最終得到53個特征,並輸出

 

以上都是針對訓練數據所做的處理,同樣在測試數據上也要做想同的處理,這里就不展示了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM