2018年9月11日 エンジニアリング

Elasticの機械学習による時間分析と集団分析

著者 Rich Collier

Elasticの機械学習により、ユーザーは主要な2つのタイプの異常の兆候を発見できます。1つは時間的なもの(時間との関係で分析)、もう1つは集団ベースのもの(ターゲットとそれ以外のものとの関係で分析)です。しかし、これら2つのタイプの違いは何でしょうか。また、どのような状況でどちらを使うのでしょうか。このブログでは、これらの分析の背後にある詳細、それらのメリット、一般的な経験則に基づくベストプラクティスについて説明します。

まずは、時間ベースの異常と集団ベースの異常の意味を定義してみましょう。そのために、いくつかの事実を挙げます。

時間的異常の検知

  • 分析を具体的に集団ベースの分析として定義しない限り、これがElasticの機械学習のデフォルトの分析です。
  • エンティティの振る舞いを、経時的にそのエンティティ自体と比較するものです。
  • (「by_field_name」または「partition_field_name」を使用して)「スプリット」を活用し、任意の各インスタンスの各ベースラインを作成できます(ホストごとまたはユーザーごとの独自のベースラインなど)。
  • カーディナリティが高い場合やデータ要素が非常にまばらな場合はあまり適していません。たとえば、 Web訪問者用の外部IPアドレスは、数が少ない上に、(何十万を超える)高いカーディナリティとなります。これは、そのジョブのメモリ制限がデフォルトの制限から増やされていない場合、パフォーマンスの問題を引き起こします。ただし、増やされていたとしても、集団分析のほうがより適したアプローチであると思われます。

集団的異常の検知

  • 「over_field_name」(またはKibanaのPopulationジョブウィザード)を使用した場合のみ、呼び出せます。「over_field_name」として宣言されたフィールドが集団を定義します。
  • ある集団内のメンバーのピア分析です。または、もっと正確に言うと、個別のエンティティを、経時的に観察されたすべてのピアの集団モデルに対して比較するものです。
  • (「by_field_name」または「partition_field_name」を使用して)「スプリット」を活用し、サブ集団を作成することも可能です。
  • 通常、カーディナリティが高い場合またはデータ要素がまばらな場合に非常に適しています。各メンバーが振る舞いの集合モデルに貢献しているからです。

ユースケースの例

この話はそのぐらいにして、次は、どちらのアプローチを選択するか決める際に役立つと思われる、仮定のユースケースを説明します。

社内のドキュメントサーバーからダウンロードしたドキュメント数を追跡したいとします。ドキュメントサーバーには、社内の全員に広く関係のあるドキュメントが保存されていると仮定します(5万人以上の従業員を擁する大規模企業)。また、誰もがいつでもこのドキュメントサーバーにアクセスできます。さらに、このドキュメントサーバーのアクセスログは、ドキュメントにアクセスがある度、およびユーザーがダウンロードを実行する度に記録されます。

時間的異常の例

時間的異常の検知を選択し、以下のような分析を作成した場合:

    "detectors": [
      {
        "function": "count",
        "partition_field_name": "user"
      }
    ]

このようにして、経時的に、各ユーザーのダウンロード数を名前ごとに個別に追跡することにします。つまり、ユーザーの「Wilma」が通常、1日に50ドキュメントをダウンロードする場合(彼女はエンジニアリング部門の社員でサーバーのドキュメントのヘビーユーザー)、その振る舞いが劇的に変化して、ダウンロード数が通常よりもはるかに少ない、または多い場合にのみ、異常と判断されます(たとえば1日に5,000ドキュメントなど)。

また、先に考慮事項として述べていますが、どれくらい多くのユニークユーザーを機械学習に追跡させたいかについて、認識しておく必要があります。5万人のユニークユーザーであれば、機械学習ジョブのメモリ制限を増やせば管理可能です。ただし、もう1つ認識しておくべきことがあります。それは、ユーザーは毎日一貫してドキュメントをダウンロードするとは限らないことです。つまり、今日2、3件のドキュメントをダウンロードし、数か月先までダウンロードしないというように、そのアクティビティは非常にまばらになる可能性があります。ユーザーごとに一貫して観察しないと、ユーザーごとに正確なベースラインを確立することは難しい場合があります。

しかし最も重要なのは、新しい人(ユーザー=「Fred」)が現れて、1日に5,000ドキュメントをダウンロードし、2度とダウンロードしなかった場合はどうなるかです。これは異常でしょうか。Fredは内部の脅威でしょうか、またはそれらのドキュメントを組織外に渡すためにデータを引き出す何らかのマルウェアが、Fredの認証情報を使って多数のドキュメントを盗んだのでしょうか。時間的異常の検知で分析した場合、その答えはIndeterminate(不確定)となります。比較対象となるFredの履歴がないため(1つのサンプルしかない)、それがFredにとって異常なのかが分かりません。

集団的異常の例

上記とは異なり、以下のように集団的異常の検知を使用して問題を分析した場合:

    "detectors": [
      {
        "function": "count",
        "over_field_name": "user"
      }
    ]

こうすると、次のことを達成できます。

  • 各「bucket_span」(ここでは1日)にどのようなユーザーが現れても、それらのユーザーを使用して、ユーザー全体での通常のダウンロード数に関する集合モデルを構築できます。
  • 各日の各ユーザーを、その集合モデルと比較します。

ここでは、Wilmaとその同僚の大半が1日に10~75件のドキュメントをダウンロードしており、通常の使用に関する全体の「集合」モデルはその範囲となります。そのような場合にFredが現れて、1日に5,000ドキュメントをダウンロードした場合、Fredは、Wilmaやそのすべての同僚と比較されるため、この振る舞いは異常となります。Fredは外れ値としてマークされます。

ただし、重要なポイントがあります。FredではなくWilmaが5,000ドキュメントをダウンロードした場合、彼女は異常な外れ値としてマークされますが、それは彼女のダウンロード数が彼女の通常のダウンロード数よりも多いからではなく、彼女自身やその同僚が長期的に貢献して確立された使用の「通常」モデルよりも多くダウンロードしたことによって、異常な外れ値としてマークされたことになります。

つまり、この場合、Wilmaは時間または集団のどちらの検知方法でも外れ値としてマークされますが、次のような理由で集団アプローチのほうがより柔軟です。

1.まばらなデータでも影響を受けない
2. ユニークユーザー数が増加しても、より効率的で、メモリへの負荷が少ない(ユーザーごとの各モデルが不要)
3.履歴がない、またはほぼないFredのような外れ値を見つけられる
4.集合的な振る舞いから外れるほどにWilmaの振る舞いが劇的に変化した場合は、この方法でもWilmaを外れ値としてみなすことができる

追加のヒント:集団分析を行う場合、集団をできるだけ同質にすると最も効果的です。つまり、ユーザータイプが大きく2つのクラスターに分かれる場合(たとえばエンジニアと人事)、これらのユーザーを個別のグループに分け、それぞれの分析を行うと、ひとまとめにするよりも効果的に分析できる可能性があります。

最後に、集団から除外したいメンバーがいることが事前に分かっている場合は、入力データをフィルターするか、結果をフィルターするルールを使用して除外することを検討してください。

ここでの説明が2つのアプローチの比較に役立つことを願っています。データに関する機械学習を試してみたい場合は、Elastic Stackをダウンロードして30日間のトライアルライセンスを有効化するか、Elastic Cloudの無料トライアルを開始してください。