当前位置: 首页 > ds >正文

图机器学习(20)——欺诈交易检测算法

图机器学习(20)——欺诈交易检测算法

    • 0. 前言
    • 1. 欺诈检测
    • 2. 基于监督学习的欺诈交易识别
    • 3. 基于无监督学习的欺诈交易识别
    • 小结

0. 前言

随着电子商务平台的兴起,在线支付系统的普及,欺诈案件也在增加。例如,使用被盗信用卡进行的交易就是一种典型的欺诈行为——这类交易模式必然与信用卡原持有人的正常消费存在显著差异。然而,构建自动检测欺诈交易的程序可能是一个复杂的问题,因为涉及的变量数量庞大。
我们已经学习了如何将信用卡交易数据转化为图结构,在本节中,我们将运用机器学习算法实现欺诈交易的自动识别。逐步处理数据集,最终构建一套完整的欺诈检测算法。

1. 欺诈检测

在本节中,我们将阐述如何利用二分图与三分图,通过图机器学习算法构建基于监督式与非监督式方法的欺诈自动检测流程。交易行为在图中以边表示,因此我们的核心任务是对每条边进行正确分类:欺诈性交易或真实交易。执行分类任务的流程如下:

  • 针对数据不平衡任务的采样方案
  • 采用无监督嵌入算法为每条边生成特征向量
  • 在已定义的特征空间上应用监督式与无监督式机器学习算法

2. 基于监督学习的欺诈交易识别

由于数据集存在严重不平衡问题(欺诈交易仅占全部交易的 2.83%),我们需要采用技术手段处理数据失衡。本节将使用简单的随机欠采样策略:从多数类(真实交易)中抽取与少数类(欺诈交易)数量匹配的子样本,此外,我们也可以使用孤立森林等离群点检测算法将欺诈交易识别为数据异常点。

(1) 实现随机欠采样:

from sklearn.utils import resampledf_majority = df[df.is_fraud==0]
df_minority = df[df.is_fraud==1]df_maj_dowsampled = resample(df_majority,n_samples=len(df_minority),random_state=42)df_downsampled = pd.concat([df_minority, df_maj_dowsampled])print(df_downsampled.is_fraud.value_counts())
G_down = build_graph_bipartite(df_downsampled)

(2) 应用 sklearn 包的 resample 函数过滤原始数据框的负采样函数。然后,函数构建一个创建三部图,使用 build_graph_tripartite 函数集:

from sklearn.model_selection import train_test_splittrain_edges, test_edges, train_labels, test_labels = train_test_split(list(range(len(G_down.edges))), list(nx.get_edge_attributes(G_down, "label").values()), test_size=0.20)

(3) 使用 Node2Vec 算法构建特征空间:

from node2vec import Node2Vec
from node2vec.edges import HadamardEmbedder, AverageEmbedder, WeightedL1Embedder, WeightedL2Embeddernode2vec_train = Node2Vec(train_graph, weight_key='weight')
model_train = node2vec_train.fit(window=10)

Node2Vec 的结果用于构建边嵌入,生成用于分类器的最终特征空间。

(4) 对于每个 Edge2Vec 算法,使用先前计算的 Node2Vec 算法来生成特征空间;然后,使用 sklearn 库中的 RandomForestClassifier 对生成的特征集进行训练;最后,在验证测试上计算不同的性能指标,即精准度、召回率和F1分数:

from sklearn.ensemble import RandomForestClassifier 
from sklearn import metrics classes = [HadamardEmbedder, AverageEmbedder, WeightedL1Embedder, WeightedL2Embedder]
for cl in classes:embeddings_train = cl(keyed_vectors=model_train.wv) train_embeddings = [embeddings_train[str(edgs[x][0]), str(edgs[x][1])] for x in train_edges]test_embeddings = [embeddings_train[str(edgs[x][0]), str(edgs[x][1])] for x in test_edges]rf = RandomForestClassifier(n_estimators=1000, random_state=42) rf.fit(train_embeddings, train_labels); y_pred = rf.predict(test_embeddings)print(cl)print('Precision:', metrics.precision_score(test_labels, y_pred)) print('Recall:', metrics.recall_score(test_labels, y_pred)) print('F1-Score:', metrics.f1_score(test_labels, y_pred))

二分图上的模型性能表现如下:

嵌入算法准确率召回率F1 值
HADAMARD0.730.760.75
AVERAGE0.710.790.75
WEIGHTED L10.640.780.70
WEIGHTED L20.630.780.70

三分图上的模型性能表现如下:

嵌入算法准确率召回率F1 值
HADAMARD0.890.290.44
AVERAGE0.740.450.48
WEIGHTED L10.660.460.55
WEIGHTED L20.660.470.55

从结果可以看出,这两种方法在 F1 值、精确率和召回率指标上表现出显著差异。具体而言,三分图在精确率上优于二分图,二分图在召回率指标上表现更佳。因此,我们可以得出结论,在此特定场景下,使用二分图可能是更优选择,因为与三分图相比,二分图在节点和边数量更少的情况下仍能实现较高的 F1 值表现。

3. 基于无监督学习的欺诈交易识别

同样的方法也可应用于基于 k-means 的无监督任务,主要区别在于生成的特征空间无需进行训练-验证集划分。接下来,我们将在经过下采样处理生成的完整图上执行 Node2Vec 算法:

nod2vec_unsup = Node2Vec(G_down, weight_key='weight')
unsup_vals = nod2vec_unsup.fit(window=10)

如监督分析中所定义的,在构建节点特征向量时,我们可以采用不同的 Edge2Vec 算法来运行 k-means 聚类。
首先,针对每种 Edge2Vec 算法,使用先前在训练集和验证集上计算的 Node2Vec 结果来生成特征空间;然后,调用 sklearn 库中的 KMeans 聚类算法,对生成的特征集进行拟合;最后,计算多种性能指标,包括调整互信息 (adjusted mutual information, AMI)、同质性、完整性以及 v-measure 得分:

from sklearn.cluster import KMeansclasses = [HadamardEmbedder, AverageEmbedder, WeightedL1Embedder, WeightedL2Embedder]
true_labels = [x for x in nx.get_edge_attributes(G_down, "label").values()]for cl in classes:embedding_edge = cl(keyed_vectors=unsup_vals.wv) embedding = [embedding_edge[str(x[0]), str(x[1])] for x in G_down.edges()]kmeans = KMeans(2, random_state=42).fit(embedding)ami = metrics.adjusted_mutual_info_score(true_labels, kmeans.labels_)ho = metrics.homogeneity_score(true_labels, kmeans.labels_)co = metrics.completeness_score(true_labels, kmeans.labels_)vmeasure = metrics.v_measure_score(true_labels, kmeans.labels_)print(cl)print('AMI:', ami)print('Homogeneity:', ho)print('Completeness:', co)print('V-Measure:', vmeasure)

该方法可同时适用于二分图和三分图,通过无监督算法解决欺诈检测任务。下表展示了二分图的性能表现:

嵌入算法AMI同质性完整性v-measure 得分
HADAMARD0.340.330.360.34
AVERAGE0.070.070.070.07
WEIGHTED L10.060.060.060.06
WEIGHTED L20.050.050.050.05

下表展示了三分图的性能表现:

嵌入算法AMI同质性完整性v-measure 得分
HADAMARD0.440.440.450.44
AVERAGE0.060.060.060.06
WEIGHTED L10.0010.0010.000.06
WEIGHTED L20.00040.00040.00040.0004

在以上两表中,我们展示了应用无监督算法时二分图与三分图的分类性能表现。从结果可见,这两种方法存在显著差异。值得注意的是,在此场景下,使用 Hadamard 嵌入算法的性能明显优于其他方法。
此任务中,三分图的性能同样超越了二分图。在无监督学习环境下,引入交易节点能够有效提升整体性能。基于该特定用例及表中数据,我们可以断言:在无监督设置中,采用三分图是更优选择,因其相较二分图能够实现更卓越的性能表现。

小结

在本节中,我们描述了如何将经典的欺诈检测任务转化为图问题,并且使用图机器学习技术来解决此问题。我们分别采用监督学习与无监督学习算法解决欺诈检测问题,并对比了二分图与三分图的性能表现。针对原始数据集中合法交易占主导的不平衡问题,我们首先进行简单下采样处理。在监督任务中,我们结合随机森林算法应用多种 Edge2Vec 算法;在无监督任务中则采用 k-means 算法,均获得了良好的分类性能。

http://www.xdnf.cn/news/16269.html

相关文章:

  • 阿里视频直播解决方案VS(MediaMTX + WebRTC) 流媒体解决方案
  • 从零构建:Jenkins与Kubernetes集成的完整指南
  • 10分钟搭建脚手架:Spring Boot 3.2 + Vue3 前后端分离模板
  • 【C# 找最大值、最小值和平均值及大于个数和值】2022-9-23
  • nat. metab.(IF=20.8)|北医三院徐明教授团队:TGR5抑制脂肪酸摄取预防糖尿病性心肌病的机制新解
  • Spark 之 DataFrame
  • GEMINUS 和 Move to Understand a 3D Scene
  • ElasticSearch基础数据查询和管理详解
  • 7月23日华为机考真题第一题100分
  • 实验室信息管理系统的设计与实现/实验室管理系统
  • Prometheus介绍
  • C/C++中的内存管理
  • [Linux入门] Linux 文件系统与日志分析入门指南
  • arm64架构开发板上调用奥比中光深度摄像头用于视觉测距
  • 判断矩形能否放入多边形内——cad c# 二次开发实现
  • 初识opencv02——图像预处理1
  • 软硬件协同仿真和验证的标准接口协议SCE-MI简介
  • Spring语法2
  • HTML5 网页游戏设计开发——1、HTML基础
  • PowerShell自动化核对AD与HR系统账户信息实战指南
  • 趣玩-Ollama-Llm-Chatrbot
  • Flask框架全面详解
  • DeepSeek Janus Pro本地部署与调用
  • 技术速递|使用 Semantic Kernel 与 A2A 协议构建多智能体解决方案
  • 三大论坛联动,2025合成生物学盛会助力生物制造高质量发展
  • AI安全“面壁计划”:我们如何对抗算法时代的“智子”封锁?
  • 直播软件搭建与原生直播系统开发全解析
  • 架构师--缓存场景
  • 【Linux-云原生-笔记】Haproxy相关
  • SQL难点突破之复杂业务逻辑的SQL查询实战