异常用户行为分析:基于序列和图的欺诈检测
异常用户行为分析:基于序列和图的欺诈检测
在数字业务中,异常行为可能意味着欺诈、账户盗用、刷单或恶意爬取。本教程从零开始,讲解如何利用用户行为序列与关系图谱,构建可落地的异常检测方案。适合数据工程师、风控分析师及对行为分析感兴趣的开发者。
1. 为什么选择序列与图?
传统规则引擎只看单点事件(如单笔交易金额),容易被规避。欺诈者会模仿正常行为,但难以复制长期的行为模式或隐藏的关系结构。
- 行为序列:捕捉用户操作的顺序、时间间隔、频率变化。例如,正常用户浏览商品、加入购物车、犹豫后支付;而盗卡者会短时间内连续尝试多张卡。
- 关系图谱:揭露设备、IP、账户、银行卡之间的隐性关联。例如,多个账户共用同一个设备或Wi‑Fi,形成可疑社区。
两者结合,既能看清“过程”,又能看懂“圈子”,显著提升召回率和精准度。
2. 数据准备与基础预处理
2.1 行为日志的核心字段
无论网站还是App,日志至少应包含:
| 字段 | 说明 | 示例 |
|---|---|---|
| user_id | 用户唯一标识 | u_123456 |
| event_type | 事件类型(登录、点击、下单等) | login, add_to_cart, payment |
| timestamp | 精确到毫秒的时间戳 | 2025-03-15T10:23:45.123Z |
| session_id | 会话标识 | sess_abc |
| ip | 访问IP地址 | 192.168.1.100 |
| device_id | 设备指纹 | d_xyz |
| metadata | 扩展信息(金额、商品ID等) | {"amount": 299.00, "sku": "A100"} |
2.2 图数据的关系提取
从日志或业务表中提取实体(节点)与联系(边),常见实体:用户、设备、IP、支付卡、收货地址。关系举例:
- 用户
A登录时使用IP1→ 边:A -[used_ip]-> IP1 - 用户
A和用户B曾在同一设备上登录 → 边:A -[shared_device]-> B
准备好这些数据后,我们就能够构建特征并进行检测。
3. 基于序列的检测方法
我们将用户的一连串事件定义为一个序列。目标:判断一个序列是否偏离其历史模式或整体正态模式。
3.1 序列特征工程
不要直接扔给模型,先提取有意义的统计量。假设我们关注支付行为,可定义如下特征:
- 事件间隔:最近N次操作的平均时间间隔、标准差。
- 速度异常:单位时间内的操作次数(如1分钟内下3单)。
- 序列多样性:事件类型的熵值。正常用户会浏览、搜索、比较;机器脚本只有登录、下单。
- 流转概率:计算一个事件转移到下一事件的概率。例如
add_to_cart → payment的正常概率为0.7,但如果用户直接从login → payment,则转移概率极低。 - 时序模式:该用户通常在哪个时段活跃?深夜频繁操作可能为机器行为。
实践:使用n-gram + TF‑IDF
将用户的操作序列转换为“词袋”模型。例如3‑gram片段:login‑view_item‑add_cart、view_item‑add_cart‑payment。然后计算每个用户序列的TF‑IDF向量,利用余弦相似度衡量与“基准正常意愿”的偏离。
3.2 序列模型检测
更进阶的方法是用深度序列模型学习正常行为的表示:
- LSTM 自编码器:用正常行为序列训练自编码器,使其能够重构正常事件序列。对于异常序列,重构误差会显著变大。设定阈值,误差超过阈值则告警。
- 序列概率模型:利用 RNN/Transformer 预测下一个事件类型或时间。若实际事件与预测严重不符,标记为异常。
优点:无需标签,仅用正常数据训练。适合冷启动时积累大量无标签日志的场景。
3.3 序列检测实战伪代码
# 1. 序列向量化
sequences = []
for user, events in group_by_user(logs):
seq = [event_type for event_type in events]
sequences.append(seq)
# 2. 用n-gram模型构造特征
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(ngram_range=(2,3), analyzer='word')
X = vec.fit_transform([' '.join(seq) for seq in sequences])
# 3. 计算每个序列与平均向量的距离
from sklearn.metrics.pairwise import cosine_similarity
avg_vec = X.mean(axis=0)
scores = 1 - cosine_similarity(X, avg_vec).flatten()
anomalous_idx = scores > np.percentile(scores, 95)
4. 基于图的检测方法
图异常检测可以发现团伙性和隐蔽性强的欺诈。常用方法包括社区发现、异常子图挖掘和图神经网络。
4.1 图的构建与属性
使用 user、device、ip、card 等节点。边的权重可设置为交互次数或时间衰减后的强度。同时,节点上可携带属性,例如用户的注册时长、设备的风险标签。
4.2 传统图特征
从图结构中为每个用户计算图特征:
- 度中心性:相连节点数。一个IP下关联几百个账户显然异常。
- PageRank:重要性。高PageRank的节点可能是枢纽(如代理IP)。
- 社群系数:节点所在聚集簇的紧密程度。
- 孤立性:欺诈团伙内部连接紧密但与外部连接稀疏,使用 conductance 或 modularity 检测。
4.3 社区发现定位可疑团伙
利用 Louvain 或 Label Propagation 算法划分社区。然后对社区进行聚合特征分析:成员平均交易额、注册时间聚集度、坏账历史占比等。只要少数社区表现出强一致性的异常特征,即可将整个社区列为高风险。
4.4 异构图神经网络 (Heterogeneous GNN)
现代图方法直接学习节点嵌入,同时捕获结构和属性信息。异构图包含多种类型的节点和边,非常适合我们的场景。
- 模型示例:HGT (Heterogeneous Graph Transformer)、RGCN。
- 训练:半监督学习,使用少量已知欺诈/正常标签,加上大量未标记数据。损失函数常使用节点分类交叉熵。
- 输出:每个用户节点的异常概率。还可利用注意力权重解释哪些邻居关系导致了异常。
部署注意点:图神经网络需要定期增量更新,以适应新节点和模式漂移。
5. 构建端到端的检测系统
不推荐只追求单一算法,组合策略更稳健。
5.1 架构分层
原始日志 → 数据处理层
├─ 序列特征提取 + 序列模型评分
└─ 构建行为图 + 图模型评分
→ 融合层(规则+模型打分)
→ 风险决策引擎 → 人工审核/自动处置
5.2 融合策略
- 级联裁决:先用高性能规则拦截明显攻击,剩余流量输入模型。
- 分数融合:将序列异常分数与图异常分数进行加权求和,或作为特征放入轻量级梯度提升树(LightGBM)做最终判定。
5.3 可解释性
异常必须给出解释,否则运营人员无法处理:
- 对于序列异常,输出“用户在5分钟内尝试4张不同信用卡”或“跳过添加购物车直接支付”。
- 对于图异常,输出“该账户与3个已确认欺诈账户共用设备”或“所在社区75%成员因盗刷被冻结”。
6. 常见挑战与对策
| 挑战 | 解决办法 |
|---|---|
| 标签极度稀疏 | 无监督模型预筛,结合业务规则生成弱标签,再迭代训练 |
| 行为数据冷启动 | 使用全平台统计先验,随着用户行为积累逐步个性化 |
| 图规模巨大 | 切分子图、只保留近N天关系、采用图采样技术(GraphSAINT) |
| 攻击者模仿正常序列 | 结合统计特征与图特征,单一维度容易被骗,多维度联合防御 |
| 模型时效性 | 在线学习、滑动窗口定期重训、实时图更新 |
7. 入门实践建议
- 数据层面:先梳理现有的日志字段,补齐缺失,统一事件编码。
- 快速基线:用SQL计算用户1小时内的登录次数、支付次数,设定阈值,看能发现多少已知案例。
- 引入序列:利用离线Jupyter Notebook,抽取一个用户的序列,计算流转概率,体验特征工程。
- 图分析起步:使用NetworkX或igraph构建小规模图,计算度中心性,找出超级节点。
- 生产化路径:采用图数据库(如Neo4j)存储关系,配合Spark/Flink进行流式特征计算,模型可打包为容器服务。
推荐开源工具:
- 序列处理:
Keras/TensorFlow,seq2pat - 图分析:
PyG(PyTorch Geometric),DGL,NetworkX - 特征工程:
tsfresh(时间序列),featuretools
异常用户行为分析是一个持续对抗的过程。序列还原了意图的轨迹,图揭露了隐藏的共谋。从简单的统计阈值开始,逐步叠加学习模型,你的防御体系将会一步一步变得智能且坚固。