Help us understand the problem. What is going on with this article?

Splunk MLTK Smart Outlier Detection Assistant について

概要

Splunk MLTK 5.0 の新機能の一つとして Smart Oulier Detection Assistant というものが出ました。これは私が以前紹介したカーネル密度推定を用いた異常検知をもっと簡単に実装できるようにするためのアシスタント機能です。

もともと非常に強力なアルゴリズムのひとつでしたが GUI 版が用意されてなかったため、使う敷居が少し高かったのですが、今回からGUIをベースに実装が可能であり、異常検知の手法の一つとして更に役に立ちそうです。

MLTK 5.0 について

Splunk Enterprise 8 がリリースされたタイミングで MLTK 5.0もリリースされました。 これにより python 3をベースとしたライブラリが利用可能となりました。

注意としては Splunk 8以降がサポート対象であり、 7.x 以前の環境にはインストールできません。PSC (Python for Scientific Computing) 2.0 も合わせてインストールが必要になります。
詳細はこちらをご覧ください

まずは使ってみる

前回同様のサンプルログを使って、どのように見えるか確認してみます。

モデル作成

image.png

[Create new Experiment] ボタンをクリックして、名前を適当に入力します。

Difine (データをセット)

機械学習で利用するデータをセットします。サーチでフィルターするか、既存のデータセットを用いることも可能です。
今回は前回の記事と同様にサンプルログを利用します。コールセンターへの問い合わせ数を曜日や時間単位で分けて最大値をカウントします。

|inputlookup call_center.csv
| search source=si_call_volume
| eval _time=strptime(_time, "%Y-%m-%dT%H:%M:%S")
| eval HourOfDay=strftime(_time, "%H")
| eval DayOfWeek=strftime(_time, "%A")
| stats max(count) as Actual by HourOfDay,DayOfWeek,_time

image.png

Learn (学習)

セットしたデータを使って異常を検知させます。ここでは以下をセットします。
・検知対象のフィールド : 今回はコール数の異常を検知するため、Actual フィールドになります。
・分割するフィールド: 確率密度分布を作成するためのグループを選択します。今回は 曜日+時間なので "DdayOfWeek" と "HourOfDay" になります。
 これにより、例えば月曜日の 9-10時台の密度分布を作成し、その中で異常を検知するイメージになります。
・分布図の種類: 正規分布、指数分布、ガウスKDE の3つの種類の分布図に対応してますが、 Auto(自動)という選択肢を選ぶと、この3つを自動的にもっとも適当と思われるものをSplunkが選択してくれます。なので今回は Auto(自動)にしておきます。
・閾値: 確率密度の値を指定します。(デフォルト:0.0001) 今回はデフォルト値のままでやります。

image.png

「Detect Outliers」という実行ボタンを押すと学習が始まります。
以下のようなワーニングメッセージがでましたが、これは各グループ内のデータ数が50以下だとデータ数が少ないということでメッセージがでます。精度が落ちるためできれば大量のデータがあった方がいいですが、今回は無視します。

image.png

学習が完了すると以下のような画面が現れます。
image.png

これは非常にわかりやすいです。
異常が検知されたグループのTop3が自動的に選択されて、グラフ表示されてます。グループは今回168グループあるので、その中から問題のあるやつだけを最初から選んでくれるのはありがたいです。

また3つのグループを別々に確認することもできます。
image.png

上部に閾値を調節できるバーがあるので、異常値が多すぎる場合は実際に問題があった箇所などをみながら最適な閾値を選ぶことができます。

image.png

Top3 以外にも Top5 ,10 を選択できます。
image.png

特定のグループだけに絞るのも簡単です。
image.png

SPLボタンを押すと、実行しているSPL文が自動生成されてます。
image.png

 確認

上記だけでも十分確認できましたが、「次へ」を押すと Summaryなどが確認できます。

image.png

カーディナリティ数のチェックも。(50以下だとワーニングが出ます)

以下をみると、全部 50以下だった。。。
image.png

各分布図ごとの 平均値と標準偏差の分布が確認できます。

image.png

具体的な外れ値一覧

image.png

モデルの保存

問題ないようであれば、保存し、次の画面で Publish します。
ここでモデル名と利用するアプリを選択します。(対象アプリはあとで global設定に変更できます)

image.png

モデルの実装

残念ながら GUIでのサポートはここまでです。GUIを使って異常検知をマニュアルでやる場合は、これまでの方法で問題ありませんが、自動でモデルを学習させたり、スケジュール実行させてアラートをあげるためには、作成したモデルを使って別で実装する必要があります。(ここまでGUIでできたら最高なのですが)

とはいえ、それほど難しい設定ではありませんので、確認してみたいと思います。

モデルのスケジュール学習

Smart Assistant の中で、SPLが確認できるので、そちらをレポート保存してスケジュール実行します。
Learn ステップのところで、右上に "SPL" というボタンがあるので、それをクリックすると以下のような画面がでます。
image.png

上部の "Fit a model on all your data search" のリンクをクリックします。
最後の into 以下の部分はモデル名になりますので、先ほど保存した、sample_callcenter に修正します。

image.png

これをレポートとして保存します。
image.png

保存したレポートに対して、編集ー スケジュール設定 を選択します。
以下のように学習するタイミングをスケジュール設定すれば完了!

image.png

スケジュールアラート

毎時間、今回学習したモデルを実行して異常値を通知するように設定します。
また outlier が1以上検出されたらアラートをあげるようにします。

そのためには、以下のようなSPLを書きます。

|inputlookup call_center.csv 
| search  earliest=-h@h latest=now 
| search source=si_call_vo lume
| eval _time=strptime(_time, "%Y-%m-%dT%H:%M:%S")
| eval HourOfDay=strftime(_time, "%H")
| eval DayOfWeek=strftime(_time, "%A")
| stats max(count) as Actual by HourOfDay,DayOfWeek,_time
| apply "sample_callcenter"
| search "IsOutlier(Actual)" = 1

これにより、過去1時間のデータから、異常と判断されたデータだけが表示されます。

image.png

最後にスケジュールアラート設定です。
image.png

image.png

アクションもメール通知など、色々と設定できます。
image.png

まとめ

Smart Assistantのおかげて、非常に理解しやすくなった気がします。
ただ、ここまでサポートしてくれるなら、スケジュールトレーニングやアラート設定も出来たらいいのにと思いつつ。
謙虚な気持ちでありがた〜く使わせていただこうと思います。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away