本次競賽提供的數據源一共有五個,依次做特征提取
一、信用卡賬單特征提取
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個特征,並輸出
以上都是針對訓練數據所做的處理,同樣在測試數據上也要做想同的處理,這里就不展示了