用户贷款风险预测—特征提取

本次竞赛提供的数据源一共有五个,依次做特征提取

一、信用卡账单特征提取

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个特征,并输出

以上都是针对训练数据所做的处理,同样在测试数据上也要做想同的处理,这里就不展示了

原文地址:https://www.cnblogs.com/jiegege/p/8717327.html