目次
はじめに
教師なし学習のひとつとして異常検知という分野があります。その中に含まれる手法として、正常時の状態から外れた点を見つけ出す外れ値検知手法があります。外れ値検知は実アプリケーションにも数多く導入されており、機械学習分野で注目を浴びている技術です。今回はその入門編として Local Outlier Factor (LOF) という手法をPythonで実装してみたいと思います。LOF の理論と仕組みについては次の記事でまとめたので確認してみてください。
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)])
図をみてみると、左上と右下の2つクラスタのいずれにも含まれないオレンジのサンプルが外れ値として検出されていることがわかります。このように、LOFはデータが複数のクラスタに分かれているような場合でも、それらを考慮しつつ外れ値を検出できるモデルであるということが確認できました。