Amazon Web Services ブログ

Amazon SageMaker と Deep Graph Library を使用して異種ネットワークの不正を検出する

詐欺的なユーザーや悪意のあるアカウントは、企業にとって年間数十億ドルもの収益の損失につながる可能性があります。多くの企業は、ルールベースのフィルターを使用してシステムでの悪意のあるアクティビティを防止していますが、このようなフィルターは脆弱で、悪意のある動作のすべてをキャプチャできない場合があります。

ただし、グラフ手法などの一部のソリューションは、詐欺師や悪意のあるユーザーの検出に特に適しています。詐欺師は行動を進化させて、ルールベースのシステムや単純な特徴ベースのモデルをだますことができますが、グラフ構造や、トランザクションや対話のログに記録されたユーザーと他のエンティティ間の関係を偽造することは困難です。グラフニューラルネットワーク (GNN) は、グラフ構造からの情報をユーザーやトランザクションの属性と組み合わせて、悪意のあるユーザーやイベントを正当なものと区別できる意味のある表現を学習します。

この記事では、Amazon SageMakerDeep Graph Library (DGL) を使用して GNN モデルをトレーニングし、悪意のあるユーザーや不正なトランザクションを検出する方法を説明します。詐欺検出のためのフルマネージド AWS AI サービスをお求めの企業は、Amazon Fraud Detector を使用することもできます。これにより、偽のアカウントの作成やオンライン支払い詐欺など、潜在的に詐欺的なオンライン活動を簡単に特定できます。

このブログ記事では、Amazon SageMaker を使用したデータの前処理とモデルのトレーニングに焦点を当てています。  GNN モデルをトレーニングするには、最初にトランザクションテーブルやアクセスログの情報を使用して異種グラフを作成する必要があります。異種グラフは、さまざまなタイプのノードとエッジを含むグラフです。ノードがユーザーまたはトランザクションを表す場合、ノードは他のユーザーや、場合によっては他のエンティティ (デバイス識別子、機関、アプリケーション、IP アドレスなど) と異なる種類の関係をいくつか持つことができます。

これに当てはまるユースケースの例には、次のものがあります。

  • ユーザーが他のユーザーまたは特定の金融機関やアプリケーションと取引する金融ネットワーク
  • ユーザーが他のユーザーと対話するだけでなく、個別のゲームやデバイスとやり取りするゲームネットワーク
  • ユーザーが他のユーザーへのさまざまな種類のつながりを持つことができるソーシャルネットワーク

次の図は、異種金融取引ネットワークを示しています。

GNN には、人口統計情報などのユーザーに関する特徴や、アクティビティ頻度などのトランザクションに関する特徴を組み込むことができます。つまり、メタデータとしてのノードとエッジの特徴を用いて、異種グラフ表現を充実させることができます。異種グラフのノードと関係が確立された後、それらに関連する特徴を用いて、ノードまたはエッジの特徴およびグラフ構造の両方を使用して、GNN モデルをトレーニングして、さまざまなノードを悪意のあるノードと正当なノードに分類する方法を学習できます。モデルトレーニングは、半教師ありの方法で設定されます。グラフには、不正または正当とラベル付けされたノードのサブセットがあります。このラベル付けされたサブセットをトレーニング信号として使用して、GNN のパラメータを学習します。トレーニングされた GNN モデルは、ラベルを予測して、グラフ内の残りのラベルなしノードを見つけることができます。

アーキテクチャ

開始するには、Amazon SageMaker を用いた完全なソリューションアーキテクチャを使用できます。これにより、処理ジョブとトレーニングジョブを実行できます。Amazon SageMaker ジョブは、Amazon Simple Storage Service (Amazon S3) put イベントに応答する AWS Lambda 関数を使用して 自動的にトリガーするか、Amazon SageMaker のサンプルノートブックのセルを手動で実行してトリガーできます。次の図は、アーキテクチャを視覚的に表したものです。

完全な実装は、AWS アカウントでアーキテクチャを起動する AWS CloudFormation テンプレートを使用して、GitHub リポジトリで行えます。

GNN による不正検出のためのデータの前処理

このセクションでは、サンプルデータセットを前処理し、異種グラフを構成する関係を識別する方法を示します。

データセット

このユースケースでは、モデリングアプローチのベンチマークに IEEE-CIS 不正データセットを使用しています。これは、ユーザー間の 50 万のトランザクションを含む匿名化されたデータセットです。データセットには次の 2 つのメインテーブルがあります。

  • トランザクションテーブル – トランザクションやユーザー間のやり取りに関する情報が含まれています
  • ID テーブル –トランザクションを実行するユーザーのアクセスログ、デバイス、ネットワーク情報に関する情報が含まれています

これらのトランザクションのサブセットをラベルとともに使用し、モデルトレーニングの監視信号として使用します。テストデータセット内のトランザクションの場合、ラベルはトレーニング中はマスクされます。タスクは、どのマスクされたトランザクションが不正で、どれが不正でないかを予測することです。

次のコード例は、データを取得し、S3 バケットにアップロードします。S3 バケットは、Amazon SageMaker が前処理とトレーニング (これは Jupyter ノートブックセルで実行します) 中にデータセットにアクセスするために使用します。

# 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 モデルがこのようなパターンを利用して不正を予測できるように、特徴を抽出してグラフを作成する方法を示します。

特徴抽出

特徴抽出は、カテゴリ別の特徴に対して数値エンコードを実行することと、数値列を変換することで構成されています。たとえば、トランザクションの金額は対数的に変換され、金額の相対的な大きさを示します。また、ホットエンコーディングを実行することにより、カテゴリ属性を数値形式に変換できます。各トランザクションの特徴ベクトルには、前のトランザクション間の時間差、名前と住所の一致、および一致数に関する情報とともにトランザクションテーブルの属性が含まれています。

グラフの作成

完全な相互作用グラフを作成するには、データ内の関係情報を各関係タイプのエッジリストに分割します。各エッジリストは、トランザクションノードと他のエンティティタイプの間の二部グラフです。これらのエンティティタイプはそれぞれ、トランザクションに関する識別属性で構成されています。たとえば、トランザクションで使用されるカードの種類 (デビットカードまたはクレジットカード) のエンティティタイプ、トランザクションを完了するのに用いられたデバイスの IP アドレス、および使用したデバイスのデバイス ID やオペレーティングシステムを持つことができます。グラフの作成に使用するエンティティタイプは、ID テーブルのすべての属性と、トランザクションテーブルの属性のサブセット (クレジットカード情報や E メールドメインなど) で構成されています。異種グラフは、関係タイプごとのエッジリストのセットおよびノードの特徴行列で構成されています。

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 に返されて保存されると、Processing ジョブが終了します。このプロセスは、Amazon SageMaker が完全に管理します。ScriptProcessor を実行するときに、データ前処理スクリプトに引数を渡すオプションがあります。トランザクションテーブルのどの列を ID 列と見なすか、およびどの列をカテゴリ別の特徴とするかを指定します。他のすべての列は数値特徴であると見なされます。次のコードを参照してください。

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 S3 に保存されている Amazon SageMaker Processing ジョブの出力を示しています。

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

すべての関係エッジリストファイルは、トレーニング中に異種グラフを作成するために使用するさまざまな種類のエッジを表しています。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 リポジトリの estimator_fns.py をご覧ください。

Amazon SageMaker を使用したモデルトレーニング

ハイパーパラメータを定義したら、トレーニングジョブを開始できます。トレーニングジョブでは、MXNet をバックエンドの深層学習フレームワークとして使用する DGL を用いて、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 モデルが、完全に接続されたフィードフォワードネットワークと、特徴を使用するがグラフ構造を十分に活用していない Gradient Boosted Trees の両方を上回っていることを示しています。

まとめ

この記事では、ユーザーのトランザクションとアクティビティから異種グラフを作成し、そのグラフとその他の収集した特徴を用いて GNN モデルをトレーニングし、どのトランザクションが不正であるかを予測する方法を示しました。この記事では、DGL と Amazon SageMaker を使用して、このタスクで高いパフォーマンスを実現する GNN を定義およびトレーニングする方法も示しました。プロジェクトの完全な実装とタスクの他の GNN モデルの詳細については、GitHub リポジトリをご覧ください。

さらに、Amazon SageMaker Processing を使用して、生のトランザクションデータログから有用な特徴と関係を抽出するためのデータ処理を実行する方法を示しました。提供されている CloudFormation テンプレートをデプロイし、独自のデータセットを渡してプロジェクトを開始し、悪意のあるユーザーやデータ内の不正なトランザクションを検出することができます。


著者について

Soji Adeshina は、AWS のお客様のために深層学習ベースのソリューションの開発に取り組んでいる機械学習開発者です。現在、彼は金融サービスと広告のアプリケーションでグラフ学習に取り組んでいますが、コンピュータービジョンとレコメンダーシステムに携わったこともあります。余暇には、料理をしたり、哲学書を読んだりするのが好きです。