2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PyODライブラリで、異常値(外れ値)の検出

Posted at

image.png

異常検知(またはoutlier detection、異常検出、外れ値検出)は、重要なデータ探索手法であり、「主要なデータ分布」と異なる異常値(一般的なデータ分布から逸脱した値)を見つけることができます。たとえば、クレジットカード取引から詐欺事件を見つけたり、通常のネットワークデータフローから侵入を見つけたりする際に使用され、非常に広範で実用的な商業価値があります。同時に、これは機械学習タスクの前処理(preprocessing)にも使用でき、少数の異常点の存在によるトレーニングや予測の失敗を防ぐのに役立ちます。

今日紹介するツールライブラリ、Python Outlier Detection(PyOD)は、現在最も人気のあるPython異常検知ツールライブラリであり、主な特徴は次のとおりです:

約20種類の一般的な異常検知アルゴリズムが含まれています。例えば、LOF/LOCI/ABODなどのクラシックな手法から、GAN(Generative Adversarial Network)やアンサンブル異常検知(outlier ensemble)などの最新の深層学習手法まで。
異なるPythonバージョンをサポート:2.7および3.5+。また、Windows、macOS、Linuxなど、複数のオペレーティングシステムをサポートしています。
シンプルで使いやすく、一貫したAPI。数行のコードで異常検知が完了し、多くのアルゴリズムを評価するのに便利です。
JITおよび並列処理(parallelization)を使用して最適化されており、アルゴリズムの実行を高速化し、スケーラビリティを向上させ、大量のデータを処理できます。
2018年5月の正式リリース以来、PyODは300,000回以上ダウンロードされ、2,500以上のGitHubスターを獲得し、すべてのGitHubデータマイニング(data mining)ツールライブラリ[1]で8位にランクインしています。PyODの論文はまた、Journal of Machine Learning Research(JMLR)に掲載されています。同時に、PyODは多くの学術研究[2][3][4][5][6]にも応用されており、私も以前の回答でPyODを使用したことがあります。「データ探索でよく使用される「異常検知」アルゴリズムは何ですか?」。

現時点で、すべてのドキュメントと例が英語であるため、皆さんが利用しやすくするために、この中文使用ガイドを特別に作成しました。転載歓迎(許可は不要)。

パッケージの概要(package overview)
PyODは約20種類の異常検知アルゴリズムを提供しています(詳細は図1を参照)。一部のアルゴリズムの説明は、「データ探索でよく使用される「異常検知」アルゴリズムは何ですか?」や異常検知の分野のクラシックな教科書[7]を参照してください。また、このツールライブラリにはデータ可視化や結果評価など、さまざまな補助機能も含まれています。

image.png

ツールライブラリに関する重要な情報は以下の通りです:

GitHubのリポジトリ: pyod
PyPIでのダウンロードリンク: pyod
ドキュメントとAPIの紹介(英語): Welcome to PyOD documentation!
Jupyter Notebookの例(notebooksフォルダ): Binder (beta)
JMLR論文: PyOD: A Python Toolbox for Scalable Outlier Detection

ツールライブラリに関する重要な情報は以下の通りです:

GitHubのリポジトリ: pyod
PyPIでのダウンロードリンク: pyod
ドキュメントとAPIの紹介(英語): Welcome to PyOD documentation!
Jupyter Notebookの例(notebooksフォルダ): Binder (beta)
JMLR論文: PyOD: A Python Toolbox for Scalable Outlier Detection
PyODのインストールは非常に簡単で、個人的にはpipを使用することをお勧めします:

pip install pyod
GitHubからのインストール: pyod
PyPIからのインストール: pyod

組み込まれているアルゴリズムの使用も簡単です。各アルゴリズムには対応する例があり、APIを学ぶのに便利です(examplesフォルダ)。例えば、LOFアルゴリズムの対応する例はlof_example.pyと呼ばれています。これを見つけるのは非常に簡単です。その他にも、作者は対話型のJupyter Notebookの例を提供しており、インストールが不要で、ブラウザから直接notebookを開いてPyODツールライブラリを試すことができます。

API参照と例(API References & Examples)

特に注意すべきなのは、異常検出アルゴリズムは基本的には非監視学習であるため、X(入力データ)だけで十分であり、y(ラベル)は不要です。PyODの使用方法は、Sklearnのクラスタリングと非常に似ており、その検出器(detector)は統一されたAPIを持っています。PyODのすべての検出器clfは、使用しやすいように統一されたAPIを持っており、完全なAPIの使用方法は(API CheatSheet - pyod 0.6.8 documentation)で確認できます:

fit(X): データXで検出器clfを"トレーニング/フィット"します。つまり、検出器clfを初期化した後、Xを使用してそれを"トレーニング"します。
fit_predict_score(X, y): データXで検出器clfをトレーニングし、Xの予測値を予測し、実際のラベルyで評価します。ここでのyは評価用であり、トレーニング用ではありません。
decision_function(X): 検出器clfがfitされた後、この関数を使用して未知のデータの異常度を予測できます。返される値は0と1ではなく、元のスコアです。スコアが高いほど、そのデータポイントの異常度が高くなります。
predict(X): 検出器clfがfitされた後、この関数を使用して未知のデータの異常ラベルを予測できます。返される値は2クラスのラベル(0は正常点、1は異常点)です。
predict_proba(X): 検出器clfがfitされた後、未知のデータの異常確率を予測し、その点が異常点である確率を返します。
検出器clfが初期化され、fit(X)関数が実行されると、clfは2つの重要な属性を生成します:

decision_scores: データXの異常スコア。スコアが高いほど、そのデータポイントの異常度が高くなります。
labels_: データXの異常ラベル。返される値は2クラスのラベル(0は正常点、1は異常点)です。
検出器clfがトレーニングされた後(fit関数が実行された後)、decision_function()およびpredict()関数を使用して未知のデータに対して予測できます。

この背景知識を持って、PyODを使用して単純な異常検出の例を実装できます。

このコードは、PyODのk最近傍(kNN)検出器を使用して異常検出を行う例です。以下はコードの説明です:

from pyod.models.knn import KNN # kNN分類器をインポート

kNN検出器をトレーニングする

clf_name = 'kNN'
clf = KNN() # 検出器clfを初期化
clf.fit(X_train) # X_trainを使用して検出器clfをトレーニング

X_trainの異常ラベルと異常スコアを返す

y_train_pred = clf.labels_ # X_trainの分類ラベルを返す(0:正常、1:異常)
y_train_scores = clf.decision_scores_ # X_trainの異常スコアを返す(スコアが大きいほど異常)

トレーニングされたclfを使用して未知のデータで異常値を予測する

y_test_pred = clf.predict(X_test) # 未知のデータの分類ラベルを返す(0:正常、1:異常)
y_test_scores = clf.decision_function(X_test) # 未知のデータの異常スコアを返す(スコアが大きいほど異常)
説明:

from pyod.models.knn import KNN: PyODライブラリのkNN分類器モデルをインポート。
clf = KNN(): kNN検出器のインスタンスを作成。
clf.fit(X_train): トレーニングデータX_trainを使用して検出器clfをトレーニング。
y_train_pred = clf.labels_: トレーニングデータX_trainの異常ラベルを返し、0は正常、1は異常を示します。
y_train_scores = clf.decision_scores_: トレーニングデータX_trainの異常スコアを返し、スコアが高いほど異常を示します。
y_test_pred = clf.predict(X_test): トレーニングされたclfを使用して未知のデータX_testで異常を予測し、分類ラベルを返します。
y_test_scores = clf.decision_function(X_test): 未知のデータX_testの異常スコアを返し、スコアが高いほど異常を示します。

このコードは、異常検出器の予測結果を評価し、可視化するための追加の部分です。以下はコードの説明です:

予測結果を評価

print("\nテストデータに対する評価:")
evaluate_print(clf_name, y_test, y_test_scores)

可視化

visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
y_test_pred, show_figure=True, save_figure=False)
説明:

evaluate_print(clf_name, y_test, y_test_scores): evaluate_print関数を使用して、テストデータに対する予測結果の評価を印刷します。評価には、異常検出器の名前(clf_name)、テストデータの実際のラベル(y_test)、および予測された異常スコア(y_test_scores)が含まれます。

visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred, y_test_pred, show_figure=True, save_figure=False): visualize関数を使用して、トレーニングデータとテストデータの異常検出の結果を可視化します。可視化には、異常検出器の名前(clf_name)、トレーニングデータ(X_train、y_train、y_train_pred)、およびテストデータ(X_test、y_test、y_test_pred)が含まれます。show_figureパラメータは、可視化を表示するかどうかを制御し、save_figureパラメータは可視化を保存するかどうかを制御します。

これにより、異常検出器の性能をテストデータに対して評価し、可視化できるようになります。

image.png

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?