3. Velocity速度特征核心概念
在交易反欺诈体系中,Velocity(速度)特征用于刻画“单位时间内行为发生的密集程度与金额强度”。它回答的核心问题是:同一个主体在最近一段时间内,做了多少次、涉及多少钱、间隔多密、是否突然加速。理解这些概念的定义与区别,是后续特征工程不跑偏的前提。
一、核心原理:把“时间”变成可计算的维度
原始交易流水只有一条条带时间戳的记录。Velocity 特征的本质,是围绕某个观察点(通常是当前交易时刻)向前截取一段时间窗口,再在窗口内做聚合统计。因此三个要素缺一不可:主体(谁)、窗口(多久)、统计量(算什么)。
- 时间窗口:定义“看多远”,如最近 1 小时、24 小时、7 天。它是所有速度特征的边界。
- 频次:窗口内事件发生的次数,如 1 小时内交易 12 笔。
- 金额累计:窗口内金额的求和、均值、最大值,如 24 小时累计转出 8.6 万元。
- 间隔:相邻两次事件的时间差,如平均间隔 3 分钟、最小间隔 8 秒。
频次看“次数密度”,金额累计看“资金强度”,间隔看“节奏异常”。三者组合,才能识别“小额高频试探”与“大额快速转移”这两类典型欺诈模式。
二、滑动窗口与滚动统计:定义与关键区别
滑动窗口是一种窗口构造方式:窗口长度固定,但起点随观察点向前移动。例如“最近 1 小时”在每笔新交易到来时都会重新截取,窗口内容不断滑入新数据、滑出旧数据。滚动统计则是在滑动窗口之上执行的聚合计算过程,强调“随数据流持续更新”的统计结果。
两者的关系可以概括为:滑动窗口是范围定义机制,滚动统计是计算执行机制。没有滑动窗口,滚动统计就没有边界;没有滚动统计,滑动窗口只是一个空区间。
关键区别:固定窗口(如自然日 0 点至 24 点)边界对齐日历,便于对账但响应滞后;滑动窗口边界跟随事件,能捕捉“刚刚发生的加速”,更适合实时风控。
三、方法流程:从原始流水到速度特征
- 确定主体键:账户、设备、IP、收款方,或组合键。
- 选择窗口集合:常用 5 分钟、1 小时、24 小时、7 天,形成多尺度视图。
- 定义统计量:count、sum、avg、max、std、min_interval 等。
- 按时间排序并滑动计算:保证事件时间有序,避免未来信息泄漏。
- 生成特征向量:如 cnt_1h、amt_24h、avg_gap_10m。
下面是一段简化的滚动统计伪代码,展示滑动窗口如何逐笔更新:
for each txn in sorted(stream, key=time):
window = [e for e in history if txn.time - e.time <= 3600]
feat.cnt_1h = len(window)
feat.amt_1h = sum(e.amount for e in window)
feat.max_amt_1h = max((e.amount for e in window), default=0)
feat.avg_gap_1h = mean_gap(window)
history.append(txn)
四、案例场景:同一笔交易,不同特征给出不同信号
假设账户 A 在 10 分钟内连续发起 6 笔转账,每笔 900 元,随后第 7 笔突然发起 5 万元。单看金额,5 万元可能未超单笔限额;但速度特征会同时报警:
| 特征 | 取值 | 含义 |
|---|---|---|
| cnt_10m | 7 | 10 分钟内频次异常偏高 |
| amt_10m | 55,400 | 短时金额累计激增 |
| avg_gap_10m | 约 85 秒 | 操作节奏机械、间隔过短 |
| amt_ratio_10m_24h | 0.92 | 10 分钟金额占全天 92%,突增明显 |
这类“小额高频铺垫 + 大额收割”的模式,正是 Velocity 特征最擅长捕捉的欺诈形态。若只看单笔金额或只看日累计,很容易漏判。
五、误区与复盘
常见误区一:窗口越多越好。窗口过多会导致特征维度爆炸、共线性严重,且实时计算成本高。建议按业务节奏选择 3~5 个尺度。
- 误区二:忽略时间对齐。用事件时间而非入库时间,否则乱序数据会污染窗口边界。
- 误区三:把间隔当成独立特征却忘记方向。间隔骤降与骤升含义不同,需结合频次判断。
- 误区四:训练与线上窗口不一致。离线用 1 小时整点窗口、线上用滑动窗口,会导致特征分布漂移。
复盘建议:对每个速度特征记录其窗口长度、统计函数、主体键与更新频率,形成特征字典。上线后监控窗口内样本量与空值率,避免因冷启动导致特征失真。