オットセイの経営日誌

データサイエンス系ベンチャーを経営してます。経営のこと、趣味のことつぶやきます。

AI・機械学習に限らない異常検知の手法

仕事をバリバリやりながらブログ記事を投稿するって、なかなかきつい。

しっかり定期的に更新できる方は、どういう時間術を駆使しているんだろう。


そんな悩みを抱えていた中、仕事で表題の件についてまとめる機会があり、ちょうど記事化できそうな内容なので書き留めます。

異常検知は古くて新しい課題で、古くはルールベース・統計ベースの検出方法があり、直近は機械学習、特にオートエンコーダやGANを用いた教師なし学習による検出手法も発表され、現在進行形で進化が続いている領域です。

Web上にも古い記事から新しい記事まで、参考となる情報が大量に見つかります(実際、本記事もそれらをかなり参考にさせていただいています)が、異常検知素人にも分かるレベルでまとめられている記事はあまりないようだったので、そんな視点を意識してまとめます。

従って、異常検知を業務でバリバリ実装されているデータサイエンティスト向けというより、ビジネスパーソン向けの導入・(少し)発展編、ということになろうかと思います。

そもそも異常検知とはどういう問題を指すか

f:id:mhiro216:20191124164544p:plain

「異常検知ってどんな問題だと思いますか?」と聞くと、外れ値を検出する問題を想像する人が最も多いように思いますが、そのような静的なデータに対する検知だけでなく、動的な変化について変化点を検知したり、各時点の状態の正常/異常を判定する問題も、異常検知に含まれます。

どの問題を解くかによって適用すべき手法も異なりますが、共通に使われる手法もあり、本記事ではあまり厳格な切り分けをせず、どのような手法があるか例示します。

異常検知問題を解く手法にはどのようなものがあるか

f:id:mhiro216:20191124165234p:plain

異常検知問題を解く手法の説明に入る前に、機械学習全般についてのおさらいをしておきました。

その中で、異常検知問題で特にありがちな状況として、異常データが極端に少なく、教師あり学習を行うことが難しいケースが多いことが挙げられます。そのため「教師なし学習により「正常」とは何かを学習させ、そこから外れるものを「異常」とする」という考え方に基づく手法が種々研究されています。

尚、後段では3σ法やホテリング理論など、教師なし学習というより統計ベースの手法と言った方が適切では?という印象を受ける手法も出てきますが、「与えられたデータからパターンを学習する」のが機械学習であるという定義に従って、教師なし学習に一括りにして説明を続けます。

f:id:mhiro216:20191124165704p:plain

これも機械学習全般に成り立つ説明ですが、そもそも機械学習で問題を解くにはデータが必要であり、特に異常検知では異常データが十分に確保できるかどうかによって、適用できる手法が明確に変わる点に留意する必要があります。

f:id:mhiro216:20191124165951p:plain

ちょっと挑戦的なスライドを起こしてみました。

AI・機械学習がブームになってから数年経ち、意外にもブームは長続きしている状況ですが、一方で、手法レベルでの技術的革新が継続している領域と、一段落した領域に色が分かれてきていると思います。

優秀なデータサイエンティストの方も世の中にどんどん増えている中で、技術的革新が一段落した領域で不要に高い投資をしてしまうのは、もったいない。所謂「枯れた技術」を使いこなせることは技術者・ベンダーにとって強みではありますが、差別化要素になるほどではない。

枯れたといっても、技術を自在に使いこなせる人は限られているので、投資にブレーキを踏むべきという意味ではないですが、一方でそのような領域で自社の技術が如何に優れているかアピールし高い投資を要求するような輩がもしいたら、十分に注意していただきたいという気持ちを込めてこのスライドを作りました。

手法レベルではそのような状況ですが、一方で、弊社Nishikaが運営するデータサイエンスコンペティションは、有用な特徴量や手法の組み合わせを発見する恰好の機会となりモデルのさらなる性能向上の切欠となるので、技術的革新の進捗とは別に必要性を判断し、役立てていただきたいというのがポジショントークでした。

f:id:mhiro216:20191124171108p:plain

異常検知を行う手法を調べるとその多様さには驚きますが、一方でたくさんある中でどれを選ぼうかという無邪気な話でもなく、ユースケースにおけるデータの特徴によって適用すべき手法が決まってくるというのがポイントです。

以下、いくつかの手法を例に、適用条件について列記します。

異常検知を行う手法と適用条件

3σ法

f:id:mhiro216:20191124171312p:plain

皆様ご存知、3σ法です。品質管理の分野では最も著名な手法ではないでしょうか。

しかしこの3σ法、スライド記載の通り適用条件にはかなり制限があります。

以下、3σ法の制限をクリアする手法を各々述べていきます。

ホテリング理論

f:id:mhiro216:20191124171427p:plain

3σ法の制限の1つである、多変数に対する異常検知では実質的に使えない点をクリアする手法が、これもまた古典的な手法であるホテリング理論です。

「出現確率がX%未満の高い異常度が観測されたら、異常とみなす」という考え方は、精度が良いかは別として、直感的に決めやすく、上への説明はしやすいですね。

k近傍法

f:id:mhiro216:20191124171624p:plain

3σ法やホテリング理論はひと山の分布に対する手法でしたが、複数の山からなる分布に対して異常検知を行う手法として、k近傍法があります。

k近傍法は、Pythonライブラリは存在するのですが意外に理論から実装した例が公開されておらず、右図の異常度の描画に際してゼロから実装してみましたが、シンプルな考え方に基づく手法なだけあって非常に実装も簡単でした。

ただ、分布の密集度によらず同じ基準で異常度を算出してしまう弱点があり、それを解決するLocal Outlier Factor (LOF) という手法が考案されています。

k近傍法(時系列データに対して)

f:id:mhiro216:20191124171934p:plain

ここまでは測定値がお互いに独立な場合の例で、測定値同士に関係性があるデータ、典型的には時系列データにおいては、異なる手法を用いる必要があります。

但し、先ほど紹介したk近傍法は、スライド窓により波形パターンを抽出することで、時系列データにも適用することができます。

長期的に上昇/下降するようなトレンドがあるとそのままでは適用できませんが、例えば工場の異常検知で長期トレンドが観測されるようなケースはなかなかレアな気がします。

その場合も、長期トレンドを前処理で除いた上でk近傍法を適用すれば良いのではないか、と推察しています(素人考えですが)。

オートエンコーダ

f:id:mhiro216:20191124172224p:plain

最後に、非構造化データに対する異常検知の例として、オートエンコーダによる画像に対する異常検知を示します。

オートエンコーダの、自分自身を入力かつ出力にすることでニューラルネットワークに自分自身の特徴を"ざっくり"把握させ、異常検知に活用するという発想は、理論の詳細は分からずとも存在を知っているだけで、たくさんのユースケースが着想できるのではないかと思います。

まとめ

f:id:mhiro216:20191124172546p:plain

繰り返しになりますが、異常検知はルールベース・統計ベースの古い手法から、ニューラルネットワークを活用した教師なし学習のような新規な手法まであり、自分自身のユースケースにどの手法を適用すべきなのか、一度勉強・整理しないと分かりにくい領域だと感じました。

それだけに、問題を解決する我々データサイエンティスト側からすると、適切な手法の選択や学会発表したての新規な技術の適用といった点で非常にやりがいのある領域なのですが、

解決してほしい問題を提供するビジネス側の皆様におかれては、まずはユースケースの置かれた状況(より具体的には、データの特徴)を整理するところから始めて、なんでもない技術を不要に高く売りつけるベンダーに騙されないようにしていただきたい、ということも思いました。

参考文献・URL

追記予定

ホテリング理論と、k近傍法による異常度算出の実装について、後日Qiitaに公開します。