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分のままとします。
2016年11月のデータセットで異常を検知した結果は以下のとおりです。
マンハッタンのEast Villageは、度々他と比べて乗者数が非常に多くなることがわかります。例えば11月6日は、他の地域では15分間に22人程度乗車があるのに対して、この地域では1642人の乗客がいました。また地理的に近いLower East Sideでも同様の傾向が見られたようです。
稀にしか乗客が降車しない場所
「稀にしか乗客が降車しない場所」にも興味を持つかもしれません。ニューヨーク市は非常に広いので、そのような場所で顧客が降車した場合、別の顧客が乗車することも少ないと想像できます。これを知るには Detector の function に rare
、by_field_name に降車場所を表す DULocationID_t.keyword
を指定します。これで、このデータセット中、出現が稀な DULocationID_t.keyword
を検出することができます。今度は Influencer として、DOLocationID_t.keyword
と、PULocationID_t.keyword
を指定します。
同様に異常検知を試みたのが以下のスクリーンショットです。
現地時間の11月8日にJFK Airportで乗車し、Jamaica Bayで降車した乗客がいたようです。確かに本データセット中、Jamaica Bayで降車したデータは一件しかありません。11月7日にGreatKills Parkで降車した顧客もいるようですが、同じ場所で降車した顧客は他にいません。Governor's Island/Ellis Island/Liberty Islandで度々降車した記録はありますが、他の地域と比べて件数が極端に少ないようです。
このように、意図したような「他とは違う」イベントを検出できました。
他のユースケースへの応用
みなさんがニューヨークでタクシー会社を経営していなくても、これらの方法はセキュリティやIT運用、その他のユースケースにも十分応用することができます。例えば、ウェブサーバーのアクセスログで転送量を表すbyte
を high_sum
で合計し、clientip
を over_field_name として指定すれば、転送量が異常に多い clientip
を知ることができます。Metricbeatなどを使用して、実行中のプロセス名を定期的に収集しているのであれば、rare
な process.name
をそれぞれ function 、by_field_name としてジョブを作成すれば、これまで実行されなかったプロセスが起動された際に、知ることができます。
まとめ
X-PackのMachine Learningを使用すると、特別な機械学習の知識無しにElasticsearchにインデックスされたデータから、異常検知を行うことができます。ここでは「以前とは違う」という異常に加えて、「他とは違う」タイプの異常検知を行う方法を紹介しました。X-Packは30日間、無料で試すことができます。皆さん自身のデータで、ぜひお試しください。
その他の日本語情報
- ブログ: ニューヨーク市のタクシー乗降データでMachine Learningを体験する
- ビデオ: Machine Learning: Elastic Stackを利用した異常検知
- ビデオ: 時系列データの異常検知 実践入門
Machine Learningの設定などでお困りの場合には、こちらからお気軽にお問い合わせください。