『Kernel Random Projection Depth for Outlier Detection』をPythonで実装した話

はじめに

最近,下記の論文がアップロードされていた.

『Kernel Random Projection Depth for Outlier Detection』

arxiv.org

Pythonによる簡単なデモンストレーションを実装したので,公開する.

以降,Kernel Random Projection DepthをKRPDと呼ぶ.

KRPDの中身

ざっくり言えば,Kernel PCAによる非線形な変換をかけた後に,random projection depthを計算するアルゴリズムである. そのdepth値に-1を掛けた値を外れ値スコアとして利用する.

実験および実装

データセット

いくつかのtoy dataset上で,外れ値スコアの等高線を表示するデモンストレーションを用意した. 具体的には 以下の4つである.

  • Blobs: 3つのガウス分布から発生させたデータセット
  • Cross: 十字の形に分布するデータセット
  • Circles: scikit-learnに付属のmake_circles利用
  • Moons: scikit-learnに付属のmake_moons利用

それぞれのデータセットのサンプル点は総数が400個,うちinlierが300個,outlierが100個である.

実装

KRPDの実装およびデモンストレーションは以下のNotebookである.要PyODライブラリ.

その他の代表的な検知器(LOFやOCSVM,Isolation Forestなど; 下記参照)によってどのような等高線が得られるかを比較するNotebookたちも用意した. 検知器の実装はPyODライブラリによった.

ちなみに検知器たちは以下の8つである.

  • Angle-based Outlier Detector (ABOD)
  • Histogram-base Outlier Detection (HBOS)
  • $k$-Nearest Neighbor (KNN)
  • Local Outlier Factor (LOF)
  • Isolation Forest (IForest)
  • Cluster-based LOF (CBLOF)
  • Minimum Covariance Determinant (MCD)
  • One-Class Support Vector Machine (OCSVM)

実験結果

KRPDの等高線プロットを図1に示す.オレンジ色で示された領域は外れ値の比率(25%)から決められた,外れ値スコア上位の領域を示す.いずれのデータセットにおいても,この領域はinlierの分布をうまく囲うことができている.

図1:KRPDの等高線プロット

以下,図2から図5まで比較のための等高線プロットをそれぞれ示す.

図2:Blobs上での各検知器による等高線プロット

図3:Cross上での各検知器による等高線プロット

図4:Circles上での各検知器による等高線プロット

図5:Moons上での各検知器による等高線プロット

おわりに

Python (具体的にはPyOD)でKRPDを実装した.諸課題は論文に書かれている.

おまけ

InlierのみでKRPDをfitするColab notebookも作った.