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

图机器学习(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.dtcms.com/a/295965.html

相关文章:

  • python基础:操作列表
  • 2024年ASOC SCI2区TOP,基于强化学习教与学优化算法RLPS-TLBO+风电场布局优化,深度解析+性能实测
  • 一种宏模板实现方法
  • (实用攻略)Linux操作系统(一)
  • 强制缓存与协商缓存
  • CentOS7 安装 rust 1.82.0
  • C语言转义字符‘\\‘‘ 解析与常见误区
  • 收银系统合作模式全解析:SaaS、私有化部署与开源版选型指南
  • Kylin V10 4070安装nvidia驱动+CUDA+docker安装
  • 循环队列的两种实现
  • Spring AI 系列之二十四 - ModerationModel
  • 每日算法刷题Day52:7.24:leetcode 栈5道题,用时1h35min
  • 前端性能新纪元:Rust + WebAssembly 如何在浏览器中实现10倍性能提升(以视频处理为例)
  • uniapp nvue开发App 横竖屏切换丢失上下文导致 setTimeout和clearTimeout报错
  • [网安工具] 自动化威胁检测工具 —— D 盾 · 使用手册
  • SAP-MM-采购订单批量创建 excel 版
  • 保留5位小数封装一个自定义指令
  • Linux 内核基础统简全解:Kbuild、内存分配和地址映射
  • 10分钟搭建脚手架:Spring Boot 3.2 + Vue3 前后端分离模板
  • Springboot儿童医院问诊导诊系统aqy75(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 使用钉钉开源api发送钉钉工作消息
  • C语言 一文详解常用的字符串操作函数及模拟实现
  • 医疗系统国产化实录:SQL Server国产替代,乙方保命指南
  • DigitalOcean 一键模型部署,新增支持百度开源大模型ERNIE 4.5 21B
  • 集合中Comparable接口和Equals方法的冲突
  • 【Mermaid 离线工具】Mermaid 流程图生成器 - 高清PNG输出,一键生成专业级流程图!
  • 共创养生新时代——2025酵素益生产品展暨中秋滋补选品节即将开启
  • QT6 源(165)模型视图架构里的所有的信号函数概览
  • UNETR++: Delving Into Efficient and Accurate 3D Medical Image Segmentation
  • 深度分析Java内存模型