St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

「異常検知と変化検知~機械学習プロフェッショナルシリーズ~」を読んで勉強会も開いて関連の情報とかも調べたのでまとめておく

こんにちは。

※このエントリは、途中ですが資料の共有とかのため、突貫で体裁だけ整えて掲載しています。異常検知と変化検知の分野は、初心者なので、「こんな手法あるよ」とか「こんな論文面白いよ」とかあれば教えてほしいです。

読んだ本

最近某勉強会でいろんな機械学習の勉強をしているんですが、私のデータ分析への興味が実世界への適用にあるのもあり、以下の本を一人読んで一人で発表することにしました(皆そんな感じで発表しているという笑)。

「異常検知と変化検知~機械学習プロフェッショナルシリーズ~」

サポートページ

サポートページ:本のサポートページ – Dr. Ide's Home Page

目次

目次は以下のような感じです。

  • 第1章 異常検知・変化検知の基本的な考え方
  • 第2章 ホテリングのT2法による異常検知
  • 第3章 単純ベイズ法による異常検知
  • 第4章 近傍法による異常検知
  • 第5章 混合分布モデルによる逐次更新型異常検知
  • 第6章 サポートベクトルデータ記述法による異常検知
  • 第7章 方向データの異常検知
  • 第8章 ガウス過程回帰による異常検知
  • 第9章 部分空間法による変化検知
  • 第10章 疎構造学習による異常検知
  • 第11章 密度比推定による異常検知
  • 第12章 密度比推定による変化検知

余談

まぁ、発表をするのですが、スライドがネットに転がっていて、正直私が改めて作るまでも無いくらいさいつよで(スライド最近作りすぎて嫌になってきたとかじゃないですよ!!)、利用させていただきました汗。

勉強していく過程で調べた内容をここに載せていこうと思います。

異常検知・変化検知とは

概要

以下の投稿が、かなりこの本の内容を数式無しで説明しているため、ほんの概要をざっくり速く理解したい人にはおすすめです。

qiita.com

また、「そもそも異常検知ってなんなんだよ!!!」っていう人とか、「どこで異常検知つかうんだよ!!」っていう人は以下の資料あたりが良いかと思います。

その他読むと良さそうな本


Slides

輪講会をしたんですが、一人で全部のスライドを作っている暇もなかったのと、素晴らしいスライドばかりで改めて私が作る必要もないなって思って、使わせていただいた、異常検知と変化検知のスライド一覧です。以下のスライドはマジで参考になります。

さて、ここから本で学べる内容に追加で自分が調べたこととか、本の内容のメモとかを残していきます。

Chapter 1:異常検知・変化検知の基本的な考え方

この章は、全部の章に通じる内容でした。

ネイマン・ピアソン決定則

正直本の内容とスライドを見ればわかると思います。以下のQiitaの記事も参考になりました。

Chapter 2:ホテリングのT2法による異常検知

多変量正規分布の最尤推定

多変量正規分布の最尤推定はどの本をよんでも出てくるのではないかっていうくらいには何回も出てきますが、それですね。

カイ二乗検定

そもそもカイ二乗検定ってなんやねんだと死ぬので、とりあえず以下のページを見れば雰囲気つかめるかと。

正規分布とカイ二乗検定の関係について

この本では、正規分布とカイ二乗検定の関係について示されています。正直本の内容だけだと私は理解しきれなかったので、以下のサイトも読みました。

式の展開に関しては一つ目のサイトが分かりやすかったです。具体的なイメージを掴むには、2つめのサイトの方が参考になりました。

Chapter 3:単純ベイズ法による異常検知

単純ベイズ法による異常検知について触れられています。

ここについては、単純ベイズ法がわかっていれば、どんな風にそれを異常検知に適用するかがわかります。単純ベイズ法については、分類タスクを解く場合などで、簡単に実装できることもあり、使われることもあります。

単純ベイズ法において問題になる、ゼロ頻度問題ですが、それを回避する方法として、ゲタをはかせる方法と、ディリクレ分布による事前分布の導入が等しくなることも、この本では紹介されています。

実装するにあたっては、以下の記事とかが参考になります。

Chapter 4:近傍法による異常検知

k近傍法とマージン最大化近傍法の2つによる異常検知について触れられています。

線形代数に関するネタが結構出てきますが、それらがわかればこの章は普通に大丈夫かと。また、マージン最大化近傍法の考え方は、2015年に出されたDeep LearningでFace Detectionをする論文でも使われていますし、結構応用が効く考え方だと思うので、勉強しておいて損はないかなと思います。

半正定値行列

半正定値行列の性質を考えれば、固有値の行列を正にする処理の理由とかがわかります。

マージン最大化近傍法

以下の記事が理解の助けになりました。

Chapter 5:混合分布モデルによる逐次更新型異常検知

この章はぶっちゃけEMアルゴリズムをわかっていればオッケーな章と言ってもいいです。

EMアルゴリズム

EMアルゴリズムを勉強する時に参考になるのは以下の資料あたりです。本でがっつり勉強するなら、自分が観測した範囲では、PRMLの9章のEMアルゴリズムの章か、続・わかりやすいパターン認識の6章とかがわかりやすいというか、しっかり勉強出来ると思います。

特にこの本では、イェンセンの不等式を用いているので、その意味ではそれを用いて論理を展開している続・わかりやすいパターン認識の方が参考になると思います。

Chapter 6:サポートベクトルデータ記述法による異常検知

この章も5章と同じように、SVMがわかっていれば何も難しくない章といえます。

最適化の入門くらいは知らねばならん笑

この本の内容を理解するためには、最適化の入門くらいは理解しておく必要があると思います。SVMを理解するためにって感じですが笑。

SVM

PRMLはここでも参考になります。

Chapter 7:方向データの異常検知

フォンミーゼスフィッシャー分布(Von Mises–Fisher distribution)がわからないと死ぬ章でした(笑)。ぼんやりとしか知らなかったので、今一度調べなおしてみながら、読み進めました。

フォンミーゼスフィッシャー分布(Von Mises–Fisher distribution)

なんか書いてたら思ったよりも長くなったので、以下でまとめました。

st-hakky.hatenablog.com

上のエントリでは、集中度の最尤推定は結局してませんが、異常検知においてはそれは問題にならないので、今回は無視しました。

このあたりについては以下の記事も参考になりました。

カイ二乗分布への近似

今回の方向データの異常検知では、フォンミーゼスフィッシャー分布から、ラベルなしの場合の分布を少し式を整えて出すと、以下のようになります。

$$
a(\mathbf{x}) = 1 - \mathbf{ \mu^{T} x^{'}}
$$

となります。これはパっと見なんでやねんって思うんですが、 $\mathbf{ \mu^{T} x^{'}}$ の部分が1になることから、結局この内積が $\cos \theta$ になることを利用して、本気を出すと、カイ二乗分布にうまく近似できるように式展開をもっていくことができるからです(詳しくは本を参考に)。結構むちゃありそうなんですが、データ数 $N$ が多く、$\kappa$ も大きいと仮定をおけば、フォンミーゼスフィッシャー分布は展開できます。

ということで、以下のようになります。

$$
1 - \mathbf{ \mu^{T} x^{'}} ~ \chi^{2} (M - 1, \frac{1}{2 \kappa})
$$

ここで、カイ二乗分布に近似できたんですが、フォンミーゼスフィッシャー分布の最尤推定の時にガン無視していた $\kappa$ 係数が出てきてしまっています。

推定する必要があるんですが、上の式の左辺がわかっていることから、積率法により、逆にカイ二乗分布を左辺にあてはめにいくことでパラメーターを求めます(詳しくは本を参照)。

この章の流れはこんな感じでした(自分がフォンミーゼスフィッシャー分布になれてなかったのもあり、章の流れを見失いそうになったのでまとめておきました汗)。

Chapter 8:ガウス過程回帰による異常検知

[随時更新]

Chapter 9:部分空間法による変化検知

[随時更新]

Chapter 10:疎構造学習による異常検知

[随時更新]

Chapter 11:密度比推定による異常検知

[随時更新]

Chapter 12:密度比推定による変化検知

[随時更新]

Jubatus

異常検知をJubatusでするという記事を見かけたので、私もやってみようと思います。

環境構築

環境構築は、こちらのQuickstartのページからUbuntuやDockerでぶち込む方法などが書かれています。私はWindowsなので、Dockerでやります。

■Dockerで環境構築

Dockerを入れていない人は、Dockerを入れていただき、起動します。起動したら以下のコマンドを入力します。

docker pull jubatus/jubatus
docker run --expose 9199 jubatus/jubatus jubaclassifier -f /opt/jubatus/share/jubatus/example/config/classifier/pa.json
■Install Jubatus Client Libraries

クライアント用の方もいれないといけないです。色々対応している言語はあるようですが、私はPythonを使います。

sudo pip install jubatus

python3をつかう人は、pipをpip3にしてねという感じ。Dockerをバインドするやつ。

自分はDockerで試そうかなと思ったんですが、なんかうまく行かなかったので、また時間があればやります笑。

Deep Learningを用いた異常検知

Deep Learningでやる異常検知も提案されています。

Anomaly Detection with Robust Deep Autoencoders

Robust PCAの中のPCAをAutoencoderに変更したという論文。KDD2017に通っていて、読んでいくとなるほどとなると同時にRobust PCAについて勉強しないとなってなりました笑(んーでもあんまりDeep要素はいらないかもってなったので、余計にRobust PCAが気になったっていう感じかも笑)。以下がスライド。

他にも論文とか実装とかも全部公開されていて、以下の資料が役に立つ。

そのほか勉強したい手法

まだ読めていないけど、ブログ記事とか読んでいて面白そうだなとか、これ勉強しておきたいなっておもったものを下にあげておきます。今後勉強したら随時追加します。