カーネルPCAに基づく外れ値検知にサブセットのサンプリング機能を実装して計算量削減を図った話

はじめに

先の記事

tam5917.hatenablog.com

にてカーネルPCAに基づく外れ値検知を実装したが、計算量が多く使い物にならない。

そこで本記事では、

tam5917.hatenablog.com

の記事にある、データセットのサブサンプリングを組み込むことで計算量を減らしつつ、検知性能がどの程度キープされるかを簡単に確認してみた。

実装

実装は以下の通り。

ここをクリックしてコードを表示する gist.github.com

検証

サブセットのサイズは、元のデータセットの20%になるようにランダムサンプリングした。以下がそのノートブックである。

gist.github.com

KPCA(SP)がサブセットのサンプリング版である。サンプル数の多いデータセットほど時間削減の幅は大きい(mnist、optdigits、pendigits、satellite、satimage-2)。 平均するとサンプリングなしと比較して10分の1程度までにはなった。注目すべきはサブセットをランダムサンプリングしても、サンプリングを行わないKernel PCAと比べて性能の低下はそれほど大きくない(ことが多い)ということである。むしろデータセットによっては、検知性能(ROC)がサンプリング後で改善しているものもあった(ionosphereやpendigits)。もっとも改善自体は乱数の「引き」の問題であり、たまたま良くなった、なのではあるが。各データセットの外れ値の割合を考えれば、サブサンプリングしたデータはほぼnormalなデータなので、性能の低下が抑えられているともいえる。

検証その2

先と同様に、サブセットのランダムサンプリングしたサイズは元のデータセットの20%とした。 さらに、random_stateを変えることで異なるサブセットを取る。今回の実験では5セットを作ることにした。それらの上でKernel PCAをそれぞれfitする。つまり検出器は5つである。 5つの検出器のアンサンブルを考えるために、各検出器から出力される異常度スコアの「平均」「最大値」「メディアン」を取り、ROCスコアをそれぞれ計算して比較する。異常度スコアのアンサンブルにはPyODのcombinationモジュールが利用できる。比較のため、サブサンプリングをまったく行わない、フルサイズのデータセットを使った場合の検出器も用意した。これらの間でROCスコアの変動を見ようというわけである。

アンサンブル型検出器の訓練とフルサイズの検出器の訓練で、どれほど計算時間が変化するかも見ることにした。

以下がノートブックである。 gist.github.com

グラフを示しておく。図1がROCスコア (アンサンブル型は「平均」)、図2が計算時間である。横軸はそれぞれのデータセットであり、各データセットについてサブセットサンプリング&アンサンブルを青、アンサンブルなし(フルサイズ)をオレンジの棒で示している。

図1: ROCスコア

図2: 計算時間

結果を要約すると:

  • サブセットのアンサンブル型でも、フルサイズのデータセットに匹敵する性能が出るケースが多いが、依然として負けるケースもある(図1)。サブサンプリングすることで大きく性能が向上したケース(musk)もあり、興味深いが、これはデータセットの特性に由来するものだろう。
  • データセットのサンプル数が多い場合、アンサンブル型にすることでも、依然として計算時間削減の効果は大きい(図2)

サブセットのサンプリングで性能低下しがちな面をアンサンブルで補った形と言えよう。

外れ値の比率が事前に分かっていれば、検知性能を損なわずにランダムサンプリング率をさらに小さくして計算時間の削減が可能ではある。運用上は比率が事前に分かっていることはあまりないだろう。なので今回の検証も参考程度に。

議論はあるか?

実用に持っていくためにはハイパーパラメータの調整が不可欠である。以下の論文では、カーネルPCAに基づくアンサンブル型モデルを用いた異常検知に関連して、ガウスカーネルのハイパーパラメータの最適化に関して議論されている。

Nicholas Merrill, Colin C. Olson; Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) Workshops, 2020, pp. 112-113 openaccess.thecvf.com