Splunk MLTK  Smart Outlier Detection Assistant について


## 概要

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

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

## MLTK 5.0 について

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

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

(追記) 
MLTK4.5 で Smart Outlier Detection Assistant が実装されたため、Splunk 7.x でもこの機能が利用できるようになりました。ただし、random_state　パラメータの利用は 5.0 のみサポートとなるようです。

## まずは使ってみる

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

### モデル作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/e22fad7a-31a2-3d20-7e1b-efd764878b2d.png)

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

### Define （データをセット）

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

```
|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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/ea97a856-e11c-98c4-6c21-081dc1571643.png)


### Learn (学習）

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/6258af4d-2a69-93f4-bceb-ef1e9335f1be.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/89b16ab2-5c9a-75fe-a090-9dfaaa5afb37.png)

学習が完了すると以下のような画面が現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/7383e5fe-3f4d-931f-caba-962a4c8ba56f.png)

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

また３つのグループを別々に確認することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/fcffaeb8-a013-b733-9e87-f431e701a52d.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/e29c1a44-e7d4-1fb8-23ca-c3899a7a78ac.png)

Top3 以外にも Top5 ,10 を選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/3eed5c0b-0725-7499-dde4-eae8aaf74b55.png)

特定のグループだけに絞るのも簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/81cc2814-69a0-97a8-77e2-a1e8e7cd28db.png)

SPLボタンを押すと、実行しているSPL文が自動生成されてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/718f20f6-46b3-9835-a4f6-f1256f046d48.png)



###　確認

####上記だけでも十分確認できましたが、「次へ」を押すと Summaryなどが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/807eac5f-80e7-c103-4c7a-9b3550ee6960.png)

####カーディナリティ数のチェックも。（50以下だとワーニングが出ます）
以下をみると、全部 50以下だった。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/7f1e1952-fd01-9908-cd5b-7ac99dd5bd86.png)

####各分布図ごとの 平均値と標準偏差の分布が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/5b62e639-ce30-a077-17cd-0c299b582499.png)

####具体的な外れ値一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/ec66b145-4481-08c5-08f7-3c1ff6c2775b.png)

### モデルの保存

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/2f6a5eff-9ce6-df8a-89d0-d3eb740bc2ab.png)



### モデルの実装

<font color="red">(追記） MLTK5.2 では、以下に書いてあるモデルのスケジュール学習や、アラート設定まで SmartAssistant機能を使ってできるようになりました。ただ手動で下記のように設定も可能なため、記事はそのまま残しておきます。</font>

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

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

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

Smart Assistant の中で、SPLが確認できるので、そちらをレポート保存してスケジュール実行します。
Learn ステップのところで、右上に "SPL" というボタンがあるので、それをクリックすると以下のような画面がでます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/12d68b1a-7135-7c6b-7889-d7551fe50bc2.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/0e01af41-9df1-f1ab-fa46-8e1817dab369.png)

これをレポートとして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/f7b0eb42-1f20-3e19-a55e-5895302671da.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/187895e3-f375-4a41-6cd9-011cbd8bf89c.png)


### スケジュールアラート

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

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

````perl
|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
```

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/b17ead3d-acce-d877-0fdc-952b7c298d9e.png)


最後にスケジュールアラート設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/ea619b09-da1b-8721-a7e9-3123846ed2c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/b065c5ad-e312-6c33-8ac9-31f1ebe2416b.png)

アクションもメール通知など、色々と設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/9e3b3f3d-521f-7bf8-c365-5ce94ab1fcee.png)


## まとめ

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