カーネル主成分分析による外れ値検知をPyODフォーマットで実装した

はじめに

カーネル主成分分析を用いて外れ値検知ができるので、それを実装してみたということ。

カーネル主成分分析を外れ値検知に使うとは?

以下の論文にすべて書いてある(説明の手抜き!)。

  • Heiko Hoffmann, "Kernel PCA for novelty detection," Pattern Recognition, vol.40, no.3, pp. 863-874, 2007. Link

要するに、カーネルによって一意に決まる特徴空間上でPCAを実行し、さらに特徴空間上での再構成誤差を異常度として用いる。pre-image最適化を用いて、もとの空間に逆変換してから再構成誤差を計算する方法も考えられるが、今回は上記の論文に従うことにした。

実装

PyODのインストール

pip install pyod

KPCAクラス

PyODフォーマットに従って、KPCAクラスを実装した。以下を適当なファイル名(kpca.pyなど)で保存する。

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

実装はscikit-learnのKernelPCAをラップする形である。

Toy example

PyODのexampleスクリプトを改変して実行した。うまく動いているように見える。 gist.github.com

ベンチマーク

PyOD付属のベンチマーク用のスクリプトを少し改変する。15のデータセット上で評価した。 外れ値検知の代表的な手法たちと比較する。

  • Angle-based Outlier Detector (ABOD)
  • k-Nearest Neighbors Detector (kNN); k = 5
  • Isolation Forest (IForest)
  • Local Outlier Factor (LOF); k=10
  • One-Class SVM (OCSVM)
  • Principal Component Analysis (PCA)
  • Kernel PCA (KPCA)

gist.github.com

Kernel PCAの性能はROC的にはまずまず。PCAと比較したときの優位性は十分に明らかとなった。Precisionはそれほど。サンプル数の多いデータセットは計算時間が特にかかることがわかる。

おわりに

PyOD使おうぜ!