Amazon Web Services ブログ
Amazon SageMaker ランダムカットフォレストアルゴリズムを使用した Amazon DynamoDB ストリームでの異常検出
異常検出技術の導入を検討したことがありますか? 異常検出とは、分析しているデータの大部分と大きく異なるため信憑性にかける、あまり見かけないアイテム、イベント、あるいは観察を特定するために使用する手法です。 異常検出のアプリケーションは幅広い分野で利用されており、例えば、異常購入や銀行へのサイバー侵入の検出、MRI スキャンでの悪性腫瘍の発見、不正な保険請求の特定、製造時の異常な機械動作の発見、侵入を知らせるネットワークトラフィックの異常なパターンの検出などがあります。
こうしたアプリケーションには多くの市販品がありますが、Amazon SageMaker、AWS Glue、AWS Lambda を使えば、異常検出システムを簡単に実装することができます。Amazon SageMaker は、機械学習モデルの構築、トレーニング、デプロイを、規模を問わず迅速に行う完全マネージド型プラットフォームです。AWS Glue は、完全マネージド型の ETL サービスで、分析のためのデータやモデルの準備が簡単にできます。AWS Lambda は、普及しているサーバーレスのリアルタイムプラットフォームです。これらのサービスを使用すれば、モデルを新しいデータで自動的に更新することができ、その新しいモデルを使って、リアルタイムに異常をより正確に知らせることができます。
このブログ記事では、AWS Glue でデータを準備し、Amazon SageMaker で異常検出モデルをトレーニングする方法について説明します。今回のエクササイズでは、Numenta Anomaly Benchmark (NAB) ニューヨーク市タクシーデータのサンプルを Amazon DynamoDB に保存し、AWS Lambda 関数を用いてリアルタイムでストリーミングしています。
ここで説明するソリューションは、以下のような利点があります。
- 既存のリソースを最大限に活用して、異常検出を行います。例えば、災害対策 (DR) やその他の目的で Amazon DynamoDB Streams を使用したことがある場合、そのストリームのデータを異常検出に使用できます。加えて、スタンバイストレージは通常、使用率が低いものです。認識しにくいデータは、トレーニングデータに使用できます。
- ユーザーの介入なしに、定期的に新しいデータでモデルを自動的に再トレーニングすることができます。
- ランダムカットフォレストを組み込んだ Amazon SageMaker アルゴリズムを使えば、簡単に再トレーニングできます。Amazon SageMaker は、安全でスケーラブルな環境で、特定のワークフローに適応できる、柔軟な分散トレーニングオプションを提供します。
ソリューションのアーキテクチャ
次の図は、ソリューションの全体的なアーキテクチャを示しています。
アーキテクチャーにおけるデータ処理の手順は、次のとおりです。
- ソース DynamoDB は変更を取得し、それらを DynamoDB ストリームに格納します。
- AWS Glue ジョブは、ターゲット DynamoDB テーブルから定期的にデータを取得し、Amazon S3 でモデルアーティファクトを作成または更新するために Amazon SageMaker を使用してトレーニングジョブを実行します。
- 同じ AWS Glue ジョブは、ランダムカットフォレストに基づくリアルタイムでの異常検出に、Amazon SageMaker エンドポイントで更新されたモデルをデプロイします。
- AWS Lambda 関数は、DynamoDB ストリームからデータをポーリングし、Amazon SageMaker エンドポイントを呼び出して推論を取得します。
- Lambda 関数は、異常を検出すると、ユーザーアプリケーションに知らせます。
このブログ投稿は、2 つのセクションに分かれています。1 つ目のセクション「自動更新モデルの構築」では、AWS Glue を使用して前に紹介したステップ 1 と 2、および 3 を自動化する方法について説明します。このセクションのサンプルスクリプトはすべて、1 つの AWS Glue ジョブで実行できます。2 つ目のセクション「リアルタイムでの異常検出」では、AWS Lambda 関数が異常を検出するのに、前に紹介したステップ 4 と 5 の処理をどのように行うかを解説します。
自動更新モデルの構築
このセクションでは、AWS Glue が DynamoDB テーブルを読み込み、Amazon SageMaker のモデルを自動的にトレーニングおよびデプロイする方法について説明します。ここでは、DynamoDB ストリームがすでに有効になっており、DynamoDB アイテムがストリームに書き込まれているとします。これらをまだ設定していない場合は、次のドキュメントを参照して詳細を確認してください。「DynamoDB ストリーム を使用したテーブルアクティビティのキャプチャ」、「DynamoDB ストリーム と AWS Lambda のトリガー」、および「グローバルテーブル」。
この例では、米国東部 (オハイオ) (us-east-2) リージョン内の DynamoDB テーブル (“taxi_ridership”) は、DynamoDB の「グローバルテーブル」を使用して、米国東部(バージニア北部) (us-east-1) リージョン内の同じ名前を持つ別の DynamoDB テーブルにレプリケートしています。
AWS Glue ジョブを作成し、データを準備する
モデルトレーニングのデータを準備するために、データを DynamoDB に保存します。AWS Glue ジョブは create_dynamic_frame_from_options()
を使い、dynamodb
connection_type 引数を用いて、ターゲット DynamoDB テーブルからデータを取得します。DynamoDB からデータを取り出す場合は、モデルトレーニングに必要な列のみを選択し、Amazon S3 に CSV ファイルとして書き込むことをお勧めします。 これは、AWS Glue の ApplyMapping.apply()
関数を使って、行うことができます。この例では、transaction_id
と ridecount
列のみがマッピングされています。
さらに、write_dynamic_frame.from_options
関数を実行する時は、format_options = {"writeHeader":False , "quoteChar":"-1"}
のオプションを追加する必要があります。列の名前と二重引用符 (” ‘) は、モデルのトレーニングには必要ないためです。
最後に、AWS Glue ジョブは、DynamoDB テーブルが存在する同じリージョン (このブログの投稿では us-east-1) に作成する必要があります。AWS Glue ジョブの作成の詳細については、「AWS Glue でジョブを追加する」を参照してください。
この AWS Glue ジョブは、CSV ファイルを Amazon S3 上の指定されたパスに書き込みます ( “s3://<bucket name>/<project name>/taxi-ridership-rawdata/” )。
トレーニングジョブを実行し、モデルを更新する
データが準備できたら、Amazon SageMaker でトレーニングジョブを実行できます。トレーニングジョブを Amazon SageMaker に送信するには、AWS Glue ETL スクリプトが自動的にバンドルしている boto3 パッケージをインポートする必要があります。これで、AWS Glue ETL スクリプトで Python 用の低レベル SDK を使用することができます。トレーニングジョブの作成方法の詳細については、「ステップ 3.3.2: トレーニングジョブを作成する」を参照してください。
Create_training_job
関数は、指定した S3 のパスにモデルアーティファクトを作成します。これらのモデルアーティファクトは、次のステップでモデルを作成するために必要です。
モデルの作成が成功したら、Amazon SageMaker コンソールに日付形式の新しいモデル名が表示されます。
バッチ変換を実行し、カットオフスコアを取得する
このトレーニング済みモデルを使用して、各トレーニングデータポイントの異常スコアを計算することができます。使用するデータ量が多いので、Amazon SageMaker のバッチ変換機能 を使用します。バッチ変換機能は、トレーニング済みモデルを使って Amazon S3 のデータセット全体の推論を取得し、バッチ変換ジョブの作成時に指定する S3 バケットに推論を保存します。
各データポイントについて推論 (= 異常スコア) を取得したら、リアルタイムでの異常検出に使用する score_cutoff
値を取得する必要があります。簡素化するため、標準的な手法を使って異常を分類しました。平均スコアから 3σ (シグマ) の範囲より外れる異常スコアを、異常とみなします。
バッチ変換ジョブの履歴は、Amazon SageMaker コンソールの [Batch transform jobs] メニューにあります。
モデルをデプロイし、カットオフスコアを更新する
AWS Glue ETL スクリプトでの最終ステップは、更新したモデルを Amazon SageMaker エンドポイントにデプロイし、取得した score_cutoff
の値をリアルタイム異常検出用の DynamoDB テーブルにアップロードすることです。Lambda 関数は、DynamoDB の score_cutoff
の値をクエリして、新しいトランザクションの異常スコアと比較します。
これで Amazon SageMaker エンドポイントが作成され、AWS Glue ジョブが完了しました。AWS Glue コンソールの [Logs] のリンクを選択すると、AWS Glue ジョブの詳細ログを確認できます。
Score_cutoff
の値は、パーティションキーが taxi-ridership
で、範囲キーが最新の更新時間である DynamoDB テーブルに格納されます。
AWS Glue ジョブをスケジューリングする
前出のスクリプトは同じ AWS Glue ジョブで実行されており、AWS Glue はトリガーを作成して、時間ベースのスケジュールをサポートします。時間ベースのスケジュールを定義し、それを自身のジョブに関連付けると、定期的に新しいデータでモデルを再トレーニングすることができます。 モデルをあまり頻繁に更新する必要はないと思います。 毎週か隔週での更新で十分でしょう。
リアルタイムでの異常検出
このセクションでは、AWS Lambda 関数からリアルタイムで、異常なトランザクションを検出する方法について説明します。DynamoDB ストリームをポーリングするには、AWS Lambda 関数を作成する必要があります。AWS Lambda 関数を作成する際、「dynamodb-process-stream-python3」ブループリントを使えば、迅速に実装することができます。ブループリントの Lambda 関数は、指定した DynamoDB テーブルと統合することができます。ブループリントは、基本的な Lambda コードを提供します。
各データポイントで異常スコアを取得する
Lambda 関数のコードを、簡単に説明します。新しいデータのため、INSERT イベントと MODIFY イベントのみをフィルタリングします。 Lambda 関数は、それらをインスタンス
配列に追加し、配列内のイベント全体の推論を取得します。Amazon SageMaker ランダムカットフォレストアルゴリズムは、複数のレコードを入力要求として受け入れ、マルチレコードの推論を返してミニバッチの予測をサポートします。詳細は、「一般的なデータ形式 — 推論」を参照してください。
異常なトランザクションのアラート
機能の配列は、sagemaker.invoke_endpoint
関数に送信できます。インスタンス
配列の各機能に対応するスコアの配列を返します。DynamoDB テーブルから取得した score_cutoff
の最新値に応じて、各スコアを比較できます。新しいトランザクションの異常スコアが score_cutoff
の値より大きい場合、そのトランザクションを異常とみなします。その後、Lambda 関数はユーザーアプリケーションに知らせます。
Amazon CloudWatch の出力ログの例を、次に示します。DynamoDB には 10231
と 21101
の 2 つのトランザクションが作成され、これらのトランザクションによって Lambda 関数が新しいイベントとしてトリガーされました。21101
のトランザクションの異常スコアは、3.6189932108
です。これは、DynamoDB テーブルのカットオフ値 (1.31462299965
) よりも大きいため、トランザクションは異常であると検出されます。
結論
このブログ投稿では、Amazon SageMaker、AWS Glue、および AWS Lambda を使用して、Amazon DynamoDB ストリームで異常検出システムを構築する方法を紹介しました。
AWS Glue はユーザーのスクリプトに基づく柔軟性が大きく、新しいデータソースを追加し続けるため、今回の例を自身の特定のユースケースに合わせることができます。AWS Lambda 機能は他の多くの AWS ストリーミングサービスでも機能するので、他の種類のデータソースやストリームをこのアーキテクチャに適用することも可能です。
最後に、この記事の異常検出システムで、ビジネスリスクを回避し、コストを削減できることを期待しています。
著者について
Yong Seong Lee は AWS ビッグデータサービスのクラウドサポートエンジニアです。ビッグデータやデータ解析、機械学習のテクノロジーならなんでも関心があります。AWS サービスの利用に苦戦しているお客様へのサポートが彼の仕事です。「人生を楽しむ。好奇心を持つ。これ以上ないほどの経験をする。」というのが、彼のモットーです。