4. 盗刷交易特征工程
特征工程是银行卡盗刷欺诈模型成败的分水岭。原始交易流水只有字段,没有“洞察”;特征工程的任务,是把时间、地点、金额、频次、设备、商户这六个维度上的原始字段,转化为能区分“本人正常消费”与“盗刷者操作”的判别信号。本节围绕这六个维度,讲清每个维度的核心原理、可落地特征、计算口径与常见陷阱。
一、核心原理:盗刷行为的六维偏离假设
盗刷者与持卡人本质上是两类行为主体,其行为模式在统计上存在系统性偏离。特征工程的核心假设是:盗刷交易会在至少一个维度上显著偏离该持卡人的历史行为基线。因此,绝大多数有效特征都是“相对特征”——相对于本人历史、相对于同类人群、相对于近期窗口的偏离度,而非绝对数值。
关键设计原则:先建立持卡人基线,再计算偏离度。绝对金额、绝对时间本身判别力很弱,而“金额是本人近90天均值的8倍”“交易发生在本人从未出现过的城市”“设备指纹首次出现”这类相对特征,才是模型真正依赖的信号。
二、六大维度特征清单与计算口径
下表给出每个维度的代表性特征、计算口径与判别逻辑,可直接作为特征开发的需求清单。
| 维度 | 代表性特征 | 计算口径 | 判别逻辑 |
|---|---|---|---|
| 时间 | 交易小时、距上次交易间隔、深夜占比、与本人活跃时段偏离度 | 按持卡人历史交易分布统计活跃时段,计算当前交易落在低频时段的概率 | 盗刷常发生在凌晨2–5点等本人极少交易的时段 |
| 地点 | 交易城市、与常用地距离、跨城速度、IP归属地与商户地一致性 | 计算当前交易地与上一笔交易地的球面距离除以时间差 | 短时间内跨城甚至跨国,物理上不可能,是强欺诈信号 |
| 金额 | 金额/本人均值比、金额分位、整数金额标记、余额试探标记 | 以持卡人近30/90天金额分布计算z-score或分位数 | 盗刷常先小额试探再大额盗取,金额分布呈双峰 |
| 频次 | 1小时/24小时交易笔数、短时突增比、失败后重试次数 | 滑动窗口计数,与本人历史同窗口均值比较 | 盗刷者会连续快速试卡,频次突增明显 |
| 设备 | 设备指纹是否首次、设备与持卡人绑定关系、模拟器/root标记、IP代理标记 | 维护设备-持卡人关联表,标记新设备与风险设备 | 新设备+新地点+大额,组合风险极高 |
| 商户 | 商户类别码(MCC)、商户历史欺诈率、商户与本人消费偏好匹配度 | 统计商户维度历史拒付率与盗刷率 | 高风险MCC(如虚拟商品、充值)与本人偏好不符时可疑 |
三、方法流程:从原始字段到模型特征
特征工程不是一次性动作,而是一条可复用的流水线。建议按以下步骤推进:
- 数据对齐:以交易为主键,关联持卡人画像、设备表、商户表、地理位置表,确保时间戳统一到同一时区。
- 基线构建:为每个持卡人计算近30/90/180天的行为基线,包括金额均值与标准差、活跃时段、常用城市、常用设备。
- 偏离度计算:对当前交易逐维计算偏离,形成相对特征。
- 窗口聚合:用滑动窗口生成频次、金额累计、失败次数等时序特征。
- 组合交叉:构造“新设备×新地点×大额”“深夜×高频×高风险MCC”等交叉特征。
- 特征筛选与监控:用IV、PSI评估区分度与稳定性,剔除高相关冗余特征。
下面是一段用Python计算核心偏离特征的示例,展示口径如何落地:
import pandas as pd
import numpy as np
# 假设 tx 为当前交易,base 为该持卡人近90天基线
def build_features(tx, base):
feats = {}
# 金额偏离:z-score 与分位
feats['amt_zscore'] = (tx['amount'] - base['amt_mean']) / (base['amt_std'] + 1e-6)
feats['amt_ratio'] = tx['amount'] / (base['amt_mean'] + 1e-6)
# 时间偏离:是否落在本人低频时段
feats['is_night'] = int(tx['hour'] in [0,1,2,3,4,5])
feats['hour_dev'] = abs(tx['hour'] - base['active_hour_median'])
# 地点偏离:是否首次城市、跨城速度
feats['is_new_city'] = int(tx['city'] not in base['common_cities'])
feats['cross_city_speed'] = tx['distance_km'] / (tx['gap_hours'] + 1e-6)
# 设备偏离
feats['is_new_device'] = int(tx['device_id'] not in base['known_devices'])
# 频次突增
feats['cnt_1h_ratio'] = tx['cnt_1h'] / (base['cnt_1h_mean'] + 1e-6)
return feats
工程建议:偏离度特征对基线窗口长度敏感。窗口太短,基线不稳;窗口太长,无法反映持卡人近期消费习惯变化。实践中常用“近30天为主、近90天为辅”的双窗口策略,并对新卡、低活跃卡单独处理。
四、案例场景:一笔典型盗刷的特征画像
某持卡人历史交易集中在工作日晚间、常住城市A、单笔金额200–800元、常用设备1台。某日凌晨3点发生一笔交易:金额9800元、城市B、新设备、1小时内第4笔、商户为虚拟充值类MCC。逐维特征表现为:
- 时间:is_night=1,hour_dev 显著偏大;
- 地点:is_new_city=1,cross_city_speed 远超合理阈值;
- 金额:amt_zscore 超过5,amt_ratio 约15倍;
- 频次:cnt_1h_ratio 远高于基线;
- 设备:is_new_device=1;
- 商户:高风险MCC且与本人偏好不匹配。
六个维度同时偏离,模型可给出极高欺诈分。反之,若仅金额偏大但时间、地点、设备均正常,则更可能是本人正常大额消费,需谨慎判定,避免误杀。
五、误区与复盘
误区一:把绝对特征当主力。直接用原始金额、原始小时数入模,模型难以泛化到不同消费层级的持卡人。应优先使用相对偏离特征。
误区二:忽视时间窗口泄漏。计算基线时若使用了当前交易之后的数据,会造成标签泄漏,离线AUC虚高、上线效果骤降。务必严格按时间切分。
误区三:设备指纹不稳定。设备ID可能因系统升级、重装而漂移,需结合多因子(设备型号、IP、行为习惯)综合判定,而非单一依赖。
误区四:忽略业务可解释性。风控特征需能向审核人员解释。建议对每个特征保留可读的触发原因,便于人工复核与策略调优。
复盘时建议按维度统计特征覆盖率、区分度(IV)与稳定性(PSI),并定期回看误杀与漏杀案例,定位是哪个维度的特征口径需要修正。特征工程是迭代过程,只有持续用真实盗刷样本校验,六维特征才能真正形成稳定的判别能力。