图数据库初探相关——1.Simulating Mobile Money Fraud pt.1(模拟移动支付诈骗)翻译
原文链接:https://www.sisu.io/posts/paysim/1. 介绍欺诈检测和发现是图数据库最受欢迎的应用领域之一,特别是在金融服务行业。但是对于不在银行或者保险公司工作的人来说,很难用真实数据进行试验和学习。因此对于使用机器学习或启发式方法研究欺诈检测的人来说,缺乏真实数据是一个很严峻的问题。Lopez-Rojas, Elmire和 Axelsson三人推出了一个叫PaySim
原文链接:https://www.sisu.io/posts/paysim/
文章目录
1. 介绍
- 欺诈检测和发现是图数据库最受欢迎的应用领域之一,特别是在金融服务行业。但是对于不在银行或者保险公司工作的人来说,很难用真实数据进行试验和学习。因此对于使用机器学习或启发式方法研究欺诈检测的人来说,缺乏真实数据是一个很严峻的问题。
- Lopez-Rojas, Elmire和 Axelsson三人推出了一个叫PaySim的数据集,使用了一个基于代理的模型和一些匿名的聚合的交易数据,这些数据来自真实的移动支付网络操作,以此创建了合成金融数据集,研究人员和黑客可以使用这个数据集来进行欺诈行为检测。
- PaySim模拟器的github地址:https://github.com/EdgarLopezPhD/PaySim
- 原始数据集位于:https://www.kaggle.com/ntnu-testimon/paysim1
原文链接已失效,代替链接:https://www.kaggle.com/ealaxi/paysim1 - striped vs homogenous fingerprints of genuine and fraudulent transactions over time
随着时间推移,真实的交易的条形图像和欺诈交易的均匀图像对比
(简单来说,就是正常的交易应该都是现金支付明显更多,而欺诈交易比正常交易的转账业务多!)
- 有很多不错的博客都阐述了PaySim的结果,不管是几年前基于机器学习的方法还是最近一段的使用TensorFlow的基于谷歌云AI平台构建的预测模型。
- 但是,所有基于机器学习的方法都有一个共同点,他们都说明了PaySim的致命缺点,尤其是它对特定类型的欺诈的建模过于简单。所以这些模型都利用了PaySim对欺诈者的逻辑过于简单这一事实。
- 所以接下来考虑使用
neo4j
来识别欺诈者,看是否可以有所提高 。
2. 背景:移动支付入门💸
- 想要理解PaySim,首先需要了解它是如何建模的,尤其是移动货币网络
- 移动货币有不同的形式,但是对于PaySim来说,它包括银行和参与的商家(Merchants)。商家可以通过网络进行移动支付(用于物品或者服务),也可以把钱放到网络中(比如:账户充值)(e.g. “topping up” an account).
- 听起来很像Apple Pay,这是因为手机支付服务实际上就是一种移动货币
- PaySim作者使用的移动货币网络来自于一个目前未公开的非洲国家,这让我们相信它更类似于M-Pesa
M-Pesa的 Wikipedia页面:
M-Pesa 是一种无网点银行服务; M-Pesa 客户可以从网络代理存款和取款,网络代理主要包括像银行代理一样的经销商和零售网点。 - 所以可以把它看成是向Apple Pay一样的东西, 只是这个还可以通过参与的商家来进行存款。
3. PaySim概览
如果PaySim模型模拟的是金融交易,那么它看起来就像下面这样,看下图,接下来要深入了解模拟的核心组件:代理(Agents)和交易(Transactions)
PaySim数据模型的图形表示
- PaySim是一个多代理模拟,随着时间推移,在每一步上,代理都被允许可以改变自己的状态和其余模拟状态。一开始听起来可能有些困惑,实际上,PaySim就只有一个核心功能:
用户在每个时间步执行0个或多个交易,与网络中的其他代理(尤其是银行,商家和其他用户)交换资金。
- 这里可以详细看看PaySim模拟的代理的类型以及交易的类型。
3.1 代理类型
Agents are the key actors, meaning they can perform actions in the simulation. There are three (3) primary agent types and a few subtypes as well.
代理是关键角色,意味着他们在模拟中可以执行操作。有三种主要的代理类型以及一些子类型
💳客户
Clients建模移动支付网络中的终端用户,实际是映射到一个唯一的账户,理论上是由真人控制的。由于Clients建模人群,而我们关心的主要是建模欺诈,因此在模拟中并非所有人的行为都相同。
- 一些Clients是欺诈者,操纵网络和其他用户为了自己的利益。
- 一些Clients仅仅充当骡子(中间节点),这是一种移动资金并最终移出网络的手段
- 大部分Clients表现的就如同进行交易那样很正常,像社区的好成员一样。
🏬 商户
Merchants对供应商或者是通过与Clients交互参与网络的商家进行建模
- Merchants充当网络中的网关,允许资产流入或流出网络
- Merchants在网络上中提供货物或者服务,来交换资金,就像传统的供应商一样。
🏦 银行
- 银行在PaySim显得相当懒惰,仅仅充当借记交易的目标。其在PaySim中扮演一个相对受限的角色,可能是由于其在移动货币网络PaySim模型中不是一个关键的组件(比如,考虑一下这个观点:一些移动货币网络能存在于市场,就是因为其中的客户银行存款不够under banked)
- 银行扮演的唯一角色就是促进借记交易,更像是从网络中客户的余额中借记,就好像他们把钱转回实际的银行账户一样。
3.2 交易
-
Transactions形成了PaySim的基石,交易是客户和代理交互的唯一真实的方式。事实上,客户是进行交易的唯一代理。
虽然在显示世界中,一场金融交易可以由银行、商户等发起,但是PaySim完全关注客户的行为 -
客户在模拟的每个回合中可以做些什么?即交易类型,如下所示,每次有五种可能的交易选择
ransaction Description ashIn A Client moves money into the network via a Merchant ashOut A Client moves money out of the network via a Merchant ebit A Client moves money into a Bank ransfer A Client sends money to another Client ayment A Client exchanges money for something from a Merchant -
从上到下,依次是:
- 现金流入(通过商家把钱充入网络),
- 现金流出(通过商家把钱拿出网络),
- 借记(把钱存入银行),
- 转账(把钱给另一个客户),
- 付款(用钱交换商家的某些东西)
根据交易类型,应用特定的规则:
- 每个交易都必须有第二个代理(受支持的类型),取决于交易类型
- 只有在零和的情况下,客户之间的转账才需要适当的复式记账。 (推论:可以通过商人和银行增加/减少模拟的货币供应量。)
- 转移金额必须低于模拟开始前在模拟参数中设置的全局转移限制。 对于较大的转移,它们必须分解为多个交易。
3.3 逐步进行
最后一件需要关于PaySim需要了解的是,模拟是以离散的方式运行的。在每一步中,每个代理(以某种确定的顺序)都有机会采取行动
以PaySim为例:
- 每个步骤对应一小时的时间
- 代理,尤其是客户,每步可能会进行0次或多次行动
- PySim内部的限制上限时:720步,或者30天的模拟时间
从代码角度,模拟中的每一个代理都需要实现一个简单的sim.engine.Steppable
接口,模拟将在每一步调用该接口,同时提供对整体模拟状态本身的引用:
/*
Copyright 2006 by Sean Luke and George Mason University
Licensed under the Academic Free License version 3.0
See the file "LICENSE" for more information
*/
package sim.engine;
/** Something that can be stepped */
public interface Steppable extends java.io.Serializable
{
public void step(SimState state);
}
在PaySim中,所有的客户都实现了Steppable
方法,并为他们的行为提供了逻辑
4.👷 提升 PaySim
可以按照原样运行PaySim,开箱即用,生成合成数据,所以为何不用它探索欺诈,构建我们自己的图?想这样做存在一些难点:
- PaySim会把模拟的结果写入csv文件。虽然Neo4j支持加载csv,但是动态加载交易可能会带来更多可能性,比如模拟实时欺诈和行动
- PaySim中的交易数据只包含基本数据,其他一些重要的数据可能需要推断。
- PaySim不会显示记录一次模拟运行中所有的参与者,只能从原始交易输出中进行推测 (不过在代码中会跟踪所有的代理)
PaySim是开源的,所以forked原始代码,更改提交到自己的PaySim2.1.7版本中
深入之前,把我们要进行的修改分为两部分:
- 增强PaySim的结构和可用性 ,让我们可以增强它,同时添加一些新的特性
- 扩展其用于欺诈者的建模,整合两种类型的欺骗,单方欺诈和第三方欺诈(1st and 3rd party)
4.1⬆ 代码更新
PaySim是一个构建在MASON代理模拟框架上的Java程序,,MASON是一个成熟的经过多方验证的包含工具完善的多代理模拟平台。然而,PaySim的作者在实现的时候,让它很难被构建和扩展
我对PaySim的代码改进的高级概览位于分支:https://github.com/voutilad/paysim.
如果对低级的代码修改不感兴趣,可以直接跳到 Enhancing PaySim’s Fraudsters部分
让PaySim更像是一个库而不只是一个APP
首先修复PaySim只输出到文件系统中这个问题。我做了两个主要的改进让PaySim可以作为一个库进行嵌入:
- 从结构中抽象出基本的模拟逻辑,这样原始的PaySim可以写到硬盘上运行,但是开发者可以实现他们想要的实现替代
- 实现PaySim的一个迭代版本,允许嵌入PaySim的APP自己掌握节奏和动态消耗数据,
保留原始的PaySim逻辑,但是前端对于开发者或终端用户是可选的。比如:要运行类似于原始的PaySim项目,在OriginalPaySim
类中运行main()
方法,然后该方法会将期望的结果文件写入硬盘
迭代PaySim实施(高级抽象)
相反,如果你想通过实现Java迭代器<org.paysim.base.Transaction>
来驱动模拟,请使用IteratingPaySim
库并按照顺序使用交易。工作线程在后台驱动模拟,同时数据流通过java实现的一个缓存java.util.ArrayDeque9
实现流动。
增强PaySim的交易和历史
- 这部分做一些相对简单的修改,包括保持原本PaySim逻辑兼容的情况下,对交易部分的实现相对一致。关键的区别是在发送端和接收端添加关于参与者"类型"的信息。
- 由于所有的参与者都派生自
org.paysim.actors.SuperActor
基类,为了一个SuperActor.Type
类型的值(枚举值),他们都实现了一些getter
方法 - 通过在交易中追踪
SuperActor.Type
方法- 不需要保留参与者的引用,如果我们销毁这个模拟器,则他们最终会被JVM的垃圾收集机制处理。
- 更重要的是,这样我们就总能知道交易的参与者属于哪种类型,这使得我们不管是在PaySim追踪客户/商人/银行或者是在我们自己的数据集上,都可以更准确的查找实例。
4.2 增强对PaySim欺诈者的检测
在基础模拟改善的情况下,现在我们就可以为欺诈者的逻辑提供支持。首先看一下原始的PaySim的欺诈者的的表现,然后了解实现单方欺诈和第三方欺诈需要进行的改变。
😏原始的PaySim欺诈者的行为
原始的PaySim看起来只建模了第三方欺诈这一种形式:
- 诈骗者以已经建立的客户账号(受害人)为目标
- 诈骗者触发从受害人到骡子账户(中转,运毒品的人)(欺诈者创建的)的转账交易
- 当骡子账号到达一定的余额水平时,进行现金支出
一个真实的例子可能是有人通过凭证窃取/盗窃或网络钓鱼来破坏某人的移动货币账户。 一旦欺诈者可以使用支付卡,他们就可以通过购买礼品卡或预付卡来兑现,这些礼品卡或预付卡可以反过来使用或出售以转换为实际现金。
是否可以让它看起来更真实一点?
- 诈骗者实体完全耗尽受害者的账户,进行转账操作直到到达网络中模型参数设置的
转账限制
- 在真实世界的信用卡诈骗中,信用卡通常会进行几次小额交易或者是预授权作为测试,然后才可以进行大额的购买。
- PaySim中的诈骗者从模拟世界中随机选择一名受害者
- 实际上,有些行为看起来可能是随机的,但是欺诈者经常会以商家的POS系统(离线或者在线)作为突破口,作为最初获得受害人账户方式。
有了上述想法,就可以先考虑将通用的PaySim变为第三方欺诈者的数据
增强PaySim对第三方欺诈者数据的生成
将会加入一些新的行为,使得这里的第三方欺诈者更接近真实的行为
- 为了模拟商户违规,刷卡等,支持存储
favored
商户,欺诈者将其用作针对客户进行受害的手段 - 跟踪欺诈受害者,是最容易受到欺诈的目标
- 对新的受害者,尝试进行
测试付费
模拟真实世界的卡片测试(小额信用支付,增加信用,增加额度)
和原始的PaySim一样,也保留了第三方欺诈者会创建骡子账户作为从网络中套现的一种方式。
逻辑上,依然保持简单,但是考虑几个关键事件:
- 像原始的PaySim一样测试欺诈概率,如果测试失败,终止此模拟步骤的行动。
- 如果没有受害者,或者传入了一个概率用来选择一个新的受害者,就进入新受害者模式
- 从
favored
商人中随机选择一个商人 - 从商家历史随机中选择一个客户,如果没有
favored
的商家,从模拟世界中随机选择一个客户 - 进行支付交易,作为测试付费
- 如果测试付费成功(即,受害人有非零余额),接下来就尝试进行转移用户余额百分之几到骡子账户的操作。
- 从
- 否则,随机选择一个现存的受害者,尝试转移客户余额的百分之几给骡子账户
参考 ThirdPartyFraudster.java代码查看实施细节
🎭 单方欺诈者(合成)
- 单方欺诈者通常需要对自己进行伪装(虚报个人信息),来建立不用偿还任何债务的信用额度(查看Open Risk Manual中的定义。)
- 一种更有趣的欺诈形式是合成身份欺诈,欺诈者不使用自己的身份信息,而是将真实身份和虚假身份信息混在一起,以便在开户或者获取信用额度时绕过欺诈检测。
- 感觉上应该很容易加到PaySim中,但是PaySim没有提供任何形式的个人信息。
- 首先,必须改变PaySim中建模的关于支付网络的定义,并假设其中一些涉及信用额度。
- 接下来,添加身份信息就很简单了,但是需要大量的对代理(参与者)的修改:我们最终需要所有的客户,不管是欺诈者,骡子还是普通用户,都拥有一些可以标志个人的身份信息。
身份建模
建模的最终效果看起来就类似下图,最简单的一种将身份信息和客户整合在一起的方式就是,将每个客户和一个身份信息实例进行关联。
非常简单的模型,客户有一个或多个身份信息实例
省略关于代码改进的描述
至此,就理解了数据模型,整体长这样:
更新过的PaySim数据模型
翻译下来,最主要的收获大概就是理解的单方欺诈,第三方欺诈,以及为什么上面这个图是这么画的。OK,后面和neo4j交互的部分比较关键吧
更多推荐
所有评论(0)