最终成绩:2 / 392
比赛地址:https://www.dcjingsai.com/v2/cmptDetail.html?id=410
源码:https://github.com/LogicJake/2020-yizhifu-credit-risk-user-identification-Top2
赛题背景
央行发布《金融科技FinTech》报告,强调金融科技成为推动金融转型升级的新引擎,成为促进普惠金融发展的新机遇。运用大数据、人工智能等技术建立金融风控模型,有效甄别高风险交易,智能感知异常交易,实现风险早识别、早预警、早处置,提升金融风险技防能力,是 “金融+科技”成果的显著体现。
任务
信用风险用户识别,本次比赛采用auc对结果进行评分。
数据介绍
详细数据字段说明
基础信息
字段名 | 字段说明(数据经过脱敏处理) |
---|---|
user | 样本编号,e.g., Train_00000、Train_00001… |
sex | 性别,编码后取值为:category 0、category1 |
age | 年龄,处理后仅保留大小关系,为某一区间的整数 |
provider | 运营商类型,编码后取值为:category 0、category 1… |
level | 用户等级,编码后取值为:category 0、category 1… |
verified | 是否实名,编码后取值为:category 0、category1 |
using_time | 使用时长,处理后仅保留大小关系,为某一区间的整数 |
regist_type | 注册类型,编码后取值为:category 0、category 1… |
card_a_cnt | a类型卡的数量,处理后仅保留大小关系,为某一区间的整数 |
card_b_cnt | b类型卡的数量,处理后仅保留大小关系,为某一区间的整数 |
card_c_cnt | c类型卡的数量,处理后仅保留大小关系,为某一区间的整数 |
card_d_cnt | d类型卡的数量,处理后仅保留大小关系,为某一区间的整数 |
op1_cnt | 某类型1操作数量,处理后仅保留大小关系,为某一区间的整数 |
op2_cnt | 某类型2操作数量,处理后仅保留大小关系,为某一区间的整数 |
service1_cnt | 某业务1产生数量,处理后仅保留大小关系,为某一区间的整数 |
service1_amt | 某业务1产生金额,处理后仅保留大小关系,为某一区间的整数 |
service2_cnt | 某业务2产生数量,处理后仅保留大小关系,为某一区间的整数 |
agreement_total | 开通协议数量,处理后仅保留大小关系,为某一区间的整数 |
agreement1 | 是否开通协议1,编码后取值为:category 0、category1 |
agreement2 | 是否开通协议2,编码后取值为:category 0、category1 |
agreement3 | 是否开通协议3,编码后取值为:category 0、category1 |
agreement4 | 是否开通协议4,编码后取值为:category 0、category1 |
acc_count | 账号数量,处理后仅保留大小关系,为某一区间的整数 |
login_cnt_period1 | 某段时期1的登录次数,处理后仅保留大小关系,为某一区间的整数 |
login_cnt_period2 | 某段时期2的登录次数,处理后仅保留大小关系,为某一区间的整数 |
ip_cnt | 某段时期登录ip个数,处理后仅保留大小关系,为某一区间的整数 |
login_cnt_avg | 某段时期登录次数均值,处理后仅保留大小关系,为某一区间的整数 |
login_days_cnt | 某段时期登录天数,处理后仅保留大小关系,为某一区间的整数 |
province | 省份,处理成类别编码 |
city | 城市,处理成类别编码 |
balance | 余额等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
balance_avg | 近某段时期余额均值等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
balance1 | 类型1余额等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
balance1_avg | 近某段时期类型1余额均值等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
balance2 | 类型2余额等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
balance2_avg | 近某段时期类型2余额均值等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
service3 | 是否服务3用户,编码后取值为:category 0、category1 |
service3_level | 服务3等级,编码后取值为:category 0、category1… |
product1_amount | 产品1金额等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
product2_amount | 产品2金额等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
product3_amount | 产品3金额等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
product4_amount | 产品4金额等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
product5_amount | 产品5金额等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
product6_amount | 产品6金额等级,处理成保留大小关系的类别编码:level 1、level2… 例如:level 2 > level 1 |
product7_cnt | 产品7申请次数,处理后仅保留大小关系,为某一区间的整数 |
product7_fail_cnt | 产品7申请失败次数,处理后仅保留大小关系,为某一区间的整数 |
操作信息
字段名 | 字段说明(数据经过脱敏处理) |
---|---|
user | 样本编号,e.g., Train_00000、Train_00001… |
op_type | 操作类型编码,处理成类别编码 |
op_mode | 操作模式编码,处理成类别编码 |
op_device | 操作设备编码,处理成类别编码 |
ip | 设备ip编码,处理成类别编码 |
net_type | 网络类型编码,处理成类别编码 |
channel | 渠道类型编码,处理成类别编码 |
ip_3 | 设备ip前三位编码,处理成类别编码 |
tm_diff | 距离某起始时间点的时间间隔,处理成如下格式。例如: 9 days 09:02:45.000000000,表示距离某起始时间点9天9小时2分钟45秒 |
交易信息
字段名 | 字段说明(数据经过脱敏处理) |
---|---|
user | 样本编号,e.g., Train_00000、Train_00001… |
platform | 平台类型编码,处理成类别编码 |
tunnel_in | 来源类型编码,处理成类别编码 |
tunnel_out | 去向类型编码,处理成类别编码 |
amount | 交易金额,处理后仅保留大小关系,为某一区间的整数 |
type1 | 交易类型1编码,处理成类别编码 |
type2 | 交易类型2编码,处理成类别编码 |
ip | 设备ip编码,处理成类别编码 |
ip_3 | 设备ip前三位编码,处理成类别编码 |
tm_diff | 距离某起始时间点的时间间隔,处理成如下格式。例如: 9 days 09:02:45.000000000,表示距离某起始时间点9天9小时2分钟45秒 |
方案总结
特征工程
特征工程之前先进行了一波预处理,数据介绍里说过所给数据进行了高度匿名化,因此引入了一些不合理性。比如余额等级这个特征被转换成类别编码,但同时存在大小关系:level 2 > level 1。如果将其不处理作为类别特征输入,模型无法学习到之间的大小关系,所以我将其中的数字提取出来作为数值特征,能帮助模型提高9个w。特征工程围绕基础数据的交叉衍生,群体黑样本比例,操作行为特征和交易行为特征展开。
基础特征
基础数据分为两大类:数值特征和类别特征。对所有的数值特征进行一波二阶相加,另外结合对数据的理解,进行了一些细致的二阶或者三阶的相加或相除运算。在这一步可以构造出一个强有力的特征:用户产品7申请失败比率(用户申请失败次数/用户申请次数),在正常用户和异常用户上的分布如图1所示,该特征可以帮助模型提升3个k。我猜测翼支付本身肯定有一套风险控制系统,对于潜在的风险用户提高了准入门槛,使得特定产品的申请失败率相较于正常用户较高。另外正常用户和风险用户偏好的登录时段也不一样,如图2和图3所示,正常用户更多地在时期1登录,而风险用户则在时期2登录。类别特征可以用拼接进行二阶交叉,也可以计数反应类别热度。
群体黑样本比例
之前参加过的反欺诈或者风控比赛,对群体的识别都比较有效。一般欺诈行为都是团队作战,位于同一个区域或者使用同一种价格低廉的手机。所以可以根据省份,城市,设备等属性划分群体,甚至两两属性组合进一步细分群体。划分群体之后,对群体样本进行五折交叉统计,得到群体的黑样本比率,或者称该群体发生违约风险的概率。该特征作为先验知识帮助模型提高识别准确率。图4和图5可以看出,不同群体之间的黑样本比率相差较大,在真实的业务场景中,可以针对不同的群体用户,采取不同等级的审核力度,从而尽可能减少风险用户。以设备和年龄组合这个细分群体来说,每个年龄段都有其偏好的手机类型,比如年轻人可能偏好于华为或者苹果,而老年人可能倾向于价格便宜的OPPO或者vivo(仅做举例,不一定准确)。但对一欺诈团队,其不一定符合这一现象,比如他们的设备往往可能是统一采购的低廉机型,从而出现与其年龄段不相称的使用机型,通过这一细分群体的划分可以帮助我们定位风险用户群体。
操作行为特征
对操作行为表主要是进行时空特征统计,具体流程如图6所示。这组特征主要使用pivot_table完成,所以构造的特征维度较高。另外在时间维度上,采取滑窗选取样本进行细化统计,比如用户最近15天进行过多少次操作类型为×××的操作。
交易行为特征
交易行为特征的构造和操作行为特征差不多,具体流程如图7所示,只不过交易行为相较于操作行为多了一个很重要的特征:交易额。操作行为特征主要是计算多少次操作(count),而交易行为特征围绕交易额进行了一系列时间,空间或者时空维度的统计,比如:用户在××平台上交易额的平均值,最大值,用户最近15天交易额的平均值,总和,用户最近3天进行交易类型1的交易额的总和…
模型
模型方面没有使用过多繁杂的融合手段。初赛时候构造特征比较细致,特征的测试维度都是以个计算,追求线上和线下的一致性,避免过拟合。复赛由于入场较晚,没有过多的时间测试,所以测试维度都是以组为单位进行,生成的特征维度较高,但模型效果提升很快。所以最后采用了两套特征工程,一套是初赛方案,保证整体的鲁棒性,另外一套是复赛的梭哈版本,极大提高了模型效果。对两套特征工程分别使用lgb和xgb模型生成4个概率文件,使用指数加权融合得到最后的提交结果。
总结
初赛的时候由于平台算分bug,导致和前排分数差异太大,所以早早放弃保平安了。复赛再参与进来,剩余时间不多,也错过了组队机会,这一题感觉如果有队友融合提升应该很明显。自己没有队友融合,所以最后死马当作活马医,和初赛方案尝试融合了一下,没想到竟然比模型差异融合带来的效果还好。
决赛答辩的时候,很多队伍都提到了对行为数据提取序列特征,但word2vec,tfidf和countvec在我这边效果都不好,只有初赛的时候对amount做word2vec有点提升。可能是因为暴力梭哈特征维度太高了,已经包含了序列特征能反映的信息。所以比赛还是有队友差异性融合比较好,所有的思路不要都放在一个方案里。
比赛过程还尝试过其他思路,比如伪标签,但预测出来的概率值普遍不高,都没有超过0.9,所以放弃了。另外由于序列行为的存在,尝试了一波基于LSTM的nn建模,但效果也不好,融合也没有提升。
这题的数据格式倒是好像挺常见,之前参与的2020腾讯游戏安全技术竞赛机器学习组赛题数据与之类似。此外本次比赛第一名大佬在答辩时提到的将操作行为和交易行为融合成一张大表做统计的思路挺好的,自己比赛时没有想到。