単純なラベルよりもスコアや確率で表現する方がよい…説

いわゆる教師有り学習の「ラベル」は、例えば

  • このインスタンスはクラス2です
  • このインスタンスはクラス3です
  • このインスタンスはクラス3です

という形で与えられる。これは一般的なので皆あまり疑問に思わなくなってしまっているかもしれないが、実は情報量としてはかなり少ない状態だ。

  • このインスタンスは明らかにクラス2です。
  • このインスタンスはクラス2に近いが、クラス3です
  • このインスタンスは明らかにクラス3です。

という形の方が、より情報量が多い。

普段ベイジアンネットワークを使っていると「迷いのない状況」と「迷う状況」が確率の値として出てくるので、個別にチューニング等がうまくいっているか(=モデルが良くできているか)を把握しやすくかなりいい。
そのため、前者のような「単純なラベルのみが付与されたデータに基づくデータサイエンス」が圧倒的に良く使われている状況に疑問を持っていた。もっとスコアや確率的な情報が与えられる方が良いのではないか、と。

今日偶然アノマリ検知について調べていたら

http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0152173
の「Anomaly Detection Algorithm Output」の項目で(つまり正確には教師有りデータのラベルではなくモデルの出力に関する項目だが)

First, a label can be used as a result indicating whether an instance is an anomaly or not. Second, a score or confidence value can be a more informative result indicating the degree of abnormality.

という記述に出会うことができて、自分がモヤモヤ思っていた事が間違いではなかったと確信できてよかった(興味ある人はこの項全体を読むことをオススメ)。

Advertisements

大量のラベルなしデータを異常検知にどう活かすか

先のエントリで紹介したアノマリ検知の性能評価用フレームワークを作る際に思いついた手法は

インスタンスを正しいクラスに分類できたかどうか(あるいはできなかったかどうか)

ではなく、

あるインスタンスがあるクラスである、と「どの程度の確信の強さで分類するか」

に注目してみた。これはノリとしてはloglossに似ている。モデルがはじき出した結果そのものではなく確率(あるいはスコア)を見る。

http://data.gunosy.io/entry/2016/08/05/115345
より引用
『予測モデルの出力が特定のクラスに属する確率であることが多いので』
『上図の場合には、予測モデル2の評価が高くなります(Multi-class logarithmic loss自体は0に近い方がよい)。
Accuracyで評価した場合には予測モデル1、予測モデル2の双方とも同じ評価になります。』

 

アノマリ検知のモデルを作った後、評価を下記の2つのデータセットで行う。

  • ラベル付きの、少量の「異常」のデータのみのデータセット
  • ラベルなしの大量のデータからなるデータセット。こちらはラベルは付いていないが実際には「正常」と「異常」両方を含む。「正常」が「異常」よりもかなり多いことはわかっている。つまり現場で収集するのが容易なもの。

上記2つのデータセットをそれぞれをA,Bとする。

モデルに求められることは

  • Aを適切な確率(あるいはスコア)で「異常である」と分類(認識)すること
  • Bのデータに対する「異常である確率(あるいはスコア)」の平均値が、より低いこと(この理由は、Bは多くの正常なデータを多く含むため)

の両方を満たすこと。

2つモデルを作って、それぞれについて下記v1/v2を計算する

  • Aの全データについての「異常である」確率(あるいはスコア)の平均値(v1)
  • 同じくBについての平均値(v2)

v1が適切な範囲であれば、v1とv2の差が大きい方が、より優れたモデルである、と言えることになる。これによって複数のモデルの比較を定量的に行うことが可能になる。

上記手法により、ラベル無しの大量のデータを使って自動的にモデルの性能を高めることなどが可能になり特徴エンジニアリング等が客観的に実施できるようになる。

この手法は偶然思いついたのだが、たぶん既に研究者が発見しているのではないかと思う。これから探してみて、見つけたら追記する予定。

(2018/01/23追記)

散々論文等を読み漁ったが、この手法(おそらくメタアルゴリズムに分類されるものだと思う)は誰も紹介していないようだった。もしかしたら結構すごい発見かも…?


アノマリ検知の性能評価フレームワーク

word_path_avg

K-meansを使うアノマリ検知、これまでは
・入力のデータ
・処理(アルゴリズムや前処理・後処理など全て)
・出力される結果
の3つそれぞれをバラバラに見たり変えたりしながら、全体を通じて「ふむ、まぁ動くな…」というレベルまで作ってきたんだけど、そろそろ目で見るのではなく定量的に評価したくなった。
そこで年末の休みの時間を利用して評価するためのフレームワークを作ったら、かなり楽しいことになった。
教師なし学習だけど、データはベイジアンネットワークやシグネチャ等であらかじめ「クロ」と判断されているものと、そうではないものの2種類を用意。
それぞれoutlier/inlierというラベルをつける。inlier側には実質的にはoutlierなデータも多少混じってしまうかもしれない状況。
(たとえばbotのクロール等、攻撃ではないがアノマリな感じのアクセスをするもの)
この2つのクラスのインスタンス群に対してアノマリ検知を行う。それぞれのインスタンスについて、アノマリ側が0、正常側が12くらいの12段階くらいのスコアが計算される。
『outlierラベルが付いた群の平均点とinlier群の平均点の差が広がればアルゴリズムが改善していると考えることができる』という考え方。
実際動かすまでこれを実現できる自信がなかったんだけど、ちょうど初日の出頃の時間にうまく動いた。
・クラスタ数が5より10の方が検知精度が良い
・クラスタ数が10と15の場合、それほど変わらない
・前処理で外れ値を除去すると検知精度が良くなる
などが定量的に見えるようになった。評価のフレームワークがあると急にサイエンスっぽくなっていいね。
教師有り学習だとROC曲線に代表されるように手法が確立されているけど、今回自分で頭をひねって教師なし学習の評価フレームワークを作れたのはかなり良かった。