Elastic Machine Learningの歴史を振り返る


#はじめに
**この記事は[Elastic Stack (Elasticsearch) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/elasticsearch)の21日目です。**

Elastic Stackを使い始めてから今まで、会社の[コラム](https://www.netone.co.jp/report/column/column1/20180223.html)や[ブログ](https://gblog.netone.co.jp/20190422-1/)、昨年の[Advent Calendar](https://qiita.com/yukata_uno/items/669fb9b69e39d52c4e29)、[Elasticsearch勉強会](https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/)でもよくMachine Learningをネタに書いたり話したりしてきました。思い起こせばElastic Machine Learningを使い始めた頃は世間的にもBigDataやAI、Machine Learningが流行り始めだったかと思います。自分がElasticや機械学習に携わってからそれなりの日数が経ってきたので、今回はElastic Machine Learningがどのような変遷を遂げてきたのか、機能の復習も兼ねて簡単にまとめてみたいという気持ちで今年もAdvent Calendarに参加してみました。

# 注意事項
- Elastic Machine Learningの基礎的な概要については本記事には記載しておりません。
- ベータ版の機能として公開されているものも含まれているので、利用の際はご注意ください。
- 本記事は2019年12月時点（バージョン：7.5.0）の情報を元に作成しています。キャプチャは7.5.0のものです。
- [リリースハイライト](https://www.elastic.co/guide/en/elasticsearch/reference/current/release-highlights.html)やElastic社の[Blog](https://www.elastic.co/blog/)等を元に、かすかな記憶を辿って過去を振り返ってみました。
- すべての機能を記載するというよりは、個人的に気になったものを特にピックアップしています。

# Elastic Machine Learningの振り返り
公式ページのトップで以下のように謳われているElastic Machine Learning。その歴史を簡単に振り返ります。
> Elasticの機械学習で、データの異常や外れ値を見つけたり、傾向に基づいて予測を立てましょう。エンドユーザーが関心を持つ領域をデータから特定することもできます。

## 5.0あたり（PrelertのJoin）
2016年9月にPrelertがElasticにJoinすることがアナウンスされました。自分がデータ分析や機械学習に関わり始めたのもちょうどこの時期で、それぞれバージョンが異なっていたElasticsearch、Kibana、Logstash、Beatsのバージョンが5.0に統合されたのもこの時期でした（2016年10月）。

## 5.4あたり（Elastic Machine Learningのリリース）
2017年3月のElastic{ON}2017でMachine Learningが発表され、この時期にはベータ版として別途ダウンロードをすることで使うことができるようになりました。(※Elastic社Blogから画像を引用 )
![prelert_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/1a2fc3ab-3096-9f11-3c48-1c300d86f092.png "prelert_image.png")
自分はおそらくこの時期からElastic Stackを使い始めたので、データの投入等まだうまく使いこなせていなかったように思いますが、少しだけベータ版を試してこの画面を見て凄いなと感じた記憶があります。  
Elasticのバージョンが5.4となった2017年5月、まだベータ版の扱いでしたがMachine Learningの機能がElastic Stackに統合され、簡単に使ってみることができるようになりました。有償サブスクリプションの機能ではありますが、30日間のトライアルで試すことができたのもこの機能を使い始めるのには良かったです。そして5.5ではMachine LearningがGAになりました。
![anomaly_timeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/17222ce3-3085-275f-afbe-a62b381580b0.png "anomaly_timeline.png")

![single.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/12aee4bf-b55b-ba56-ed01-ffdf81e7fe93.png "single.png")

## 6.1（データの概要把握(Data Visualizer)と将来予測(forecast)）
機械学習では前処理やデータの把握が重要という話によくなりますが、Kibanaでデータの概要を把握（Data Visualizer）できるようになりました。機械学習に限らず、Elasticsearchに取り込んだデータの全体像を見るのには非常に役立つ機能であり、無償で使えます。
![data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/9306cbae-5b81-36e0-f450-f7817ae29d7b.png "data.png")
また、Elastic Machine Learningで将来予測（forecast）をできるようになり、さらに利用用途が広がったように思います。
![forecast.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/37adc366-ada1-a7e4-18ed-afa4d496cd85.png "forecast.png")

## 6.2（人知を反映させる(Calendar management)）
いつもと違う状態を検知する機械学習において、これからいつもと違う状態が起こることがわかっている（祝日や計画停電等）のにも関わらず、そのデータが学習されたり異常として検知されるのは好ましくありませんでした。そこで6.2では事前に定義した日時のデータをMachine Learningの対象としないように設定できるようになりました。今では日時だけでなく、特定IPからのデータを除く等、より高度なことができるようになっています。
![cal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/e6c294e9-a2fa-1d43-2323-2b7dfc7b798c.png "cal.png")

## 6.3（コードの公開）
X-Packのコード公開等、非常に大きな変化があったため、振り返りの中に入れてみました。
Elastic CloudでMachine Learningが使えるようになったのもこのあたりで、さらに多くの人にElastic Machine Learningが使える環境が提供されました。

## 6.4（Kibanaでサンプルデータの公開）
今まではGit上ではサンプルデータの提供がされていましたが、Kibana上でもサンプルデータが公開されるようになりました。このKibanaで数クリックすれば得られるサンプルデータも、ElasticsearchやLogstashに少し苦手意識を持つ人がElastic Machine Learningを試すハードルを下げた大きな要因かと思います。
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/3064a666-c96f-a534-ea70-7003ac8d5dd6.png "sample.png")

## 6.5（Kibanaからのデータ取り込みとモデリングアルゴリズムの改善）
CSV等決まった形式のデータであればKibanaのGUIからデータの取り込みが可能になりました。そのため、さらに簡単にElastic Stackを使い始めることができるようになったのではないでしょうか。また、Machine Learningの結果表示に少し変化があったのがこのバージョンでした。今までは赤や黄の◯で異常検知した場所を表示していましたが、異常検知の中に＋が混ざるようになりました。モデリングのアルゴリズムが改善され、パーティション個別にスコアリングが行われるようになったり、複数バケットを対象に異常検知できるようになった結果が＋として現れているようでした。
![plus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/b0347a1b-a545-8ccc-b768-a769a57cf658.png "plus.png")

## 6.6（知の共有(Annotation)）
Annotationの機能が導入されたことにより、分析者の気づきや実際に発生していた内容等を簡単に共有できるようになりました。データはどのような背景を持った人が見るかによって気づきも変わるので、その共有がKibana上でできるようになったのは嬉しいことでした。
![annotation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/310f721f-8e45-088f-65ff-34492a2d3970.png "annotation.png")

## 7.2（データ形式の変換(Data frames)）
このあたりからElastic Machine Learningの大きな機能追加がまた始まりました。以降のバージョンでリリースされていく機能はいわゆる「教師あり学習」もできるようになっていますが、そこで分析を行うためのデータ形式の変換（ピボットテーブルの作成）がTransformの機能でできるようになりました。
![transform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/ff7d2a59-eb8e-4464-e389-d4fbdb92768e.png "transform.png")

## 7.3（外れ値検知(Outlier detection)）
7.2で追加された機能を使って変換したデータをもとに、外れ値検知を行えるようになりました。k近傍法をもとにして分析を行っているようです。[公式ドキュメント](https://www.elastic.co/guide/en/elastic-stack-overview/current/ecommerce-outliers.html)にもKibanaで提供されているEコマースのデータを使った外れ値検知のサンプルが提供されており、ElasticsearchとKibanaさえ準備すれば、簡単に結果を手元で試すことができます。Outlier detectionはKibanaのGUIで結果までいい感じに見れるようになっています。
![outlier.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/36b1428b-63f5-60ca-0467-6735b9a6ba8c.png "outlier.png")

## 7.4（教師あり学習の回帰分析(Regression)）
教師あり学習で回帰分析ができるようになりました。目的変数と説明変数のあるデータが必要になり、説明変数には数値、カテゴリ、ブーリアンが使えるようです。[公式ドキュメント](https://www.elastic.co/guide/en/elastic-stack-overview/current/flightdata-regression.html)ではkibanaのサンプルデータとして提供されているフライトデータを使ったフライトの遅延の予測を行った例が紹介されています。この分析では、どのくらいの遅延が起きそうか、数値で予測しています。教師あり学習の場合、精度が気になるところですが、[evaluate data frame analytics API](https://www.elastic.co/guide/en/elasticsearch/reference/current/evaluate-dfanalytics.html)が提供されており、回帰分析の場合はR2乗値（r_squared）と平均二乗誤差（mean_squared_error）が求められます。
![reg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/99c408df-5922-c412-cf20-7fc29ade13f5.png "reg.png")
このあたりから機械学習の用語や意味を知らないと少し辛くなってくるのかな、と少し感じました。

## 7.5（教師あり学習の分類(Classification)）
7.4に引き続き、教師あり学習の機能追加がされ、分類が行えるようになりました。こちらも[公式ドキュメント](https://www.elastic.co/guide/en/elastic-stack-overview/current/flightdata-classification.html)にサンプルが公開されていますが、フライトのデータを使い、フライトの遅延を予測します。回帰ではなく分類のため、遅延するかしないかが結果として返ってきます。[evaluate data frame analytics API](https://www.elastic.co/guide/en/elasticsearch/reference/current/evaluate-dfanalytics.html)を使うことで多クラスの混同行列を書くための結果が返ってきます。
![class.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152168/c3c2b138-238d-97fc-edd5-de73453fe238.png "class.png")

# おわりに
Elastic Machine Learningを振り返ってみると、色々な機能が改善、追加されてきたのを実感しました。またSIEM等の他の機能との親和性も高いので、もっと有効活用できるとも感じています。個人的にはKibanaでサンプルデータが提供されたり、CSVのデータの取り込みができるようになったあたりから色々試すハードルがかなり下がり、Elastic Machine Learningも試しやすくなったように思います。7.5から追加されたKibana Lensもそうですが、Elasticをあまり知らない人でも使いやすくなってきたのかなと、変化を感じた振り返りでした。
[Elastic Stack (Elasticsearch) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/elasticsearch)もあとわずかです。明日は [@hssh2_bin](https://qiita.com/hssh2_bin) さんです。

# おまけ
Jリーグのデータを使ってOutlier detectionを試した結果を[第34回Elasticsearch勉強会](https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/266551992/)で話してきました。
発表時の資料は以下で公開しているので、ご興味のある方はどうぞ。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">キングカズネタをもう一度見たいコアな方はこちらへどうぞ<a href="https://t.co/LKD5W2h2bU">https://t.co/LKD5W2h2bU</a><a href="https://twitter.com/hashtag/elasticsearchjp?src=hash&amp;ref_src=twsrc%5Etfw">#elasticsearchjp</a></p>&mdash; yukata (@yukata_uno) <a href="https://twitter.com/yukata_uno/status/1202925000442826752?ref_src=twsrc%5Etfw">December 6, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>