コンサルでデータサイエンティスト

仕事でPythonを書いてます。機械学習、Webマーケティングに興味があります。趣味は旅です。

PythonでLocal Outlier Factor (LOF)を実装してみた

目次

はじめに

教師なし学習のひとつとして異常検知という分野があります。その中に含まれる手法として、正常時の状態から外れた点を見つけ出す外れ値検知手法があります。外れ値検知は実アプリケーションにも数多く導入されており、機械学習分野で注目を浴びている技術です。今回はその入門編として Local Outlier Factor (LOF) という手法をPythonで実装してみたいと思います。LOF の理論と仕組みについては次の記事でまとめたので確認してみてください。

hktech.hatenablog.com


Scikit-learnによるLOFの実装

機械学習パッケージであるScikit-learnを使って実装していきます。 今回は、Local Outlier Factor (LOF) のアルゴリズムに基づいてデータXから外れ値検知を行います。

パッケージが入っていなければ、インストールしておきましょう。

pip install scikit-learn
pip install matplotlib
pip install seaborn


早速、Scikit-learnを使って実装していきます。ここでは考慮する近傍点の数を n_neighbors=7 としています。

from sklearn.neighbors import LocalOutlierFactor
clf = LocalOutlierFactor(n_neighbors=7)
pred = clf.fit_predict(X)

Scikit-learnを使うとたった3行で外れ値を検出することができます。簡単ですね。


fit_predictの返り値としては 正常: 1、異常: -1のリストが返ってくるため、異常と判定されたサンプルのインデックス番号を確認するには次のコードを実行します。

import numpy as np
np.where(pred < 0)


試しに実際のデータを使って外れ値検知を行い、検出結果の可視化をしてみたいと思います。今回は、irisデータの一部変数を使い、2次元での可視化を行いました。

import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.neighbors import LocalOutlierFactor
from sklearn import datasets
%matplotlib inline
 
iris = datasets.load_iris()
X = iris.data
 
clf = LocalOutlierFactor(n_neighbors=7, contamination=0.005)
pred = clf.fit_predict(X[:, (1, 2)])
 
# 正常データのプロット
plt.scatter(X[:,1][np.where(pred > 0)], X[:,2][np.where(pred > 0)])
# 異常データのプロット
plt.scatter(X[:,1][np.where(pred < 0)], X[:,2][np.where(pred < 0)])

f:id:hktech:20181010230057p:plain


図をみてみると、左上と右下の2つクラスタのいずれにも含まれないオレンジのサンプルが外れ値として検出されていることがわかります。このように、LOFはデータが複数のクラスタに分かれているような場合でも、それらを考慮しつつ外れ値を検出できるモデルであるということが確認できました。

まとめ

Python で Local Outlier Factor (LOF) を実装する方法についてご紹介しました。今回はScikit-learnを使って実装を進めましたが、LOFのアルゴリズム自体はそんなに難しくないため、スクラッチから実装してみるのもいい練習になるかと思います。