Amazon SageMaker Random Cut Forestを動かしてみた

Pocket

渡邊です。

Amazon SageMaker(以下、SageMaker)が東京リージョンで利用可能となりました。
弊社は以前からSageMakerに注目しており、今後、日本でも利用が広がることを期待しております。

今回は、SageMakerのビルトインアルゴリズム(※)の1つ、『Random Cut Forest』(以下、RCF)を実行してみたいと思います。

※ビルトインアルゴリズムとは?
SageMakerのノートブックインスタンスには、あらかじめ複数のサンプルノートブックが用意されています。それらのノートブックには、機械学習でよく用いられるアルゴリズムのサンプルプログラムが実装されています。これらを利用することで、機械学習をすぐにでも実行することが出来ます。
2018年6月21日現在、用意されているアルゴリズムは次の通りです。

・Linear Learner
・Factorization Machines
・XGBoost Algorithm
・Image Classification
・Sequence2Sequence
・K-Means
・Principal Component Analysis (PCA)
・Latent Dirichlet Allocation (LDA)
・Neural Topic Model (NTM)
・DeepAR Forecasting
・BlazingText
・Random Cut Forest

ノートブック作成

ノートブックインスタンスを作成します。ステータスが『InService』になったら、アクションの『オープン』をクリックします。

Jupyter notebookの画面が開きます。『SageMaker Examples』タブをクリックします。


『Introduction to Amazon algorithms』をクリックします。

『random_cut_forest.ipynb』の『Use』ボタンをクリックします。

『Create copy』ボタンをクリックします。

RCFのノートブックが開きます。


先程の『Create copy』で作成されたフォルダとノートブックの所在は次の通りです(フォルダ名の末尾に、作成年月日がYYYY-MM-DD形式で付加されます)。

Random Cut Forestアルゴリズム実行

RCFを実行していきます。

まずは、使用するS3バケット名を入力します。必要に応じて、プレフィックスも入力します(今回はデフォルトのままとします)。
このノートブックで編集が必要なのはこのセルだけですが、今回は他のセルも編集して実行します。

ニューヨーク市のタクシー利用者数、6 か月間分で構成されるサンプルデータセット(CSV形式)をダウンロードします。


ダウンロードしたサンプルデータセットは、ノートブックと同じフォルダに格納されます。


サンプルデータセットの先頭5行を表示させます。

サンプルデータセットをプロットしてみます。
横軸6000付近にピークが見られます。


ピーク付近にズームして見るため、横軸5500から6500までの範囲をプロットしてみます。
通常時のデータの様子もより詳細に見て取れます。

RCFの学習は、他の多くのSageMakerアルゴリズムと同様、RecordIO Protobuf形式にエンコーディングされたデータで最もよく機能します。ここでは、CSV形式のサンプルデータセットをRecordIO Protobuf形式に変換し、S3バケットへ格納しています。

学習用Dockerコンテナイメージを設定します。このセルには、実行しているノートブックのリージョンから自動的に判定して設定されるようにプログラムが組まれています。


ハイパーパラメータの説明が記載されています。

今回は、学習用インスタンスのインスタンスタイプを、デフォルトの『ml.m4.xlarge』から『ml.t2.medium』に変更してみます。また、処理時間を計測して表示する処理を追加しました。


すると、下記のようなエラーメッセージが表示されます。

学習用インスタンスのインスタンスタイプに『ml.t2.medium』は指定出来ないようです。
指定出来るインスタンスタイプを下表にまとめました。

項番 インスタンスタイプ vCPU GPU メモリ (GiB) GPU メモリ (GiB) ネットワークパフォーマンス
スタンダード – 現行世代
1 ml.m5.large 2 8
2 ml.m5.xlarge 4 16
3 ml.m5.2xlarge 8 32
4 ml.m5.4xlarge 16 64
5 ml.m5.12xlarge 48 192 10 ギガビット
6 ml.m5.24xlarge 96 384 25 ギガビット
7 ml.m4.xlarge 4 16
8 ml.m4.4xlarge 16 64
9 ml.m4.10xlarge 40 160 10 ギガビット
10 ml.m4.16xlarge 64 256 25 ギガビット
コンピューティング最適化 – 現行世代
11 ml.c5.xlarge 4 8 最大 10 Gbps
12 ml.c5.2xlarge 8 16 最大 10 Gbps
13 ml.c5.4xlarge 16 32 最大 10 Gbps
14 ml.c5.9xlarge 36 72 10 ギガビット
15 ml.c5.18xlarge 72 144 25 ギガビット
16 ml.c4.xlarge 4 7.5
17 ml.c4.2xlarge 8 15
18 ml.c4.4xlarge 16 30
19 ml.c4.8xlarge 36 60 10 ギガビット
加速コンピューティング – 現行世代
20 ml.p3.2xlarge 8 1xV100 61 16 最大 10 Gbps
21 ml.p3.8xlarge 32 4xV100 244 64 10 ギガビット
22 ml.p3.16xlarge 64 8xV100 488 128 25 ギガビット
23 ml.p2.xlarge 4 1xK80 61 12
24 ml.p2.8xlarge 32 8xK80 488 96 10 ギガビット
25 ml.p2.16xlarge 64 16xK80 732 192 25 ギガビット

『ml.m5.large』を指定して再実行します。


今回は、学習におよそ222秒(3分42秒)かかりました。

エンドポイントを作成します。説明に『ml.c5インスタンスタイプを推奨』とあるので、今回は『ml.c5.xlarge』を指定します。また、このセルでも処理時間を計測し、結果はおよそ330秒(5分30秒)でした。


学習済みモデルを使用して、異常スコア(異常の程度を表し、高ければ異常、低ければ通常と判断する)を算出します。


異常スコアをグラフにプロットしてみます。


ここでは、次の式を満たすデータを『異常』と判断する基準を採用します。

(異常スコア) > (異常スコアの平均値) + 3 × (異常スコアの標準偏差)


異常なデータポイントをプロットします。
既知の異常値をいくつか検出していることがわかります:
・ニューヨークシティマラソン( 2014-11-02; t = 5954 )
・大晦日( 2015-01-01; t = 8833 )
・暴風雪( 2015-01-27; t = 10090 )

最後にエンドポイントを削除します。

おわりに

以上、SageMakerのビルトインアルゴリズムの1つ、『Random Cut Forest』を、一部「処理時間の計測」や「インスタンスタイプの変更」をしながら実行してみました。
今回はサンプルデータセットを使用しましたが、これを別のデータセットに変更するなど、このノートブックをベースにカスタマイズすれば、比較的容易に『Random Cut Forest』による異常検知を導入出来る筈です。

最後までご覧頂きありがとうございました。

参考リンク

[1] 機械学習モデルとアルゴリズム | AWS での Amazon SageMaker
https://aws.amazon.com/jp/sagemaker/
[2] Amazon SageMaker ML インスタンスタイプ
https://aws.amazon.com/jp/sagemaker/pricing/instance-types/
[3] Algorithms Provided by Amazon SageMaker: Common Parameters
https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html
[4] 20180308 AWS Black Belt Online Seminar Amazon SageMaker
https://www.slideshare.net/AmazonWebServicesJapan/20180308-aws-black-belt-online-seminar-amazon-sagemaker-90045719
[5] SageMaker | Amazon Web Services ブログ
https://aws.amazon.com/jp/blogs/news/category/artificial-intelligence/sagemaker/
[6] 異常検出にビルトイン Amazon SageMaker Random Cut Forest アルゴリズムを使用する | Amazon Web Services ブログ
https://aws.amazon.com/jp/blogs/news/use-the-built-in-amazon-sagemaker-random-cut-forest-algorithm-for-anomaly-detection/
[7] ランダムカットフォレスト
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/randomcutforest.html
[8] Robust Random Cut Forest Based Anomaly Detection on Streams
https://www.semanticscholar.org/paper/Robust-Random-Cut-Forest-Based-Anomaly-Detection-on-Guha-Mishra/8bba52e9797f2e2cc9a823dbd12514d02f29c8b9
[9] AWS SagemakerでJupyterを使ったり、独自機能を使う
http://catindog.hatenablog.com/entry/2018/05/05/194516
[10] Amazon SageMaker いじってみた1
https://recipe.kc-cloud.jp/archives/10841
[11] Amazon SageMaker いじってみた2
https://recipe.kc-cloud.jp/archives/10921