使用实体解析和图形神经网络进行欺诈检测

图形神经网络的表示形式(作者使用必应图像创建器生成的图像)

一、说明

        对于金融、电子商务和其他相关行业来说,在线欺诈是一个日益严重的问题。为了应对这种威胁,组织使用基于机器学习和行为分析的欺诈检测机制。这些技术能够实时检测异常模式、异常行为和欺诈活动。

        不幸的是,通常只考虑当前交易,例如订单,或者该过程仅基于客户配置文件中的历史数据,这些数据由客户ID标识。但是,专业欺诈者可能会使用低价值交易创建客户资料,以建立其个人资料的正面形象。此外,他们可能会同时创建多个类似的配置文件。只有在欺诈发生后,被攻击的公司才意识到这些客户资料是相互关联的。

        使用实体解析,可以轻松地将不同的客户档案组合到一个 360° 客户视图中,从而可以查看所有历史交易的全貌。虽然在机器学习中使用这些数据,例如使用神经网络甚至简单的线性回归,已经为生成的模型提供了额外的价值,但真正的价值来自于观察各个交易如何相互连接。这就是图神经网络(GNN)发挥作用的地方。除了查看从事务记录中提取的特征外,它们还提供了查看从图形边缘生成的特征(事务如何相互链接)甚至只是实体图的一般布局的可能性。

二、示例数据

        在我们深入研究细节之前,我有一个免责声明要在这里提出:我是开发人员和实体解析专家,而不是数据科学家或 ML 专家。虽然我认为一般方法是正确的,但我可能没有遵循最佳实践,也无法解释某些方面,例如隐藏节点的数量。使用本文作为灵感,并在GNN布局或配置方面借鉴您自己的经验。

        出于本文的目的,我想重点介绍从实体图布局中获得的见解。为此,我创建了一个生成实体的小 Golang 脚本。每个实体都被标记为欺诈性或非欺诈性,由记录(订单)和边缘(这些订单的链接方式)组成。请参阅以下单个实体的示例:

{"fraud":1,"records":[{"id":0,"totalValue":85,"items":2},{"id":1,"totalValue":31,"items":4},{"id":2,"totalValue":20,"items":9}],"edges":[{"a":1,"b":0,"R1":1,"R2":1},{"a":2,"b":1,"R1":0,"R2":1}]
}

        每条记录有两个(潜在)特征,即总价值和购买的物品数量。但是,生成脚本完全随机化了这些值,因此在猜测欺诈标签时,它们不应提供价值。每个边还具有两个特征 R1 和 R2。例如,这些可以表示两个记录A和B是通过相似的名称和地址(R1)还是通过相似的电子邮件地址(R2)链接的。此外,我故意省略了与此示例无关的所有属性(姓名、地址、电子邮件、电话号码等),但通常事先与实体解析过程相关。由于 R1 和 R2 也是随机的,它们也不能为 GNN 提供价值。但是,根据欺诈标签,边缘以两种可能的方式布局:星形布局(欺诈=0)或随机布局(欺诈=1)。

        这个想法是,非欺诈性客户更有可能提供准确匹配的相关数据,通常是相同的地址和相同的名称,这里和那里只有几个拼写错误。因此,新交易可能会被识别为重复交易。

重复数据删除的实体(图片由作者提供)

        欺诈性客户可能希望使用各种名称和地址隐藏他们仍然是计算机后面的同一个人的事实。但是,实体解析工具可能仍可识别相似性(例如地理和时间相似性、电子邮件地址中的重复模式、设备 ID 等),但实体图可能看起来更复杂。

复杂,可能是欺诈实体(图片来源:作者)

        为了使它不那么简单,生成脚本还具有 5% 的错误率,这意味着当实体具有类似星形的布局时,它们被标记为欺诈性,而随机布局则标记为非欺诈性。此外,在某些情况下,数据不足以确定实际布局(例如,只有一条或两条记录)。

{"fraud":1,"records":[{"id":0,"totalValue":85,"items":5}],"edges":[]
}

        实际上,您很可能会从所有三种要素(记录属性、边属性和边布局)中获得有价值的见解。下面的代码示例将考虑这一点,但生成的数据不会。

三、创建数据集

        该示例使用 python(数据生成除外)和带有 pytorch 后端的 DGL。您可以在github上找到完整的jupyter笔记本,数据和生成脚本。

        让我们从导入数据集开始:

import osos.environ["DGLBACKEND"] = "pytorch"
import pandas as pd
import torch
import dgl
from dgl.data import DGLDatasetclass EntitiesDataset(DGLDataset):def __init__(self, entitiesFile):self.entitiesFile = entitiesFilesuper().__init__(name="entities")def process(self):entities = pd.read_json(self.entitiesFile, lines=1)self.graphs = []self.labels = []for _, entity in entities.iterrows():a = []b = []r1_feat = []r2_feat = []for edge in entity["edges"]:a.append(edge["a"])b.append(edge["b"])r1_feat.append(edge["R1"])r2_feat.append(edge["R2"])a = torch.LongTensor(a)b = torch.LongTensor(b)edge_features = torch.LongTensor([r1_feat, r2_feat]).t()node_feat = [[node["totalValue"], node["items"]] for node in entity["records"]]node_features = torch.tensor(node_feat)g = dgl.graph((a, b), num_nodes=len(entity["records"]))g.edata["feat"] = edge_featuresg.ndata["feat"] = node_featuresg = dgl.add_self_loop(g)self.graphs.append(g)self.labels.append(entity["fraud"])self.labels = torch.LongTensor(self.labels)def __getitem__(self, i):return self.graphs[i], self.labels[i]def __len__(self):return len(self.graphs)dataset = EntitiesDataset("./entities.jsonl")
print(dataset)
print(dataset[0])

        这将处理实体文件,这是一个 JSON 行文件,其中每行表示一个实体。在迭代每个实体时,它会生成边特征(形状为 [e, 2]、e=边数的长张量)和节点特征(形状为 [n, 2] 的长张量,n=节点数)。然后,它继续基于 a 和 b(每个长张量具有形状 [e, 1])构建图形,并将边和图形特征分配给该图形。然后将所有生成的图形添加到数据集中。

四、模型架构

        现在我们已经准备好了数据,我们需要考虑GNN的架构。这是我想出来的,但可能可以根据实际需求进行更多调整:

import torch.nn as nn
import torch.nn.functional as F
from dgl.nn import NNConv, SAGEConvclass EntityGraphModule(nn.Module):def __init__(self, node_in_feats, edge_in_feats, h_feats, num_classes):super(EntityGraphModule, self).__init__()lin = nn.Linear(edge_in_feats, node_in_feats * h_feats)edge_func = lambda e_feat: lin(e_feat)self.conv1 = NNConv(node_in_feats, h_feats, edge_func)self.conv2 = SAGEConv(h_feats, num_classes, "pool")def forward(self, g, node_features, edge_features):h = self.conv1(g, node_features, edge_features)h = F.relu(h)h = self.conv2(g, h)g.ndata["h"] = hreturn dgl.mean_nodes(g, "h")

构造函数采用节点要素数、边要素数、隐藏节点数和标签(类)数。然后,它创建两个层:一个基于边和节点特征计算隐藏节点的 NNConv 层,然后是一个基于隐藏节点计算结果标签的 GraphSAGE 层。

五、培训和测试

        快到了。接下来,我们准备用于训练和测试的数据。

from torch.utils.data.sampler import SubsetRandomSampler
from dgl.dataloading import GraphDataLoadernum_examples = len(dataset)
num_train = int(num_examples * 0.8)train_sampler = SubsetRandomSampler(torch.arange(num_train))
test_sampler = SubsetRandomSampler(torch.arange(num_train, num_examples))train_dataloader = GraphDataLoader(dataset, sampler=train_sampler, batch_size=5, drop_last=False
)
test_dataloader = GraphDataLoader(dataset, sampler=test_sampler, batch_size=5, drop_last=False
)

        我们使用随机抽样以 80/20 的比例进行拆分,并为每个样本创建一个数据加载器。最后一步是用我们的数据初始化模型,运行训练,然后测试结果。

h_feats = 64
learn_iterations = 50
learn_rate = 0.01model = EntityGraphModule(dataset.graphs[0].ndata["feat"].shape[1],dataset.graphs[0].edata["feat"].shape[1],h_feats,dataset.labels.max().item() + 1
)
optimizer = torch.optim.Adam(model.parameters(), lr=learn_rate)for _ in range(learn_iterations):for batched_graph, labels in train_dataloader:pred = model(batched_graph, batched_graph.ndata["feat"].float(), batched_graph.edata["feat"].float())loss = F.cross_entropy(pred, labels)optimizer.zero_grad()loss.backward()optimizer.step()num_correct = 0
num_tests = 0
for batched_graph, labels in test_dataloader:pred = model(batched_graph, batched_graph.ndata["feat"].float(), batched_graph.edata["feat"].float())num_correct += (pred.argmax(1) == labels).sum().item()num_tests += len(labels)acc = num_correct / num_tests
print("Test accuracy:", acc)

        我们通过提供节点和边的特征大小(在我们的例子中都是 2)、隐藏节点 (64) 和标签数量(2,因为它要么是欺诈,要么不是欺诈)来初始化模型。然后以 0.01 的学习率初始化优化器。之后,我们总共运行 50 次训练迭代。训练完成后,我们使用测试数据加载器测试结果并打印结果的准确性。

        对于各种运行,我的典型准确度在 70% 到 85% 的范围内。但是,除了少数例外,降至55%左右。

六、结论

        鉴于我们的示例数据集中唯一可用的信息是解释节点是如何连接的,初步结果看起来非常有希望,并表明通过真实世界的数据和更多的训练可以实现更高的准确率。

斯特凡·伯克纳

        显然,在处理真实数据时,布局并不那么一致,并且没有在布局和欺诈行为之间提供明显的相关性。因此,您还应考虑边缘和节点功能。本文的关键要点应该是,实体解析为使用图形神经网络的欺诈检测提供了理想的数据,并且应被视为欺诈检测工程师工具库的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/64230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0创建vite+vue3项目遇到的一些坑

使用ws自动创建的vitevue3项目后设置不了alias 答:不懂原理,但是有其他方法解决。直接在命令行执行“npm init vitelatest"后,一路选下去有create-vue的选项,就选这个create-vue创建;创建后会自动导入一个叫node…

滑动窗口最大值

题目链接 滑动窗口最大值 题目描述 注意点 只可以看到在滑动窗口内的 k 个数字返回 滑动窗口中的最大值1 < k < nums.length 解答思路 首先使用双端队列解决本题&#xff0c;队列中存储的是元素在数组中的下标&#xff0c;不断往队尾添加元素下标。在双端队列中&…

【图解算法数据结构】分治算法篇 + Java代码实现

文章目录 一、重建二叉树二、数值的整数次方三、打印从 1 到最大的 n 位数四、二叉搜索树的后序遍历序列五、数组中的逆序对 一、重建二叉树 public class Solution {int[] preorder;HashMap<Integer, Integer> dic new HashMap<>();public TreeNode buildTree(in…

算法:分治思想处理归并递归问题

文章目录 算法原理实现思路典型例题排序数组数组中的逆序对计算右侧小于当前元素的个数 总结 算法原理 利用归并思想进行分治也是很重要的一种思路&#xff0c;在解决逆序对的问题上有很大的需求空间 于是首先归并排序是首先的&#xff0c;归并排序要能写出来&#xff1a; c…

Linux学习之vsftpd虚拟用户

/etc/vsftpd/vsftpd.conf里边有几项跟vsftpd虚拟用户有关的主要配置&#xff1a; guest_enableYES&#xff0c;允许匿名用户登录vsftpd guest_usernamevirtual&#xff0c;指定虚拟用户账户为virtual&#xff0c;就是把虚拟用户映射成Linux本地用户&#xff0c;这样可以使用Lin…

【C++】C++11新特性(下)

上篇文章&#xff08;C11的新特性&#xff08;上&#xff09;&#xff09;我们讲述了C11中的部分重要特性。本篇接着上篇文章进行讲解。本篇文章主要进行讲解&#xff1a;完美转发、新类的功能、可变参数模板、lambda 表达式、包装器。希望本篇文章会对你有所帮助。 文章目录 一…

用反射实现自定义Java对象转化为json工具类

传入一个object类型的对象获取该对象的class类getFields方法获取该类的所有属性对属性进行遍历&#xff0c;并且拼接成Json格式的字符串&#xff0c;注意&#xff1a;通过属性名来推断方法名获取Method实例通过invoke方法调用 public static String objectToJsonUtil(Object o…

MVC模式分层练习

新建库 新建表 插入点数据 先不用MVC模式写功能,来看下缺点是什么 新建一个空项目 选项项目使用的JDK 自己的IDEA总是要重启下 新建模块 因maven还没教 添加框架支持 添加后项目多了这些 添加些必要依赖 这里注意下,如果导入jar包不对可以重新导入下或者是jar包本身出了问…

C语言每日一练--------Day(8)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;图片整理 寻找数组下标 &#x1f493;博主csdn个人主页&#xff1a;小小…

安防监控/视频存储/视频汇聚平台EasyCVR接入海康Ehome车载设备出现收流超时的原因排查

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚平台既具…

C++ for 循环

for 循环允许您编写一个执行特定次数的循环的重复控制结构。 语法 C 中 for 循环的语法&#xff1a; for ( init; condition; increment ) {statement(s); }下面是 for 循环的控制流&#xff1a; init 会首先被执行&#xff0c;且只会执行一次。这一步允许您声明并初始化任…

1688API技术解析,实现关键词搜索淘宝商品(商品详情接口等)批量获取,可高并发

要使用1688API接口采集商品详情&#xff0c;可以按照以下步骤进行&#xff1a; 获取API接口权限&#xff1a;申请1688的app key和app secret&#xff0c;并获取access_token。 编写API请求代码&#xff1a;使用Python等编程语言&#xff0c;编写API请求代码。以下是一个Python…

ARM Cortex-M 的 SP

文章目录 1、栈2、栈操作3、Cortex-M中的栈4、MDK中的SP操作流程5、Micro-Lib的SP差别1. 使用 Micro-Lib2. 未使用 Micro-Lib 在嵌入式开发中&#xff0c;堆栈是一个很基础&#xff0c;同时也是非常重要的名词&#xff0c;堆栈可分为堆 (Heap) 和栈 (Stack) 。 栈(Stack): 一种…

【Maven】如何发现,定位,解决依赖冲突

发现冲突 运行的时候可能报出错误xx类找不到xx方法&#xff0c;xx类找不到&#xff0c;很有可能就是冲突导致的。 定位冲突根因 通过idea maven插件 idea安装插件&#xff0c;maven helper 比如我有两个依赖&#xff0c;guava和findbug。 他们都用到了jsr305&#xff0c;…

可观测性用观测云,观测云护航「杭州亚运会」

2023 年亚洲运动会定于 2023 年 9 月 23 日至 10 月 8 日在中国杭州举办&#xff0c;这是在党的二十大召开后&#xff0c;我国疫情防控措施优化调整后举办的最大规模、最高水平的国际综合性运动会&#xff0c;意义十分重大。杭州亚组委以「举办一届史上最成功的亚运会」为工作目…

14:00面试,14:08就出来了,问的问题有点变态

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

C++的多重继承

派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。 …

Java后端开发面试题——集合篇

ArrayList底层的实现原理是什么 底层数据结构 ArrayList底层是用动态的数组实现的 初始容量 ArrayList初始容量为0&#xff0c;当第一次添加数据的时候才会初始化容量为10 扩容逻辑 ArrayList在进行扩容的时候是原来容量的1.5倍&#xff0c;每次扩容都需要拷贝数组 添加逻…

六、vim编辑器的使用

1、编辑器 (1)编辑器就是一款软件。 (2)作用就是用来编辑文件&#xff0c;譬如编辑文字、编写代码。 (3)Windows中常用的编辑器&#xff0c;有自带的有记事本(notepad)&#xff0c;比较好用的notepad、VSCode等。 (4)Linux中常用的编辑器&#xff0c;自带的最古老的vi&…

什么是Flex容器和Flex项目(Flex Container and Flex Item)?它们之间有什么关系?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Flex容器和Flex项目⭐ Flex容器⭐ Flex项目⭐ 关系⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为…