[风控算法大赛解决方案]
by 陈靖 朱治亮 周耀 赵蕊 黄伟鹏
一、解决方案概述 ................................................................................................................ 3
二、数据清洗 ........................................................................................................................ 3
三、特征工程 ........................................................................................................................ 6
四、特征选择 ...................................................................................................................... 10
五、类别不平衡的处理 ...................................................................................................... 11
六、模型设计与分析 .......................................................................................................... 12
一、解决方案概述
1.1 项目介绍与问题分析
拍拍贷“魔镜风控系统”从平均 400 个数据维度评估用户当前的信用状态,给每个借款
人打出当前状态的信用分,在此基础上再结合新发标的信息,打出对于每个标的 6 个月内逾
期率的预测,为投资人提供关键的决策依据。本次竞赛目标是根据用户历史行为数据来预测
用户在未来 6 个月内是否会逾期还款的概率。
问题转换成 2 分类问题,评估指标为 AUC,从 Master,LogInfo,UpdateInfo 表中构建 特
征,考虑评估指标为 AUC,其本质是排序优化问题,所以我们在模型顶层融合也使用基于
排序优化的 RANK_AVG 融合方法。
1.2 项目总体思路
本文首先从数据清洗 开始,介绍我们对缺失值的多维度处理、对离群点的剔除方法以
及 对字符、空格等的处理;其次进行特征工程,包括对地理位置信息的特征构建、成交时
间特 征、类别特征编码、组合特征构建、UpdateInfo 和 LogInfo 表的特征提取等;再次进
行特 征选择 ,我们采用了 xgboost,xgboost 的训练过程即对特征重要性的排序过程;然后
处理 类别的不平衡度,由于赛题数据出现了类别不平衡的情况,我们采用了代价敏感学习
和过采 样两种方法,重点介绍我们所使用的过采样方法;最后一部分是模型设计与分析,
我们采用 了工业界广泛应用的逻辑回归模型、数据挖掘比赛大杀器 xgboost,创新性
地探索了 large-scale svm 的方法在本赛题上的应用,取得了不错的效果,此外还介绍了模型
融合方 法。
二、数据清洗
2.1 缺失值的多维度处理
在征信领域,用户信息的完善程度可能会影响该用户的信用评级。一个信息完善程度为
100%的用户比起完善程度为 50%的用户,会更加容易审核通过并得到借款。从这一点出发,
我们对缺失值进行了多维度的分析和处理:
按列(属性)统计 缺失值个数,进一步得到各列的缺失比率,下图(图 1)显示了含
有 缺失值的属性和相应的缺失比率:
图 1. 属性缺失比率
WeblogInfo_1 和 WeblogInfo_3 的缺失值比率为 97%,这两列属性基本不携带有用的信
息,直接剔除。UserInfo_11、UserInfo_12 和 UserInfo_13 的缺失值比率为 63%,这三列属 性
是类别型的,可以将缺失值用-1 填充,相当于“是否缺失”当成另一种类别。其他缺失 值比
率较小的数值型属性则用中值填充。
按行统计 每个样本的属性缺失值个数,将缺失值个数从小到大排序,以序号为横坐标,
缺失值个数为纵坐标,画出如下散点图(图 2):
图 2. 样本属性缺失个数
对比 trainset 和 testset 上的样本的属性缺失值个数,可以发现其分布基本一致,但是
trainset 上出现了几个缺失值个数特别多的样本(红框区域内),这几个样本可以认为是 离
群点,将其剔除。
另外,缺失值个数可以作为一个特征,衡量用户信息的完善程度。
2.2 剔除常变量
原始数据中有 190 维数值型特征,通过计算每个数值型特征的标准差,剔除部分变化很
小的特征,下表(表 1)列出的 15 个特征是标准差接近于 0 的,我们剔除了这 15 维特征。
表 1. 剔除数值特征标准差
属性
属性
WeblogInfo_10
WeblogInfo_23
WeblogInfo_31
WeblogInfo_32
WeblogInfo_40
标准差
0.0707
WeblogInfo_41
0.0939
WeblogInfo_43
0.0828
WeblogInfo_44
0.0834
WeblogInfo_46
0.0666
WeblogInfo_47
标准差
0.0212
0.0372
0.0166
0.0290
0.0401
属性
WeblogInfo_49
WeblogInfo_52
WeblogInfo_54
WeblogInfo_55
WeblogInfo_58
标准差
0.0071
0.0512
0.0946
0.0331
0.0609
2.3 离群点剔除
在样本空间中与其他样本点的一般行为或特征不一致的点称为离群点,考虑到离群点的
异常特征可能是多维度的组合,我们通过分析样本属性的缺失值个数,剔除了极少量的离群
点(见 3.1 节)。
此外,我们还采用了另外一种简单有效的方法:在原始数据上训练 xgboost,用得到的
xgb 模型输出特征的重要性,取最重要的前 20 个特征(如图 3 所示),统计每个样本在这
20 个特征上的缺失值个数,将缺失值个数大于 10 的样本作为离群点。
图 3. Xgb 特征重要性
通过这个方法,剔除了 400 多个样本。这些样本在重要特征上的取值是缺失的,会使得
模型学习变得困难,从这个角度来说,它们可以看成是离群点,应剔除掉。
2.4 其他处理
(1)字符大小写转换
Userupdate_Info 表中的 UserupdateInfo1 字段,属性取值为英文字符,包含了大小写,如
"_QQ"和"_qQ",很明显是同一种取值,我们将所有字符统一转换为小写。
(2)空格符处理
Master 表中 UserInfo_9 字段的取值包含了空格字符,如“中国移动”和“中国移动
”,
它们是同一种取值,需要将空格符去除。
(3)城市名处理
UserInfo_8 包含有“重庆”、“重庆市”等取值,它们实际上是同一个城市,需要把 字符中
的“市”全部去掉。去掉“市”之后,城市数由 600 多下降到 400 多。
三、特征工程
3.1 地理位置的处理
对地理位置信息(类别型变量)最简单的处理方式是独热编码(one-hot encoding),
但是这样会得到很高维的稀疏特征,影响模型的学习,我们在独热编码的基础上,做了特征
选择。下面介绍具体的方法。
赛题数据提供了用户的地理位置信息,包括 7 个字段:UserInfo_2、UserInfo_4、
UserInfo_7、UserInfo_8、UserInfo_19、UserInfo_20,其中 UserInfo_7 和 UserInfo_19 是省份
信息,其余为城市信息。我们统计了每个省份和城市的违约率,下图以 UserInfo_7 为例:
图 4. 省份违约率可视化
图 5 可视化了每个省份的违约率,颜色越深代表违约率越大,其中违约率最大的几个省
份或直辖市为四川、湖南、湖北、吉林、天津、山东,如下图所示:
图 5. 违约率突出省份可视化
因此我们可以构建 6 个二值特征:“是否为四川省”、“是否为湖南省”....“是否为 山东省”,
其取值为 0 或 1。其实这相当于对地理位置信息做了独热编码,然后保留其中有
判别性的某些列。这里 UserInfo_7 包含 32 种取值,编码后可以得到 32 维的稀疏特征,而 我
们只保留其中的 6 维。
以上我们是通过人工的分析方法去构建二值特征,在处理省份信息时还是比较直观的,
但是处理城市信息,比如 UserInfo_2,包含了 333 个城市,就没有那么直观了。为了得到 有
判别性的二值特征,我们首先对 UserInfo_2 进行独热编码,得到 333 维的二值特征,然 后在这
333 维稀疏特征上训练 xgb 模型,再根据 xgb 输出的特征重要性刷选二值特征,以下 是选取到的
部分二值特征(对应的城市):“淮纺市”、“九江市”、“三门峡市”、“汕 头市”、“长春市”、“铁
岭市”、“济南市”、“成都市”、“淄博市”、“牡丹江市”。
Ø 按城市等级合并 类别型特征取值个数太多时,独热编码后得到太高维的稀疏特征,
除了采用上面提到的
特征选择方法外,我们还使用了合并变量的方法。按照城市等级,将类别变量合并,例如一
线城市北京、上海、广州、深圳合并,赋值为 1,同样地,二线城市合并为 2,三线城市合
并为 3。
Ø 经纬度特征的引入 以上对地理位置信息的处理,都是基于类别型的,我们另外收
集了各个城市的经纬度,
将城市名用经纬度替换,这样就可以将类别型的变量转化为数值型的变量,比如北京市,用
经纬度(39.92,116.46)替换,得到北纬和东经两个数值型特征。加入经纬度后,线下的
cross validation 有千分位的提升。
Ø 城市特征向量化
我们将城市特征里的城市计数,并取 Log,然后等值离散化到 6~10 个区间内。以下图
为例,将 UserInfo_2 这个特征里面的 325 个城市离散为一个 6 维向量。向量“100000”表 示该
城市位于第一个区间。线下的 cross validation 有千分位的提升。
图 6. 城市特征离散化
Ø 地理位置差异特征
如图 8 所示,1,2,4,6 列都是城市。那么我们构建一个城市差异的特征,比如 diff_12 表示 1,
2 列的城市是否相同。如此构建 diff_12,diff_14,diff_16,diff_24,diff_26,diff
_46 这 6 个城市差异的特征。线下的 cross validation 有千分位的提升。