异常用户行为分析:基于序列和图的欺诈检测

FreeGuideOnline 最新 2026-06-23

异常用户行为分析:基于序列和图的欺诈检测

在数字业务中,异常行为可能意味着欺诈、账户盗用、刷单或恶意爬取。本教程从零开始,讲解如何利用用户行为序列与关系图谱,构建可落地的异常检测方案。适合数据工程师、风控分析师及对行为分析感兴趣的开发者。

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_cartview_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 图的构建与属性

使用 userdeviceipcard 等节点。边的权重可设置为交互次数或时间衰减后的强度。同时,节点上可携带属性,例如用户的注册时长、设备的风险标签。

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. 入门实践建议

  1. 数据层面:先梳理现有的日志字段,补齐缺失,统一事件编码。
  2. 快速基线:用SQL计算用户1小时内的登录次数、支付次数,设定阈值,看能发现多少已知案例。
  3. 引入序列:利用离线Jupyter Notebook,抽取一个用户的序列,计算流转概率,体验特征工程。
  4. 图分析起步:使用NetworkX或igraph构建小规模图,计算度中心性,找出超级节点。
  5. 生产化路径:采用图数据库(如Neo4j)存储关系,配合Spark/Flink进行流式特征计算,模型可打包为容器服务。

推荐开源工具

  • 序列处理:Keras/TensorFlow, seq2pat
  • 图分析:PyG (PyTorch Geometric), DGL, NetworkX
  • 特征工程:tsfresh (时间序列), featuretools

异常用户行为分析是一个持续对抗的过程。序列还原了意图的轨迹,图揭露了隐藏的共谋。从简单的统计阈值开始,逐步叠加学习模型,你的防御体系将会一步一步变得智能且坚固。