zoukankan      html  css  js  c++  java
  • 用户贷款风险预测—特征提取

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

    一、信用卡账单特征提取

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

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

  • 相关阅读:
    手机的基本功能测试情景模式
    C#.net技术内幕04集合
    .net 发送电子邮件
    SQL:select case when(转)
    《 C#技术内幕》学习01IDisposable
    C#.net技术内幕03字符串
    点击确定后页面跳转
    SQL注入式攻击
    C#.NET技术内幕 02表达式
    window xp自带的功能之繁体字
  • 原文地址:https://www.cnblogs.com/jiegege/p/8717327.html
Copyright © 2011-2022 走看看