2. 异常交易检测基础
在进入 AutoEncoder 建模之前,必须先回答一个更基础的问题:什么才算“异常交易”。很多项目失败并非模型不够深,而是异常定义含糊、标签口径不统一、评估指标与业务目标脱节。本章把异常检测的“地基”讲清楚,为后续无监督建模提供统一语言。
一、异常的定义:三种视角
异常交易没有唯一标准答案,通常从三个视角定义:
- 统计视角:样本偏离总体分布,如金额落在均值 ±3σ 之外、频次显著高于同类用户。
- 业务视角:违反业务规则或监管要求,如单笔超限、短时间多设备登录后大额转出。
- 学习视角:在特征空间中密度低、难以被正常模式重构,这正是 AutoEncoder 的切入点。
三者并不等价。统计上的离群点可能是正常的大客户行为;业务违规也可能在统计上并不罕见。工程中通常采用“业务规则定标签、统计与学习定分数”的组合策略。
核心原则:异常定义必须可执行、可复现、可评估。若无法写成明确的判定条件或标注流程,后续模型再强也无法验证。
二、交易数据的六大特点
交易数据与图像、文本差异巨大,直接套用常规建模习惯容易踩坑:
| 特点 | 具体表现 | 对建模的影响 |
|---|---|---|
| 极度不平衡 | 异常占比常低于 0.1% | 准确率失效,需用 PR-AUC、召回率 |
| 强时序性 | 行为有周期、有突发 | 需滑窗、时间切分,禁止随机划分 |
| 高基数类别 | 商户、设备、IP 数量巨大 | 独热编码爆炸,需嵌入或频次编码 |
| 金额长尾 | 少数大额主导统计量 | 需对数变换或分位数归一化 |
| 概念漂移 | 欺诈手法持续演化 | 模型需定期重训与监控 |
| 标签噪声 | 确认欺诈成本高、滞后 | 适合无监督/半监督路线 |
三、常见异常类型
按业务语义,异常交易大致可分为以下几类,理解它们有助于设计特征:
- 盗刷与账户接管:异地登录、新设备、短时间高频试错后大额转出。
- 虚假交易与套现:商户与用户合谋,金额规律、时间集中、复购异常。
- 洗钱与拆分:多账户小额分散转入、集中转出,规避阈值。
- 优惠滥用:批量注册、脚本抢券、设备指纹高度相似。
- 系统与操作异常:重复扣款、金额为负、状态机错乱,属数据质量类异常。
前四类偏“行为异常”,第五类偏“数据异常”。AutoEncoder 对两者都适用,但特征工程侧重点不同。
四、业务指标与检测难点
异常检测的评估必须与业务成本挂钩。常用指标包括:
- 召回率(Recall):漏掉多少真实异常,通常优先保障。
- 精确率(Precision):误报带来的审核成本。
- PR-AUC:不平衡场景下比 ROC-AUC 更敏感。
- Alert Rate / 日均告警量:决定人工审核是否可承受。
- 金额覆盖率:拦截金额占异常总金额比例,直接对应止损。
实践建议:先与风控运营确认“每天能审多少条告警”,再反推阈值。模型分数只是排序,阈值才是业务决策。
检测难点集中在四点:
- 标签稀缺且滞后:确认欺诈往往需要数周,无法支撑有监督训练。
- 异常形态多样:新手法没有历史样本,模型只能依赖“偏离正常”。
- 正常边界模糊:大客户、促销期行为本身就“像异常”。
- 对抗性:黑产会主动模仿正常行为,使分布重叠。
五、一个可运行的基线:规则 + 统计打分
在训练 AutoEncoder 前,建议先建立可解释基线,用于对比和兜底。下面示例对交易金额做分位数与 Z-Score 打分:
import numpy as np
import pandas as pd
def baseline_score(df, amount_col="amount", eps=1e-6):
x = np.log1p(df[amount_col].clip(lower=0))
z = (x - x.mean()) / (x.std() + eps)
q = x.rank(pct=True)
# 组合分数:偏离越大、分位越极端,分数越高
score = 0.6 * np.abs(z) + 0.4 * np.abs(q - 0.5) * 2
return score
df = pd.DataFrame({"amount": [12, 35, 40, 38, 9999, 42, 37]})
df["risk_score"] = baseline_score(df)
print(df.sort_values("risk_score", ascending=False))
运行后可观察到 9999 这条被显著抬高。该基线简单,但能快速验证数据管道、阈值口径与告警量级,为后续无监督模型提供参照。
常见误区:直接用原始金额做 Z-Score。金额长尾会使均值和标准差被极端值拉偏,导致真正的异常反而不突出。务必先做对数变换或稳健统计(中位数、IQR)。
六、复盘:从定义到可评估
本节的核心逻辑链是:明确异常定义 → 认识数据特点 → 归类异常类型 → 对齐业务指标 → 识别检测难点。只有这条链打通,AutoEncoder 输出的重构误差才有明确的业务含义。下一阶段建模时,请始终回扣两个问题:这个分数对应哪类异常?阈值下每天会产生多少告警、覆盖多少金额?