特征生成
在风控建模过程中,最重要的过程之一就是特征工程,也是最耗时的一步,而最后的跑模型定参数相反是最简单的一步,一般而言特征工程的好坏决定了整个模型好坏的上限!一般从数据库中提取出的原始数据,在模型表现上较差,尤其是金额类变量波动较大,无法直接在模型中使用,因此需要进行特征生成。本章节主要讨论在风控建模中特征生成的思路以及python代码实现。
特征生成的思路
在风控项目中是按照数据源划分大类搭建衍生框架,如按数据源可分为大类:人行征信数据、工商税务数据、司法数据等;在按照大类划分小类,以风控中最经常用到的人行征信数据为例,可划分为小类:基础信息、信贷历史、逾期表现等,小类的划分可以按照数据信息块或者业务理解进行划分,主要思路是便于业务理解(将信息表现相同的划为一类)以及在建模时方便覆盖各类型信息(提高模型精度以及避免共线性)。
在大类以及小类确定时,就可以进行具体的变量设计,具体变量的设计思路可以分为三类:
依据经验结合产品特性直接设计变量(AHP问卷调查法,以后专门写一章吧。。),也就是专家规则,这类方法的好处就是有衍生工作量较少,快速建模,有专家经验加成,对于产品积累数据较少或者没有的项目,可以做到冷启动,待数据积累后再进行数据驱动建模。缺点也显而易见,可能错过表现较好的变量,极度依赖建模人员的经验(如果经验不足,设计变量总体上都较差,那么AHP也是矮子里拔高个)
第二种方法就是划分维度,按照维度组合设计变量,还是以人行征信中信贷历史小类变量设计举例,信贷历史中有时间及各个月的还款表现,那么就可以划分维度为:信贷产品维度、时间维度(最近N个月)、还款表现维度(逾期状态、逾期次数等)、统计维度(最大、最小、求和、平均、占比、计数等)。下面就是维度组合,如循环贷下最近3个月逾期状态为1的次数。这种拉网式组合衍生变量的数量多、覆盖面广;缺点就是工作量大,衍生出的变量大部分存在严重共线性,在后续建模中会被筛掉大部分,如时间维度一般会选取最近3、6、12个月;另外由于衍生的变量较多,在后续的特征分箱、转换及变量挑选都会消耗大量时间。
第三类方法就是利用算法生成变量,如决策树算法生成各类节点,通过节点组合生成变量,又比如神经网络算法,自动抽取和生成新变量,但这些方法面临的问题是:解释性差、模型表现不稳定等
特征生成的python代码
由于第一类衍生变量的思路是完全按照经验而定,没有固定或者抽象成函数的方法,因此没必要讨论其python代码。
第二类衍生变量思路的python代码
下面是以某类变量的代码实现举例,在编写衍生变量代码函数时,需要注意的点是衍生函数的通用性
举一个简单的例子,现在计算每个用户的额度使用率,记为特征ft,按照时间轴以月份为切片展开,得到申请前30天内的额度使用率ft1,申请前30天至60天内的额度使用率ft2,申请前60天至90天内的额度使用率ft3,…,申请前330天至360天内的额度使用率ft12,于是得到一个用户的12个特征
可以根据这个时间序列进行基于经验的人工特征衍生,例如设计一个函数,计算最近p个月特征值大于0的月份数:
def month_count(ft_name, p):
'''input:ft_name: String, 特征名p: Integer, 最近p个月function: 计算最近p个月特征值大于0的月份数'''
df=data.loc[:,ft_name+'1':ft_name+str(p)]
auto_value=np.where(df>0,1,0).sum(axis=1)
return ft_name+'_num'+str(p),auto_value
第三类衍生变量思路的python代码
以下讨论的是决策树算法在变量设计中的运用,在前面的章节(风控建模之客户分群二三事)有运用到决策树算法分群,其实可以通过各个阀值点组合,按是否命中、命中的统计量(计数、最大、最小等)进行变量衍生
# x['n1'] = x.apply(lambda x:1 if x.amount_tot>9614.5 \
# and coupon_amount_cnt<=6.0 else 0)
# x['n2'] = x.apply(lambda x:1 if x.amount_tot>9614.5 \
# and coupon_amount_cnt>6.0 else 0)