2. 图谱构建入门:节点与边的定义、属性图模型、使用NetworkX构建简单反欺诈图谱
反欺诈图谱的核心是将实体(如用户、设备、IP地址、订单)抽象为节点,将实体间的关联(如登录、交易、共享设备)抽象为边。本章将系统讲解图谱构建的基础概念,并通过Python的NetworkX库实现一个简单的反欺诈图谱。
2.1 节点与边的定义
在反欺诈场景中,节点和边的定义直接决定了图谱的表达能力与后续分析效果。
| 元素 | 反欺诈含义 | 常见示例 | 关键属性 |
|---|---|---|---|
| 节点 (Node) | 参与业务活动的独立实体 | 用户ID、手机号、设备指纹、银行卡号、IP地址、订单号 | 类型、创建时间、风险标签、活跃度 |
| 边 (Edge) | 实体之间发生的业务关系或行为 | 登录、交易、绑定、共享设备、同IP、同收货地址 | 关系类型、时间戳、频次、金额、是否成功 |
实战要点:节点类型不宜过多(建议控制在5-8类),否则图谱会过于稀疏;边的关系类型应聚焦于高风险关联,如“同设备登录”、“短时间内多账户转账”。
2.2 属性图模型
属性图模型是目前反欺诈图谱最常用的数据模型。它将节点和边都视为带有属性的对象,支持灵活的查询与计算。
- 节点属性:描述实体本身的特征。例如用户节点可包含
user_id、register_time、risk_score、is_blacklisted。 - 边属性:描述关系的特征。例如交易边可包含
amount、timestamp、transaction_type、is_fraud。 - 有向 vs 无向:反欺诈图谱中,大部分边使用有向边(如A转账给B),部分关系(如共享设备)使用无向边。
- 多重边:允许两个节点之间存在多条不同关系(如A登录过设备D,A也用设备D转账给B)。
属性图优势:相比传统关系型数据库,属性图在欺诈团伙挖掘中可将多跳关联查询(如“查找与黑名单用户共享设备的所有账户”)的耗时从分钟级降至毫秒级。
2.3 使用NetworkX构建简单反欺诈图谱
NetworkX是Python中最成熟的图分析库,支持属性图模型、多种图算法和可视化。下面通过一个典型的“设备关联”欺诈场景演示构建过程。
2.3.1 场景描述
假设我们有以下数据:
- 用户A、B、C分别登录过设备D1、D2。
- 用户A和B使用同一IP地址(IP1)进行交易。
- 用户C的注册手机号与黑名单用户X的手机号相同。
2.3.2 代码实现
import networkx as nx
from datetime import datetime
# 1. 创建有向图(允许多重边)
G = nx.MultiDiGraph()
# 2. 添加节点并赋予属性
G.add_node('user_A', type='user', risk_score=0.2, register_time='2024-01-15')
G.add_node('user_B', type='user', risk_score=0.5, register_time='2024-02-20')
G.add_node('user_C', type='user', risk_score=0.8, register_time='2024-03-10')
G.add_node('device_D1', type='device', os='Android 13', first_seen='2024-01-10')
G.add_node('device_D2', type='device', os='iOS 17', first_seen='2024-02-01')
G.add_node('IP1', type='ip', geo='China, Beijing')
G.add_node('phone_X', type='phone', carrier='China Mobile', is_blacklisted=True)
# 3. 添加边并赋予属性
# 用户登录设备
G.add_edge('user_A', 'device_D1', relation='login', timestamp='2024-03-01 10:00:00')
G.add_edge('user_B', 'device_D1', relation='login', timestamp='2024-03-01 11:00:00')
G.add_edge('user_C', 'device_D2', relation='login', timestamp='2024-03-05 09:00:00')
# 用户使用IP
G.add_edge('user_A', 'IP1', relation='used_ip', timestamp='2024-03-02 14:00:00')
G.add_edge('user_B', 'IP1', relation='used_ip', timestamp='2024-03-03 16:00:00')
# 用户绑定手机
G.add_edge('user_C', 'phone_X', relation='bound_phone', bind_time='2024-03-04')
# 4. 查看图谱基本信息
print(f"节点数量: {G.number_of_nodes()}")
print(f"边数量: {G.number_of_edges()}")
print(f"节点类型分布: {nx.get_node_attributes(G, 'type')}")
2.3.3 图谱结构可视化
下图展示了上述代码构建的反欺诈图谱结构,清晰呈现了用户、设备、IP和手机号之间的关联网络。
2.4 图谱构建最佳实践
常见陷阱:不要将所有数据都塞入图谱。例如,用户姓名、地址等长文本属性应存储在外部数据库,图谱中仅保留ID或哈希值,否则会导致图谱臃肿、查询性能下降。
| 实践要点 | 说明 | 反欺诈场景示例 |
|---|---|---|
| 节点去重 | 同一实体在不同数据源中可能ID不同,需建立统一ID映射 | 设备指纹、手机号、身份证号等需归一化 |
| 边的时间窗口 | 只保留近期活跃的边,过期边可归档或删除 | 仅保留最近90天的登录记录 |
| 属性精简 | 节点和边的属性应聚焦于风险特征 | 用户节点保留风险分、注册时长;交易边保留金额、频次 |
| 索引策略 | 对高频查询的节点类型和边关系建立索引 | 对“设备”类型节点和“登录”关系边建立索引 |
2.5 从图谱到阈值漂移分析
构建完成的图谱是后续阈值漂移分析的基础。通过图谱可以计算以下关键指标:
- 节点度数:一个用户关联的设备数、IP数,异常高值可能指示团伙行为。
- 社区发现:识别紧密连接的子图,这些子图往往对应欺诈团伙。
- 路径长度:用户到黑名单节点的最短路径,路径越短风险越高。