Python实现图谱PSI漂移自动告警教程 - 第4节

4.1 图谱数据的基本构成:节点、边与属性

图谱数据(Graph Data)以“图”作为核心数据结构,由三个基本要素组成:节点(Node/Vertex)、边(Edge)和属性(Property)。理解这三者是进行图谱特征工程和PSI漂移分析的前提。

  • 节点:代表现实世界中的实体,如用户、设备、交易、IP地址等。每个节点通常拥有唯一标识符(ID)。
  • 边:代表节点之间的关系,如“转账”、“登录”、“好友”。边可以是有向的(如A→B)或无向的(如A—B)。
  • 属性:附加在节点或边上的键值对,用于描述实体的特征或关系的强度。例如,用户节点的属性可能包括“年龄”、“注册时间”;转账边的属性可能包括“金额”、“时间戳”。
PSI漂移视角: 在监控图谱PSI漂移时,我们不仅关注节点属性的分布变化,还需关注边的拓扑结构变化(如新增/消失的边、边的密度变化),因为拓扑漂移往往比属性漂移更隐蔽且更具破坏性。
图谱数据三要素:节点、边、属性 图谱数据三要素结构示意 用户 (User) 设备 (Device) 交易 (Transaction) 登录 发起 用户属性 • 用户ID: U001 • 注册时间: 2024-01 • 风险等级: 低 边属性(登录) • 时间: 2025-03-01 • IP: 192.168.1.1 • 登录结果: 成功

4.2 图谱数据 vs 结构化表格数据:核心区别

传统结构化表格数据(如DataFrame)假设样本独立同分布,而图谱数据则显式建模实体间的依赖关系。下表从多个维度对比两者的本质差异:

对比维度 结构化表格数据 图谱数据
基本单元 行(样本/记录) 节点 + 边
样本独立性 假设独立同分布(i.i.d.) 节点间存在显式依赖,不独立
特征来源 列属性(字段值) 节点属性 + 拓扑结构特征
数据稀疏性 通常稠密或规则缺失 高度稀疏(邻接矩阵稀疏)
PSI漂移关注点 单变量/多变量分布偏移 属性分布偏移 + 拓扑结构偏移
常见存储格式 CSV, Parquet, SQL表 边列表(CSV)、邻接表、图数据库
关键洞察: 在表格数据中,PSI漂移通常只计算特征列的分布变化;而在图谱数据中,除了节点特征漂移,还需要监控“边的分布”、“节点度分布”、“社区结构”等拓扑层面的漂移,这使得图谱PSI监控更加复杂但也更加全面。

4.3 图谱特征工程简介

图谱特征工程的目标是将原始图结构转化为机器学习模型可用的数值特征。根据特征来源,可分为以下三大类:

  1. 节点属性特征: 直接使用节点自带的属性(如年龄、金额),或对属性进行标准化、分箱、编码等处理。这是最接近表格数据的特征类型。
  2. 拓扑结构特征: 基于图的结构信息提取的特征,包括:
    • 节点度(Degree): 节点的邻居数量,反映节点连接密度。
    • 中心性(Centrality): 如度中心性、介数中心性、接近中心性,衡量节点在图中的重要性。
    • 聚类系数(Clustering Coefficient): 衡量节点邻居之间的连接紧密程度。
    • PageRank / 权威值: 基于随机游走的节点重要性评分。
  3. 邻域聚合特征: 通过聚合邻居节点的属性或结构信息生成的特征,如:
    • 邻居节点属性的均值、方差、最大值。
    • 基于图神经网络(GNN)的嵌入向量。
    • 基于随机游走(如DeepWalk、Node2Vec)的节点嵌入。
图谱特征工程三大类别 图谱特征工程三大类别 图谱特征工程 节点属性特征 拓扑结构特征 邻域聚合特征 子项示例 • 原始属性:年龄、金额、类别 • 标准化 / 分箱 / One-Hot编码 • 缺失值填充 子项示例 • 节点度 / 度分布 • 介数中心性 / 接近中心性 • 聚类系数 / PageRank 子项示例 • 邻居属性均值 / 方差 • GNN嵌入向量 • Node2Vec / DeepWalk
PSI漂移特征选择提示: 在构建图谱PSI漂移监控系统时,建议优先监控“节点度”和“聚类系数”这类拓扑特征,因为它们对图结构的变化非常敏感。同时,对于节点属性特征,应关注其分布随时间的变化,尤其是类别型属性的频次漂移。

4.3.1 特征工程代码示例:提取节点度与聚类系数

以下Python代码使用NetworkX库从图谱数据中提取基础的拓扑结构特征:

import networkx as nx
import pandas as pd

# 假设已有图对象 G(nx.Graph 或 nx.DiGraph)
# G 包含节点和边,节点可能有属性

# 1. 提取节点度特征
degree_dict = dict(G.degree())
degree_df = pd.DataFrame(list(degree_dict.items()), columns=['node_id', 'degree'])

# 2. 提取聚类系数特征(仅适用于无向图)
clustering_dict = nx.clustering(G)
clustering_df = pd.DataFrame(list(clustering_dict.items()), columns=['node_id', 'clustering_coefficient'])

# 3. 合并特征
feature_df = degree_df.merge(clustering_df, on='node_id', how='outer')
feature_df.fillna(0, inplace=True)

print(feature_df.head())
# 输出示例:
#   node_id  degree  clustering_coefficient
# 0   U001       5                    0.250
# 1   U002       3                    0.333
# 2   U003       8                    0.125

这些特征将作为后续PSI漂移计算的输入变量。在实际生产环境中,建议将特征提取封装为定时任务,并存储特征分布的快照用于漂移对比。