Machine Learningで「他とは違う」イベントを検知する

二種類の異常検知

ElasticのMachine Learningは、二つの種類の異常を検知することができます。一つ目は「以前とは違う」という変化を異常としてとらえます。「オンライントランザクション数が急激に低下した」「ウェブサービスへのアクセス数が、平日の昼間としては非常に多い」などが例としてあげられます。この方法を説明したのが以前のブログポスト「ニューヨーク市のタクシー乗降データでMachine Learningを体験する」で、どなたでも入手可能なデータセットを使って、実際にお試しいただくことができます。もう一つの異常は「他とは違う」というもので、これを Population Analysis と呼び、大いに活用しがいがあります。「ウェブサービスへのアクセス数が非常に多いクライアント」を発見できれば、攻撃者やサービスのパフォーマンスへ影響を与えている迷惑なクローラーを特定することができますし、「異常な数のサブドメイン数を持つドメイン」にアクセスするクライアントは、DNSトンネリングにより情報を流出させているかもしれません。このエントリでは、先のブログポストと同じく、ニューヨーク市のタクシーの乗降データを使用して、「他とは違う」イベントを発見します。

スクリーンショットは、バージョン6.0.0-RC1のものですが、5.6でも同様に異常を検知することができます。

乗車人数が他と比べて多い地域

タクシー会社を経営していたとしたら、どのような「他とは違う」異常を検出したいと思うでしょうか。真っ先に思いつくのは、「乗車人数が他と比べて多い地域」です。そのような場所にタイムリーに配車できれば、他社より多くの顧客を乗せることができるかもしれません。

Create an advanced job より、nyc-taxi-yellow-*インデックスを選択し、ジョブに任意の名前を付けます。Analysis Configuration から、新しい Detector を登録します。異常に乗車人数が多い場所を知りたいので function には high_sum、フィールド名にはpassenger_countを選択します。ここで、「他とは違う」ものを検出するには over_field_name を使用します。「他とは違う乗車場所」を知りたいので、乗車場所を表すフィールド PULocationID_t.keywordを選択します。Influencer としても、同フィールドを選びます。bucket_span は15分のままとします。

Frequently Picked-up Locations - Configuration

2016年11月のデータセットで異常を検知した結果は以下のとおりです。

Frequently Picked-up Locations - Results

マンハッタンのEast Villageは、度々他と比べて乗者数が非常に多くなることがわかります。例えば11月6日は、他の地域では15分間に22人程度乗車があるのに対して、この地域では1642人の乗客がいました。また地理的に近いLower East Sideでも同様の傾向が見られたようです。

稀にしか乗客が降車しない場所

「稀にしか乗客が降車しない場所」にも興味を持つかもしれません。ニューヨーク市は非常に広いので、そのような場所で顧客が降車した場合、別の顧客が乗車することも少ないと想像できます。これを知るには Detectorfunctionrareby_field_name に降車場所を表す DULocationID_t.keyword を指定します。これで、このデータセット中、出現が稀な DULocationID_t.keyword を検出することができます。今度は Influencer として、DOLocationID_t.keywordと、PULocationID_t.keywordを指定します。

Rarely Dropped-off Locations - Configuration

同様に異常検知を試みたのが以下のスクリーンショットです。

Rarely Dropped-off Locations - Results

現地時間の11月8日にJFK Airportで乗車し、Jamaica Bayで降車した乗客がいたようです。確かに本データセット中、Jamaica Bayで降車したデータは一件しかありません。11月7日にGreatKills Parkで降車した顧客もいるようですが、同じ場所で降車した顧客は他にいません。Governor's Island/Ellis Island/Liberty Islandで度々降車した記録はありますが、他の地域と比べて件数が極端に少ないようです。

このように、意図したような「他とは違う」イベントを検出できました。

他のユースケースへの応用

みなさんがニューヨークでタクシー会社を経営していなくても、これらの方法はセキュリティやIT運用、その他のユースケースにも十分応用することができます。例えば、ウェブサーバーのアクセスログで転送量を表すbytehigh_sum で合計し、clientipover_field_name として指定すれば、転送量が異常に多い clientip を知ることができます。Metricbeatなどを使用して、実行中のプロセス名を定期的に収集しているのであれば、rareprocess.name をそれぞれ functionby_field_name としてジョブを作成すれば、これまで実行されなかったプロセスが起動された際に、知ることができます。

まとめ

X-PackのMachine Learningを使用すると、特別な機械学習の知識無しにElasticsearchにインデックスされたデータから、異常検知を行うことができます。ここでは「以前とは違う」という異常に加えて、「他とは違う」タイプの異常検知を行う方法を紹介しました。X-Packは30日間、無料で試すことができます。皆さん自身のデータで、ぜひお試しください。

その他の日本語情報

Machine Learningの設定などでお困りの場合には、こちらからお気軽にお問い合わせください。