はじめに
最近,下記の論文がアップロードされていた.
『Kernel Random Projection Depth for Outlier Detection』
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の分布をうまく囲うことができている.
以下,図2から図5まで比較のための等高線プロットをそれぞれ示す.
おわりに
Python (具体的にはPyOD)でKRPDを実装した.諸課題は論文に書かれている.
おまけ
InlierのみでKRPDをfitするColab notebookも作った.