Splunkと機械学習（基礎編）

# Splunkにあるデータを有効利用しよう
Splunkといえばデータを検索・分析・可視化するソフトウェアとして有名ですね。

IT運用管理、セキュリティ・コンプライアンス、DevOps、ビジネス分析からIoTまで、様々な使い方に応用できます。
普段吐き捨てているようなログも、Splunkにかければ問題をいち早く見つけて障害を予防したり、今までトラブルシューティングではgrepに頼っていたのが、Splunkを活用することで問題解決時間を90%短縮したという事例もあります。

さて、今回は「分析」について少しだけもう少し踏み込んでみたいと思います。
Splunkに取り込んだデータを機械学習にかけて、様々な要因から潜在的な問題を見つけよう、異常を検知しようというものになります。
それを実現するのが **Machine Learning Toolkit** というAppです。

# そもそもAppってナニ？
少し話がそれますが、Splunkには様々なオンラインコミュニティがあります。
[Splunk Answers](https://answers.splunk.com/)、[ブログ](https://www.splunk.com/blog/)、[ドキュメンテーション](http://docs.splunk.com/Documentation) 等々ありますが、詳細はまた別の機会に。

これらコミュニティの中でも、1,000種類以上ものAppやAdd-onが提供されている [Splunkbase](https://splunkbase.splunk.com/) というプラットフォームがあります。

App StoreとかGoogle Playのようなもので、こちらに公開されているAppをSplunk環境にインストールすることで、ダッシュボードをイチから構築することなくすぐに使えたり、ベンダーごとにフォーマットが異なるログをカンタンに取り込むことができます。

そういったPrebuiltのダッシュボードや設定ファイル、スクリプト等が入っているのがAppです。

ほとんどのAppは無償で提供されていて、課金なしで使うことができます。（例外もあります）

# Machine Learning Toolkit (aka MLTK)
その中でも人気なAppが [Machine Learning Toolkit](https://splunkbase.splunk.com/app/2890/) と呼ばれるもので、これを使うことでSplunkで検索したデータから機械学習をシームレスに使うことができる、というものです。

略して**MLTK**です。

**無償**です。

つまり、**MLTKはタダ**で使えます。

## インストール
まずは [Splunkbase](https://splunkbase.splunk.com/) から **[Machine Learning Toolkit](https://splunkbase.splunk.com/app/2890/)** をお手元のSplunk環境にインストールします。
<img width="763" alt="Screen Shot 2017-04-19 1.40.46 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/f6f156c9-2450-4bf1-867d-9a7373f6c17d.png">

他に、**Python for Scientific Computing (for XXXX)** をインストールします。これはOSごとに異なるので、SplunkがインストールされているOSに合わせて選びましょう。
<img width="763" alt="Screen Shot 2017-04-19 1.41.12 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/76422622-0e08-e533-ff8e-c43eaeceb7a4.png">

- Linux 64bit -> https://splunkbase.splunk.com/app/2882/
- Linux 32bit -> https://splunkbase.splunk.com/app/2884/
- Windows 64bit -> https://splunkbase.splunk.com/app/2883/
- Mac -> https://splunkbase.splunk.com/app/2881/

この中にはscikit-learnやpandas、SciPyといったPythonライブラリが入っています。
あとはSplunkを再起動すれば完了です。

## 使ってみよう
### Splunk環境
今回の環境は↓です。バージョンによっては見え方やコマンドに多少の違いがありますので、ご了承ください。
Splunk Enterprise 6.5.2
Machine Learning Toolkit 2.1.0

### MLTK Appの中身
Splunkにログインすると、Launcher画面の左側にMachine Learning Toolkitのアイコンができています。
<img width="200" alt="Screen Shot 2017-04-19 2.40.08 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/a81a87c2-ec19-cc73-4646-bd7c2e6f1e3a.png">
↑こんなのです。

ここにアクセスすると、ショウケースがいくつか表示されます。
<img width="1154" alt="Screen Shot 2017-04-19 2.43.13 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/0f5c7a32-f1bc-e371-ad39-5f68f6d17e60.png">

- Predict Numeric Fields = 線形回帰（様々なフィールドの相関から数値フィールドの値を予測）
- Predict Categorical Fields = 分類（True/Falseといった値を持つカテゴリカルフィールドの値を予測）
- Detect Numeric Outliers = 時系列データの異常値を検出
- Detect Categorical Outliers = 数値以外の異常値を検出
- Forecast Time Series = 時系列データの将来予測
- Cluster Numeric Events = クラスター分析

それぞれの項目にIT/セキュリティ/ビジネス/IoTのサンプルデータと事例があります。
今回は**Predict Numeric Fields**と**Predict Categorical Fields**を見てみましょう。

<a name="predict_numeric_fields"></a>
#### Predict Numeric Fields
数値データの学習モデルを作成し、線形回帰等のアルゴリズムでターゲットの数値を予測します。

それでは、早速**Predict Server Power Consumption**にアクセスしてみます。
サーバーの消費電力と学習用の参考データ（CPU使用率やディスクI/O等）が`server_power.csv`に入っています。

<img width="1152" alt="Screen Shot 2017-04-19 3.50.10 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/7ac3a252-9af0-6338-5828-3d740540f5d7.png">
↑SPL (Search Process Language) を入力してデータの検索・整形をします。

<img width="1012" alt="Screen Shot 2017-04-19 3.50.48 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/c76fa436-5169-3fd6-f7e5-637b5aca89e9.png">

- Algorithm -> アルゴリズムを選択（サポートしているアルゴリズムは[こちら](http://docs.splunk.com/Documentation/MLApp/latest/User/Algorithms#Regressors)）
- Field to predict -> 予測対象のフィールドを選択
- Fields to use for predicting -> 学習用データのフィールドを指定
- Split for training / test -> 学習用データとモデル適用データの比率を調整

<img width="119" alt="Screen Shot 2017-04-19 4.11.16 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/dc1a7dfa-963a-e253-f52c-379ec9813038.png">
↑緑色のFit Modelボタンをポチッと。 すると、予測結果が下の方に表やグラフで表示されます。

ここでは、MLTK独自のカスタムコマンド`sample`コマンドや`fit`コマンドを駆使しています。
これらのコマンドの詳しい使い方はまた別の機会に。


ずっと下にスクロールすると、R^2やRMSEといった数値が出てきます。
<img width="481" alt="Screen Shot 2017-04-19 4.37.10 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/e11ef857-20ef-be0f-1d0e-7987f87418e8.png">


ここで、それぞれの計算方法は↓

```math
R^2\quad=\quad1\quad-\quad\frac{\sum_{i=1}^{N}{\bigl(x_i-y_i\bigr)}^2}{\sum_{i=1}^{N}{\bigl(x_i-\bar{x}_i\bigr)}^2}
```

xi: 実測値
x~1: 実測値の平均
yi: 予測値

R^2は実測と予測の差を、実測の偏差で割って計算しています。
つまり、この値が1に近いほど予測の精度が高いと言えます。


一方、RMSEの計算方法は↓

```math
RMSE\quad=\quad\sqrt{\frac{1}{N}\sum_{i=1}^{N}{\bigl(x_i-y_i\bigr)}^2}
```

xi: 実測値
yi: 予測値

RMSEは実測と予測の偏差となり、0に近いほど予測の精度が高いということになります。

これらはSplunkのマクロで計算されており、[設定] > [詳細サーチ] > [サーチマクロ] から`regressionstatistics`で確認できます。
このマクロの使い方も、後日実践編で解説したいと思います。

ということで、何度も学習用データやアルゴリズムを変えてみながら、R^2が1に近づくように、RMSEがゼロに近づくように、モデルを作成するのが肝要です。
失敗を恐れずに、めげずにトライ＆エラーすることが大事です。


#### Predict Categorical Fields
True/FalseやSuites/Shoes/Accessoryといったカテゴリ系データの学習モデルを作成して予測します。

MLTKショウケースの中から、**Predict Hard Drive Failure**にアクセスしてみましょう。
HDDの故障有無を発見するためのデータとモデルが準備されています。
<img width="1154" alt="Screen Shot 2017-04-19 5.40.29 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/54d36f66-bac4-2e2c-fd92-4d8bddd6d27c.png">

前項の[Predict Numeric Fields](#predict_numeric_fields)と基本的には同じです。
こちらはDiskFailureというフィールドでディスクの故障有無をYes/Noで記録されていて、これを予測するというものになります。

今回は数値データではないので、扱うアルゴリズムが変わってきます。
利用可能なアルゴリズムは[こちら](http://docs.splunk.com/Documentation/MLApp/latest/User/Algorithms#Classifiers)をご参照ください。

<img width="1155" alt="Screen Shot 2017-04-19 5.49.00 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/174837/fc276adb-f532-14b0-769e-ab0b8f1b2570.png">

画面下部にはPrecision、Recall、Accuracy、F1といった値が出ています。
PrecisionはFalse Positiveの比率、RecallはFalse Negativeの比率で、1に近づくほど高精度ということになります。

計算式は↓

```math
Precision = \frac{TP}{TP + FP}
```

```math
Recall = \frac{TP}{TP + FN}
```

```math
Accuracy = \frac{TP + TN}{TP + TN + FP + FN}
```

Precisionではノイズの度合いを検査し、Recallでは検知漏れを検査することができますね。
これは`classificationstatistics`というマクロで実装されています。

また、その隣のClassification Resultsは行ごとに実測値が、列ごとに予測値が入ったマトリックスとなっています。
これは、`confusionmatrix`というマクロで実装されています。

マクロの使い方はごじt (ry

また、数値フィールドをカテゴリ系フィールドにするのに、Splunkの`bin`コマンドも活用するといいでしょう。
コマンドの使いk (ry

ちなみに、MLTK 2.1.0ではカテゴリ系データのバリエーションとして、1フィールドの中に100種類のデータ（カテゴリ）が上限となるようです。

これを応用すれば、マルウェア検知といったセキュリティ対策にも使えそうですね。

# 最後に
長々と書きましたが、触れたのはMLTKのほんの一部で、且つ、基本的な使い方に留まっています。

実際にSplunkにインデックスして監視対象としているログやメトリクス、諸々のデータにMLTKを適用して分析・予測・発見・検知してレポートやアラートを作成したり、ダッシュボードで可視化するには、途中で出てきたコマンドやマクロを活用する必要があります。

遠くない将来に実践編を書こうかと思います。
要望あるのかなぁ...

2017.05.12追記
実践編書きました → http://qiita.com/kikeyama/items/d3e5454a80b4dbd5941f