「我,xxx,打钱……」你收到过这样的短信吗?
其实,利用信息技术进行诈骗的做法,历史可能远超你想象。甚至在互联网还没诞生的年代,通过纸质信件和传真进行诈骗的「尼日利亚王子」骗局就曾在全球范围内广泛流传了。时至今日,通过各种途径,以社会工程学手段开展的在线诈骗行为更是五花八门,让人防不胜防。
今天,我们将从企业角度来看看,该如何用技术手段防范网络骗子们通过自己公司的平台实施诈骗行为。
===
欺诈用户与恶意账户每年可能给企业造成数十亿美元的营收损失。尽管不少企业已经在使用基于规则的筛选器防止系统中存在的各类恶意活动,但这类筛选器往往相当脆弱,而且无法捕捉到全部恶意行为。
另一方面,也有部分解决方案(例如图技术)在检测欺诈者与恶意用户方面表现突出。欺诈者可以调整自身活动以骗过基于规则的系统或者基于特征的简单模型,但却很难伪造图结构,特别是用户与事务/交互日志中其他实体之间的关系。图神经网络(GNN)能够将图结构中的信息同用户或事务的属性相结合,从中提取出有意义的表示形式,最终将恶意用户及事件同合法用户及事件明确区分开来。
本文介绍了如何使用Amazon SageMaker与Deep Graph Library(DGL)训练GNN模型,进而检测恶意用户或欺诈事务。希望使用全托管AWS AI服务以实现欺诈检测的用户,也可以考虑使用Amazon Fraud Detector以显著降低对潜在欺诈性在线活动(例如创建伪造账户或者在线支付欺诈)的识别难度。
下文将重点介绍如何使用Amazon SageMaker进行数据预处理以及模型训练。要训练一套GNN模型,首先需要使用交易表或者访问日志中的信息构建起一套异构图。所谓异构图,是指包含不同类型的节点与边的图。如果以节点代表用户或者事务,则各节点将可反映当前用户与其他用户或者实体(例如设备标识符、机构、应用程序、IP地址等)之间的多种不同关系。
下面来看适用于这套解决方案的部分用例:
- 各用户之间,以及用户与特定金融机构或应用程序之间进行交易的金融网络。
- 用户与其他用户、乃至不同游戏或设备之间持续交互的游戏网络。
- 用户与其他用户间拥有多种不同类型链接的社交网络。
下图所示,为异构金融交易网络的基本架构。
GNN能够合并用户特征(例如人口统计信息)或者交易特征(例如活动频率)。换句话说,我们可以使用节点与边的特征作为元数据,借此丰富异构图表示。在完成异构图中的节点与关系及其关联特征的建立工作之后,就可以训练GNN模型,引导其学习如何使用节点或边特征、外加图结构,将不同节点归类为恶意或者合法节点。模型训练以半监督方式完成 —— 图中需要有一部分节点被预先标记为欺诈或者合法节点。将包含这些标记的子集作为训练信号,我们可以让GNN模型逐渐摸索出最优参数搭配。而后,经过训练的GNN模型即可预测图中剩余的其他未标记节点。
架构
首先,我们可以使用Amazon SageMaker的完整解决方案架构运行处理作业与训练作业。大家可以使用能够对Amazon Simple Storage Service(Amazon S3)PUT事件做出响应的AWS Lambda函数自动触发Amazon SageMaker作业,或通过在示例Amazon SageMaker notebook中运行的单元以手动触发相应作业。下图为这套架构的直观表示:
完整实现可通过GitHub repo获取,其中还带有一套AWS CloudFormation模板,用于在AWS账户中启动整套架构。
GNN欺诈检测准备:数据预处理
在本节中,我们将介绍如何对示例数据集进行预处理,借此确定异构图中各节点间的关系!
数据集
在本用例中,我们使用IEEE-CIS欺诈数据集对建模方法进行基准测试。这是一套匿名数据集,其中包含用户间多达50万笔交易。该数据集中包含两个主表:
- Transactions table:交易表,包含关于交易或用户间交互的信息。
- Identity table:身份表,包含执行交易的具体用户的相关日志访问、设备及网络信息。
我们可以将这些交易中的子集及其标签作为模型训练中的监督信号。对于测试数据集中的交易,其标签在训练期间将被屏蔽。模型的任务非常明确:预测哪些被屏蔽的交易属于欺诈行为,哪些属于合法行为。
以下示例代码将获取数据并将其上传至Amazon SageMaker在预处理与训练(在Jupyter notebook单元中运行)期间访问数据集使用的Amazon S3存储桶:
# Replace with an S3 location or local path to point to your own dataset
raw_data_location = 's3://sagemaker-solutions-us-west-2/Fraud-detection-in-financial-networks/data'
bucket = 'SAGEMAKER_S3_BUCKET'
prefix = 'dgl'
input_data = 's3://{}/{}/raw-data'.format(bucket, prefix)
!aws s3 cp --recursive $raw_data_location $input_data
# Set S3 locations to store processed data for training and post-training results and artifacts respectively
train_data = 's3://{}/{}/processed-data'.format(bucket, prefix)
train_output = 's3://{}/{}/output'.format(bucket, prefix)
尽管欺诈者会努力掩饰自己的恶意活动,但这类行为在图结构中仍然具有非常明显的特征,例如高出度或者活动聚合倾向。以下各节,将说明如何执行特征提取与图构建,进而由GNN模型利用这些模式实现欺诈预测。
特征提取
特征提取包括对分类特征执行数字编码,再对数字列进行一系列转换。例如,我们需要对交易金额进行对数转换以指示金额的相对大小,并可以通过独热编码方法将其类别属性转换为数字形式。对于每一项交易,特征向量都将包含交易表中的固有属性,这些属性中包含有与先前交易相比较的时间增量、名称与地址匹配以及匹配计数等信息。
构建图
要构建完整的交互图,我们需要将数据中的各关系信息划分为与各种关系类型相对应的Edge list。每个Edge list都属于事务节点与其他实体类型之间的二部图。这些实体类型分别构成与事务相关的标识属性。例如,对于交易中使用的卡片类型(借记卡或信用卡),我们可以将其创建为实体类型、完成交易所用设备的IP地址,以及所使用设备的设备ID或操作系统。图构建中使用的实体类型,则包括身份表中所有属性及交易表中属性的子集,例如信用卡信息或者电子邮件域。异构图正是由表示各关系类别的Edge list与节点的特征矩阵所共同构成。
使用Amazon SageMaker Processing
大家可以使用Amazon SageMaker Processing执行数据预处理与特征提取步骤。Amazon SageMaker Processing是Amazon SageMaker中的一项功能,允许大家在全托管基础设施之上运行预处理与后处理工作负载。关于更多详细信息,请参阅处理数据与评估模型。
首先,我们需要定义Amazon SageMaker Processing作业中使用的容器。此容器中应包含数据预处理脚本所需要的全部依赖项。由于本用例中的数据预处理只需要使用Pandas库,因此可以使用最小Dockerfile实现容器定义。具体请参见以下代码:
FROM python:3.7-slim-buster
RUN pip3 install pandas==0.24.2
ENV PYTHONUNBUFFERED=TRUE
ENTRYPOINT ["python3"]
大家可以通过输入以下代码实现容器构建,并将构建完成的容器推送至Amazon Elastic Container Registry(Amazon ECR)镜像仓库:
import boto3
region = boto3.session.Session().region_name
account_id = boto3.client('sts').get_caller_identity().get('Account')
ecr_repository = 'sagemaker-preprocessing-container'
ecr_repository_uri = '{}.dkr.ecr.{}.amazonaws.com/{}:latest'.format(account_id, region, ecr_repository)
!bash data-preprocessing/container/build_and_push.sh $ecr_repository docker
当数据预处理容器准备就绪之后,我们可以创建一个Amazon SageMaker ScriptProcessor,负责使用预处理容器设置处理作业环境。接下来,可以使用ScriptProcessor在容器定义的环境中运行负责具体实现数据预处理的Python脚本。该Python脚本在执行完成并将预处理数据保存回Amazon S3之后,处理作业即告结束。整个过程完全由Amazon SageMaker负责管理。在运行ScriptProcessor时,我们可以选择将参数传递至数据预处理脚本,借此指定交易表中的哪此列应被视为身份列、哪些列属于分类特征。所有其他列则均被假定为数字特征列。具体请参见以下代码:
from sagemaker.processing import ScriptProcessor, ProcessingInput, ProcessingOutput
script_processor = ScriptProcessor(command=['python3'],
image_uri=ecr_repository_uri,
role=role,
instance_count=1,
instance_type='ml.r5.24xlarge')
script_processor.run(code='data-preprocessing/graph_data_preprocessor.py',
inputs=[ProcessingInput(source=input_data,
destination='/opt/ml/processing/input')],
outputs=[ProcessingOutput(destination=train_data,
source='/opt/ml/processing/output')],
arguments=['--id-cols', 'card1,card2,card3,card4,card5,card6,ProductCD,addr1,addr2,P_emaildomain,R_emaildomain',
'--cat-cols',' M1,M2,M3,M4,M5,M6,M7,M8,M9'])
以下示例代码,展示了Amazon SageMaker Processing作业存储在Amazon S3当中的输出结果:
from os import path
from sagemaker.s3 import S3Downloader
processed_files = S3Downloader.list(train_data)
print("===== Processed Files =====")
print('n'.join(processed_files))Output:
===== Processed Files =====
s3://graph-fraud-detection/dgl/processed-data/features.csv
s3://graph-fraud-detection/dgl/processed-data/relation_DeviceInfo_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_DeviceType_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_P_emaildomain_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_ProductCD_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_R_emaildomain_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_TransactionID_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_addr1_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_addr2_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_card1_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_card2_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_card3_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_card4_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_card5_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_card6_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_01_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_02_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_03_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_04_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_05_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_06_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_07_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_08_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_09_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_10_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_11_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_12_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_13_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_14_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_15_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_16_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_17_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_18_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_19_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_20_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_21_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_22_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_23_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_24_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_25_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_26_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_27_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_28_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_29_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_30_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_31_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_32_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_33_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_34_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_35_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_36_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_37_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/relation_id_38_edgelist.csv
s3://graph-fraud-detection/dgl/processed-data/tags.csv
s3://graph-fraud-detection/dgl/processed-data/test.csv
所有关系Edgelist文件,均表示训练期间用于构造异构图的不同类型的边。Features.csv中包含交易节点最终转换后的特征,而tags.csv中则包含作为训练监督信号的节点标签。Test.csv中包含TransactionID数据,作为评估模型性能的测试数据集。这些节点标签在训练期间皆被屏蔽以避免对模型预测产生干扰。
GNN模型训练
现在,我们可以使用Deep Graph Library(DGL)创建图并定义GNN模型,而后使用Amazon SageMaker启动基础设施以训练GNN了。具体而言,我们可以使用关系图卷积神经网络模型学习异构图中节点的嵌入,以及用于最终节点分类的全连接层。
超参数
要训练GNN模型,大家还需要在训练开始之前定义一系列固定的超参数,例如希望构造的图各类、所使用的GNN模型类别、网络架构以及优化器与优化参数等。具体请参见以下代码:
edges = ",".join(map(lambda x: x.split("/")[-1], [file for file in processed_files if "relation" in file]))
params = {'nodes' : 'features.csv',
'edges': 'relation*.csv',
'labels': 'tags.csv',
'model': 'rgcn',
'num-gpus': 1,
'batch-size': 10000,
'embedding-size': 64,
'n-neighbors': 1000,
'n-layers': 2,
'n-epochs': 10,
'optimizer': 'adam',
'lr': 1e-2
}
上述代码中包含一部分超参数。关于超参数及其默认值的更多详细信息,请参见GitHub repo中的estimator_fns.py。
使用Amazon SageMaker训练模型
在超参数定义完成之后,大家现在可以正式启动训练过程了。训练作业使用DGL(以MXNet作为后端深度学习框架)实现GNN模型的定义与训练。Amazon SageMaker提供框架拟合器,其中设置的深度学习框架环境能够极大降低GNN模型的训练难度。关于在Amazon SageMaker上使用DGL训练GNN模型的更多详细信息,请参阅训练深度图网络。
现在,我们可以创建一个Amazon SageMaker MXNet拟合器,并传入模型训练脚本、超参数以及所需的训练实例数量/类型。接下来,大家可在拟合器上调用Fit并传入Amazon S3上的训练数据保存位置。详见以下代码:
from sagemaker.mxnet import MXNet
estimator = MXNet(entry_point='train_dgl_mxnet_entry_point.py',
source_dir='dgl-fraud-detection',
role=role,
train_instance_count=1,
train_instance_type='ml.p2.xlarge',
framework_version="1.6.0",
py_version='py3',
hyperparameters=params,
output_path=train_output,
code_location=train_output,
sagemaker_session=sess)
estimator.fit({'train': train_data})
结果
在GNN模型训练完成之后,该模型已经学会了如何区分合法交易与欺诈交易。训练作业会产生一个pred.csv文件,该文件是模型针对test.csv中交易的预测结果。ROC曲线体现了各种阈值之下正确预报率与误报率之间的关系,其中曲线下面积(AUC)可作为评估指标。通过下图可以看到,我们训练的GNN模型在性能上优于全连接前馈网络、以及使用相同特征但未充分使用图结构的梯度提升树。
总结
在本文中,我们讲解了如何根据用户交易与活动构建异构图,并使用该图及其他收集到的特征训练GNN模型,最终对交易的欺诈性做出预测。本文还介绍了如何使用DGL与Amazon SageMaker定义并训练具备高预测性能的GNN模型。关于此项目的完整实现以及其他GNN模型详细信息,请参见GitHub repo。
另外,我们还介绍了如何实现数据处理,以使用Amazon SageMaker Processing从原始交易数据日志中提取有意义的特征与关系。您可以直接部署示例中提供的CloudFormation模板并传入自己的数据集,借此检测数据中的各恶意用户与欺诈性交易。