こんにちは。コミュニケーションIT事業部 ITソリューション部の英です。
普段はWebアプリやスマホアプリの案件などを担当しています。あと、趣味でAIを勉強しています。
前回に引き続き IoTデバイス(温度センサー)の異常検知 をテーマに記事を書いてみます。
前回の記事はManaged Apache Flinkを使用した閾値でのリアルタイム異常検知でした。
→ 前回の記事
今回の記事では閾値(正解)を与えずに異常を検出する仕組みをご紹介します。 使用するのはSageMakerに搭載されているRCF(ランダムカットフォレスト)というアルゴリズムです。
ランダムカットフォレストとは?
ランダムカットフォレスト(Random Cut Forest)は、異常検知を目的とした機械学習アルゴリズムの一つです。 異常検知とはデータセット内の”異常”なデータポイントを見つけ出すことを指します。 例えば、ネットワークのトラフィックデータからサイバー攻撃を検出したり、製造ラインのセンサーデータから機械の異常を発見したりする際に用いられます。 また、AWSの公式チュートリアルではタクシーの乗車数データからイベントを検出する検証をされています。
仕組み
- ランダムカットの生成 データをランダムに分割します。データ空間に対してランダムに位置と方向を選び、データを二分します。例えば、温度データがあれば、その値に基づいて適当な位置でデータを分割します。
- ツリーの構築 分割したデータ群で木を作ります。ランダムに選ばれた位置と方向でデータを分割する操作を繰り返します。これにより、データがどんどん細かく分割されていきます。この分割の結果がツリー状の構造を形成します。
- 異常スコアの計算 対象データがツリー上のどの深さにあるかを測定し、異常度をスコア化します。ツリーの深さは、データポイントがどのくらいの回数分割されたかを表します。データポイントがツリーの浅い位置にある場合、それは他のデータポイントから大きく外れた異常値である可能性が高いとされます。
かなり直感的でわかりやすいアルゴリズムだと思います。
例えば、100冊の本があったとして、ほとんどの本は150ページから250ページあるとします。しかし、1冊だけ500ページの分厚い本があるとしましょう。この500ページの本はデータをランダムに分割する初期の段階で他のデータポイントから孤立しやすいことが想像できますよね。500ページある本はツリーの浅い位置に配置され、150ページから250ページの本は、何度も分割されてツリーの深い位置に配置されます。
ポイントとしては異常スコアがいくつだったら異常とみなすかは人が閾値を設定する必要があることです。 これだけ聞くと閾値で異常を検知していた前回の記事と同じじゃないのか?と思うかもしれません。
全然違います。
仮に温度で閾値を設定した場合、季節の変化に耐えられるでしょうか?地理的変化に耐えられるでしょうか? "30℃を超えたら異常とするセンサー"を埼玉の熊谷市にでも設定してみてください。夏場は毎日異常扱いです。 「熊谷市だったら35℃くらいから異常かも!」「軽井沢なら30℃くらいから異常かも!」のように設置した場所ごとに異常さは異なって当たり前なのです。 つまり、今回のアルゴリズムでは正常か異常かをリアルなデータを用いて自動的に識別できるということ。 これがRCFの画期的なところです。
ランダムフォレストと名前は似ていますが、また違ったアルゴリズムですね。 ランダムフォレストについては過去の記事で解説しています。
→ 過去の記事
ここから本題
STEP1:学習用データの作成
以下のように学習用のデモデータを生成します。
通常時は正弦波で温度が流れてきて、異常時にはそこにランダムな数値を加算するものとします。今回は1/100の確率で異常データが生成されます。
実際の温度センサーはこれほど綺麗な波形にはなりませんが、今回は検証をシンプルにするためにこのようなデータを使用するものとします。
STEP2:学習用データの確認
学習用データをプロットしてみると以下のようなグラフになります。
人間の目は良くできていますから、どこが異常かは一目見ればわかります。
STEP3:学習用データのアップロード
S3のセッションバケットに学習データをアップロードしておきます。
STEP4:学習
先ほど生成した学習データを使用してトレーニングを行います。
S3を経由する意味はほぼありませんが、お作法に則って学習データはS3から取得してきます。
ハイパーパラメータ | 説明 |
---|---|
role | モデルの実行に必要な権限を定義するAWS IAMロール |
instance_count | トレーニングや推論を行うためのインスタンスの数 |
instance_type | 使用するインスタンスのタイプ |
num_samples_per_tree | 各ツリーあたりのサンプル数。これにより、各決定木が何回のランダムなカット操作を実行するかが決まります。数値が大きいほど、モデルの精度が上がりますが、計算コストも増加します。異常データの比率を1/num_samples_per_treeに設定するのが最適とされています。 |
num_trees | ツリーの数。ツリーの数が多いほど、モデルの異常検知能力が向上しますが、計算リソースも多く必要になります。 |
STEP5:推論の実行
モデルをデプロイし、新規のデータポイントを500個生成して異常スコアを算出してみます。
算出したスコアはCSV形式で保存しておきます。
以下のようなCSVファイルが出力されました。一番右の列が異常スコアです。
STEP6:結果のプロット
今回は異常スコアが3.0以上のものを異常として赤色の「×」マークでプロットしてみます。
以下のようにプロットされました。
しかし、この設定ではグラフの下部(18℃付近)が赤く染まってしまっていることが分かります。
異常スコアが3.0以上なら異常とする閾値を見直す必要がありそうです。
次は異常スコアが3.5以上なら異常とするように閾値を変更してみます。
以下のようにプロットされました。
このグラフは人間の目で見たときに感じた異常さと同じ結果を示しているかと思います。成功ですね。
まとめ
異常検知はさまざまな産業やアプリケーションにおいて重要な役割を果たしています。今回紹介したランダムカットフォレスト(RCF)は、事前に閾値(正解)を設定することなく、データの異常を効果的に検出できる強力なアルゴリズムです。
RCFの最大の利点は、その適応性です。異常が環境や状況に依存する場合に特に有用です。従来の閾値ベースの方法では、適切な閾値を設定するのが困難であるため、この適応性は大きなアドバンテージとなります。
複雑なデータセットから有意な異常パターンを自動的に抽出できるため、データ分析の専門知識がなくても利用できる強力な分析ツールです。実際のデータ分析や業務改善に役立てていただければ幸いです。
これからもAWS×AIの検証記事をたくさん書いていきます。
↓ のスターを押していただけると嬉しいです。励みになります。
最後まで読んでいただき、ありがとうございました。
私たちは一緒に働いてくれる仲間を募集しています!
執筆:英 良治 (@hanabusa.ryoji)、レビュー:@takami.yusuke
(Shodoで執筆されました)