異常検出の概要

異常検出

1.外れ値とは何ですか?

外れ値は、他のデータとは大幅に異なるデータポイントです。
定義されたホーキン.1ASを使用しAN外れ値は次のとおり
です。「別のメカニズムによって生成された疑いを喚起するために、SO ASOTHER観測から大きく逸脱したISAN観測外れ値。」
統計およびデータマイニングの文献にもある外れ値(外れ値)それらは、異常、不一致、逸脱、または異常と呼ばれます。ほとんどのアプリケーションシナリオでは、データは1つ以上の生成プロセスによって作成されます。これは、システム内のアクティビティまたはエンティティに関して収集された観測を反映できます。生成プロセスが異常に動作すると、外れ値が生成されます。したがって、外れ値には通常、データ生成プロセスに影響を与えるシステムおよびエンティティの異常な特性に関する有用な情報が含まれています。これらの異常な特性に関する知識は、特定のアプリケーションに対する有用な洞察を提供します。いくつかの例は次のとおりです。

  • 侵入検知システム:多くのコンピューターシステムでは、オペレーティングシステムの呼び出し、ネットワークトラフィック、またはその他のユーザー操作に関するさまざまな種類のデータが収集されます。これらのデータは、悪意のある動作によって引き起こされた異常な動作を示している可能性があります。このアクティビティの識別は、侵入検知と呼ばれます。
  • クレジットカード詐欺:機密情報(クレジットカード番号など)が漏洩する可能性が高いため、クレジットカード詐欺はますます一般的になっています。多くの場合、クレジットカードの不正使用は、特定の場所からの買い物や非常に大規模な取引など、さまざまなパターンを示す可能性があります。このモードは、クレジットカード取引データの異常値を検出するために使用できます。
  • 興味深いセンサーイベント:多くの実際のアプリケーションでは、センサーはさまざまな環境および位置パラメーターを追跡するためによく使用されます。基礎となるパターンの突然の変化は、関心のあるイベントを表す場合があります。イベント検出は、センサーネットワークの分野における主要なインセンティブアプリケーションの1つです。
  • 医療診断:多くの医療アプリケーションでは、データは、磁気共鳴画像(MRI)スキャン、ポジトロン放出コンピューター断層撮影(PET)スキャン、心電図(ECG)時系列などのさまざまなデバイスから収集されます。これらのデータの異常なパターンは通常、病状を反映しています。
  • 法執行機関:異常検出は、法執行機関で多数のアプリケーションを発見しました。特に、エンティティによる複数のアクションによってのみ異常なパターンを発見できる場合に顕著です。金融取引、取引活動、または保険金請求の不正を判断するには、犯罪者の行動によって生成されたデータの異常なパターンを特定する必要があることがよくあります。
  • 地球科学:気象パターン、気候変動、土地被覆パターンに関する大量の時空間データは、衛星やリモートセンシングなどのさまざまなメカニズムを通じて収集されます。これらのデータの異常は、根本的な原因である可能性のある人間の活動や環境の傾向に関する重要な洞察を提供します。

これらすべてのアプリケーションで、データには「正規」モデルがあり、異常は正規モデルからの逸脱として識別されます。通常のデータポイントは、インライアと呼ばれることもあります。侵入や不正検出などのアプリケーションでは、外れ値は単一のデータポイントではなく、複数のデータポイントのシーケンスに対応します。たとえば、詐欺事件は、特定の順序での個人の行動を反映していることがよくあります。シーケンスの特異性は、異常なイベントの認識に関連しています。このような異常は、データポイントのセットまたはデータポイントのシーケンスからのみ集合的に推測できるため、集合異常とも呼ばれます。この集合的な異常は、多くの場合、異常なイベントによって生成された異常なアクティビティパターンの結果です。
異常検出アルゴリズムの出力は、次の2つのタイプのいずれかになります。

  • 外れ値スコア:ほとんどの異常検出/値アルゴリズムは、各データポイントの「外れ値」レベルを定量化するスコアを出力します。このスコアは、外れ値の傾向に従ってデータポイントを並べ替えるためにも使用できます。これは、特定のアルゴリズムによって提供されるすべての情報を保持する非常に一般的な形式の出力ですが、外れ値と見なされるべき少数のデータポイントの簡潔な要約を提供しません。
  • バイナリラベル:2番目の出力タイプは、データポイントが外れ値であるかどうかを示すバイナリラベルです。一部のアルゴリズムはバイナリラベルを直接返す場合がありますが、外れ値ポイントをバイナリラベルに変換することもできます。これは通常、スコアの統計的分布に基づいて選択される外れ値にしきい値を設定することによって実現されます。バイナリマークにはスコアリングメカニズムよりも少ない情報が含まれていますが、実際のアプリケーションでの意思決定に必要となることが多いのは最終結果です。

2.基本的な異常検出モデル

アナリストの観点からは、異常検出モデルの解釈可能性は非常に重要です。特定のアプリケーションシナリオで必要な診断に関するヒントがアナリストに提供されるため、特定のデータポイントを外れ値と見なす必要がある理由を判断する必要がある場合がよくあります。このプロセスは、外れ値2または異常検出と説明3に関する含意的な知識を発見するプロセスとしても知られていますモデルが異なれば、解釈可能性の程度も異なります。一般に、元の属性を使用し、データの変換(主成分分析など)をあまり使用しないモデルは、解釈可能性が高くなります。トレードオフの結果、データ変換は、解釈可能性を犠牲にして、異常なポイントと正常なデータポイントの間のコントラストを高めることがよくあります。したがって、外れ値分析用の特定のモデルを選択するときは、これらの要因を念頭に置くことが重要です。

2.1確率と統計モデル

確率モデルと統計モデルでは、データは閉じた確率分布モデルの形式でモデル化され、このモデルのパラメーターが学習されます。したがって、ここでの重要な前提は、モデリングを実行するためのデータ分散の特定の選択に関するものです。たとえば、ガウス混合モデルは、データが生成プロセスの出力であり、各ポイントがk個のガウスクラスターの1つに属することを前提としています。これらのガウス分布のパラメーターは、観測データに対して期待値最大化(EM)アルゴリズムを使用して、確率(または尤度)プロセスによって生成されたデータを可能な限り大きくすることを学習しています。この方法の重要な出力は、異なるクラスターへのデータポイントのメンバーシップ確率、および密度に基づくモデル分布のフィッティングです。適合値が非常に低いデータポイントは外れ値と見なされる可能性があるため、これは外れ値をモデル化する自然な方法を提供します。実際のアプリケーションでは、これらの近似値の対数が外れ値スコアとして使用されます。これは、外れ値が対数近似を極値として使用する傾向があるためです。これらの近似値に極値テストを適用して、異常値を特定できます。
確率モデルの主な利点の1つは、各混合コンポーネントに適切な生成モデルがある限り、ほとんどすべてのデータ型(または混合データ型)に簡単に適用できることです。たとえば、データがカテゴリ型の場合、離散ベルヌーイ分布モデルを使用して、混合物の各成分をシミュレートできます。異なるタイプの属性が混在している場合は、属性固有の生成コンポーネントの積を使用できます。このようなモデルは確率で機能するため、データの正規化の問題は生成的な仮定によって説明されています。したがって、確率モデルは、EMアルゴリズムに基づく一般的なフレームワークを提供します。これは、特定のデータ型に比較的簡単に適用できます。他の多くのモデルでは、これは当てはまりません。
確率モデルの欠点の1つは、データを特定の分布に適合させようとすることです。これは、不適切な場合があります。さらに、モデルパラメータの数が増えると、過剰適合の現象がますます一般的になります。この場合、外れ値は正規データの基礎となるモデルに適合する可能性があります。多くのパラメトリックモデルは、特にモデルのパラメーターを基礎となる属性の形でアナリストに直感的に提示できない場合は、含意的な知識で説明することも困難です。これは、異常検出の重要な目的を損なう可能性があります。これは、異常データ生成プロセスの診断的理解を提供することです。

2.2線形モデル

ここに画像の説明を挿入

これらの方法は、低次元部分空間データモデリングの線形依存性を利用します4たとえば、図1.4では、データは2次元空間の1次元線に沿って配置されています。これらの点を通る最良の直線は、回帰分析によって決定されます。一般に、最小二乗フィッティングは、最良の低次元超平面を決定するために使用されます。データポイントとこの超平面の間の距離は、外れ値スコアを定量化するために使用されます。これは、データポイントが通常のデータモデルの偏差を定量化するためです。これらのスコアに極値分析を適用して、外れ値を決定できます。たとえば、図1.4の2次元の例では、データポイント{(xi、yi)、i∈{1 ... n}は、2つの係数aとbを使用して次のように作成できます。
ここに画像の説明を挿入
ここに画像の説明を挿入

2.3近接性に基づくモデル

近接ベースの方法のアイデアは、類似性または距離関数に基づいて残りのデータから外れ値を分離するモデルです。近接ベースの方法は、近接ベースのクラスタリング方法、密度ベースのクラスタリング方法、最近傍ベースの方法など、外れ値分析で最も一般的に使用される方法の1つです。クラスタリングやその他の密度ベースの方法では、データ内の密な領域を直接見つけ、これらの密な領域にない点として外れ値を定義します。あるいは、外れ値は、密集した領域から遠く離れた点として定義できます。クラスタリング手法と密度ベース手法の主な違いは、クラスタリング手法がデータポイントを分割するのに対し、ヒストグラムなどの密度ベース手法はデータ空間を分割することです。これは、後者の場合の目標がデータ空間内のテストポイントの密度を推定することであるためです。これは、空間分割によって最もよく達成されます。

2.4情報理論モデル

前述の外れ値分析モデルの多くは、確率モデルパラメータの生成、クラスタリング、超平面の低次元表現など、さまざまな形式のデータ集約を使用します。これらのモデルは暗黙的に小さなデータの要約を生成し、この要約からの逸脱は外れ値としてマークされます。情報理論の測定は同じ原理に基づいていますが、それは間接的です。外れ値は、データを要約する自然な試みからの逸脱を表すため、データセットを記述するために必要な最小コード長(つまり、抽象の最小長)を増やすという考え方です。

3.異常検出に一般的に使用されるオープンソースライブラリ

3.1Scikit-learn

Scikit-learnは、4つの異常検出メソッド、LOF、IsolationForest、OneClassSVM、EllipticEnvelopeをサポートするPython言語のオープンソース機械学習ライブラリです。

3.2 PyOD

Python Outlier Detection(PyOD)は、現在最も人気のあるPython異常検出ツールライブラリです。主なハイライトは次のとおりです。

  • 従来のLOF / LOCI / ABODなどの約20の一般的な異常検出アルゴリズムと、対立生成モデル(GAN)や統合異常検出(外れ値アンサンブル)などの最新のディープラーニングを含みます。
  • さまざまなバージョンのPythonをサポート:2.7および3.5以降を含む;複数のオペレーティングシステムをサポート:Windows、macOS、Linux
  • 使いやすく一貫性のあるAPIで、数行のコードだけで異常検出を完了できます。これは、多数のアルゴリズムを評価するのに便利です。
  • 最適化に並列化を使用し、アルゴリズムの操作とスケーラビリティ(スケーラビリティ)を高速化し、大量のデータを処理できます

4.例

4.1 KNN

例を通してpyodライブラリの基本的な操作を学びます。pyodライブラリのapiデザインはほぼ完全にscikit-learnを参照しており、ユーザーの学習コストは非常に低いことは言及する価値があります。
簡単に言えば、完全なpyodトレーニングモデルは次のステップに分かれています。

  • データセットを生成するか、既製のデータセットを参照してください
  • トレーニングセットでモデルをトレーニングします
  • テストセットの結果を予測する
  • モデル評価スコアを与える
  • モデルの結果を視覚化する(高次元のデータセットを視覚化するのは難しい)

frompyod.models.knnインポート
KNNfrompyod.utils.dataインポートgenerate_datafrompyod.utils.data
インポートevaluate_printfrompyod.utils.example
インポートビジュアライズ

汚染= 0.1#外れ値のパーセンテージ
n_train = 200#トレーニングポイントの数
n_test = 100#テストポイントの数


仮想データの生成X_train、y_train、X_test、y_test =
generate_data(n_train = n_train、
n_test = n_test、
n_features = 2

constitution = contamination、random_state = 42)


#KNNモデルのトレーニングclf_name = 'KNN'
clf = KNN()
clf.fit(X_train)#モデルをトレーニングするときは、yパラメーターを入力する必要がないことに注意してください。


トレーニングラベルとトレーニングスコアを取得するy_train_pred = clf.labels_#0は正常、1は異常
y_train_scores = clf.decision_scores_#値が大きいほど異常が多い


トレーニング済みモデルを使用して、テストデータのラベルとスコアを予測しますy_test_pred = clf.predict(X_test)
y_test_scores = clf.decision_function(X_test)

#评估は打印が果
版( "\ nトレーニングデータ:")
evaluate_print(clf_name、y_train、y_train_scores)
print( "\ nテストデータ:")
evaluate_print(clf_name、y_test、y_test_scores)

#可视化化化果
視覚化(clf_name、X_train、y_train、X_test、y_test、y_train_pred、
y_test_pred、show_figure = True、save_figure = True)

ここに画像の説明を挿入

4.2隔離の森

4.2.1Scikit-learnを使用して分離フォレストを実装する

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest#
疑似乱数ジェネレーターを
取得rng = np.random.RandomState(42)


指定された形状の配列を作成します。配列要素は標準正規分布に準拠しますN(0,1)X = 0.3 * rng.randn(
100、2 #np.rは、2つの行列を列で接続します。 、2つの行列を上下に
追加し、同じ数の列を必要としますX_train = np.r_ [X + 1、X-3、X-5、X + 6]
print( 'X_train'、X_train)


通常のデータのセットを生成するX = 0.3 * rng.randn(50、2)
X_test = np.r_ [X + 1、X-3、X-5、X + 6]
print( 'X_test'、X_test)


異常データのグループを生成する#
-8から8の間の範囲外の配列をランダムに生成する(20、2)X_outliers = rng.uniform(low = -8、high = 8、size =(20、2))
print( 'X_outliers'、X_outliers)#
モデルの
生成clf = IsolationForest(max_samples = 100)
clf.fit(X_train)#
トレーニングデータの予測値の
生成y_pred_train = clf.predict(X_train)
print( 'y_pred_train'、y_pred_train)#
テストの生成データの予測値
y_pred_test = clf.predict(X_test)
プリント( 'y_pred_test'、y_pred_test)#Generate
範囲外のデータの予測値
y_pred_outliers = clf.predict(X_outliers)
プリント( 'y_pred_outliers'、y_pred_outliers)

XX、YY = np.p.meshspace(np.meshspace(-8、8、50)、np.linspace(-8、8、50))
Z = clf.decision_function(np.c_ [xx.ravel()、yy.ravel ()])
Z = Z.reshape(xx.shape)

plt.title(“ IsolationForest”)
plt.contourf(xx、yy、Z、cmap = plt.cm.Blues_r)

b1 = plt.scatter(X_train [:、0]、X_train [:、1]、c = '白')
b2 = plt.scatter(X_test [:、0]、X_test [:、1]、c = '緑')
c = plt.scatter(X_outliers [:、0]、X_outliers [:、1]、c =' red ')
plt.axis(' tight ')
plt.xlim((-
8、8 ))plt.ylim ((
-8、8 ))plt.legend([b1、b2、c]、
["トレーニング観測"、
"新しい定期観測"、 "新しい異常観測"]、
loc = "左上")
plt.show( )
ここに画像の説明を挿入

4.2.2PyODを使用して分離フォレストを実装する

将来の輸入部門
から将来の輸入print_function
インポートのOS
インポートSYS
pyod.models.iforest輸入IForestから
pyod.utils.data輸入generate_dataから
pyod.utils.data輸入evaluate_printから
pyod.utils.example輸入視覚化から、
もし名前「==メイン
汚染= 0.1#外れ値率
n_train = 200#
の数トレーニング点n_test = 100#测试点数
#サンプルデータ生成
X_train、y_train、X_testをy_test =
generate_data(n_train = n_train、
n_test = n_test、
n_features = 2、
汚染=汚染、
random_state = 42)
#トレーニング
clf = IForest()
clf.fit(X_train)

もし名前==「」:
汚染= 0.1#外れ値のパーセンテージ
トレーニングポイントのn_train = 200#番号
テストポイントのn_test = 100#番号

# 生成样本数据
X_train, y_train, X_test, y_test = \
    generate_data(n_train=n_train,
                  n_test=n_test,
                  n_features=2,
                  contamination=contamination,
                  random_state=42)

# 训练
clf = IForest()
clf.fit(X_train)

# 得到训练数据的预测标签和离群值
y_train_pred = clf.labels_  # 二元标签(0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_  

# 获取测试数据的预测值
y_test_pred = clf.predict(X_test)  # outlier labels (0 or 1)
y_test_scores = clf.decision_function(X_test)  # 异常分数

# 评估并输出结果
print("\nOn Training Data:")
evaluate_print(clf, y_train, y_train_scores)
print("\nOn Test Data:")
evaluate_print(clf, y_test, y_test_scores)

# 可视化结果
visualize(clf, X_train, y_train, X_test, y_test, y_train_pred,
          y_test_pred, show_figure=True, save_figure=False)

トレーニングデータ:
IForest(behaviour = 'old'、bootstrap = False、constitution = 0.1、max_features = 1.0、
max_samples = 'auto'、n_estimators = 100、n_jobs = 1、random_state = None、
verbose = 0)ROC:0.9956、精度@ランクn:0.85

テストデータ:
IForest(behaviour = 'old'、bootstrap = False、constitution = 0.1、max_features = 1.0、
max_samples = 'auto'、n_estimators = 100、n_jobs = 1、random_state = None、
verbose = 0)ROC:0.9967、精度@ランクn:0.9
ここに画像の説明を挿入

4.3ワンクラスSVM

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager
from sklearn import svm

xx、yy = np.meshgrid(np.linspace(-5、5、500)、np.linspace(
-5、5、500 ))#トレインデータを生成
X = 0.3 * np.random.randn(100、2)
X_train = np.r_ [X + 2、X-2]
#いくつかの定期的な新規観測値を生成する
X = 0.3 * np.random.randn(
20、2 X_test = np.r_ [X + 2、X-2]
#Generateいくつかの異常な新規観測
X_outliers = np.random.uniform(low = -4、high = 4、size =(20、2))

#fit the model
clf = svm.OneClassSVM(nu = 0.1、kernel =“ rbf”、gamma = 0.1)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf。予測(X_outliers)
n_error_train = y_pred_train [y_pred_train == -1] .size
n_error_test = y_pred_test [y_pred_test == -1] .size
n_error_outliers = y_pred_outliers [y_pred_outliers == 1] .size

#線、点、および平面に最も近いベクトルを
プロットするZ = clf.decision_function(np.c_ [xx.ravel()、yy.ravel()])
Z = Z.reshape(xx.shape)

plt.title( "Novelty Detection")
plt.contourf(xx、yy、Z、levels = np.linspace(Z.min()、0、7)、cmap = plt.cm.PuBu)#の領域を描画します異常サンプル
a = plt.contour(xx、yy、Z、levels = [0]、linewidths = 2、colors = 'darkred')#正常サンプルと異常サンプルの境界を描画します
plt.contourf(xx、yy、Z、 level = [0、Z.max()]、colors = 'palevioletred')#通常のサンプル領域を描画します
s = 40
b1 = plt.scatter(X_train [:、0]、X_train [:、1]、c = '白 '、s = s、edgecolors =' k ')
b2 = plt.scatter(X_test [:、0]、X_test [:、1]、c =' blueviolet '、s = s、
edgecolors =' k ')
c = plt .scatter(X_outliers [:、0]、X_outliers [:、1]、c = 'gold'、s = s、
edgecolors = 'k')
plt.axis( 'tight')
plt.xlim((-5 、5))
plt.ylim((-
5、5 ))plt.legend([a.collections [0]、b1、b2、c]、
[「学習したフロンティア」、「トレーニング観測」、
「新しい定期観測」、「新しい異常観測」]、
loc =「左上」、
prop = matplotlib.font_manager.FontProperties(size = 11))
plt.xlabel(
"エラートレイン:%d / 200;エラーノベルレギュラー:%d / 40; "
"エラーノベル異常:%d / 40 "
%(n_error_train、n_error_test、n_error_outliers))
plt.show()

ここに画像の説明を挿入

4.4局所外れ値因子

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import LocalOutlierFactor
from scipy import stats

#トレーニングサンプルを
作成するn_samples = 200#サンプルの総数outliers_fraction =
0.25#異常なサンプルの
割合n_inliers = int((1.-outliers_fraction)* n_samples)
n_outliers = int(outliers_fraction * n_samples)

rng = np.random.RandomState(42)
X = 0.3 * rng.randn(n_inliers // 2、2)
X_train = np.r_ [X + 2、X-2]#通常のサンプル
X_train = np.r_ [X_train、 np.random.uniform(low = -6、high = 6、size =(n_outliers、2))]#正常なサンプルと異常なサンプル

#fit the model
clf = LocalOutlierFactor(n_neighbors = 35、
convention = outliers_fraction y_pred = clf.fit_predict(X_train)
scores_pred = clf.negative_outlier_factor_threshold
= stats.scoreatpercentile(scores_pred、100、outliers_fractionに従ってしきい値を取得)

#決定関数
xx、yy = np.meshgrid(np.linspace(-7、7、50)、np.linspace(-7、7、50))のレベルセットをプロットします
。Z=clf。decision_function (np.c [xx.ravel()、yy.ravel()])#scores_predの値と同様に、値が小さいほど、異常点である可能性が高くなります
Z = Z.reshape(xx.shape)

plt.title(“ Local Outlier Factor(LOF)”)
#plt.contourf(xx、yy、Z、cmap = plt.cm.Blues_r)

plt.contourf(xx、yy、Z、levels = np.linspace(Z.min()、threshold、7)、cmap = plt.cm.Blues_r)#異常な点の領域を描画します。しきい値までの値
a = plt.contour(xx、yy、Z、levels = [threshold]、linewidths = 2、colors = 'red')#異常点領域と正常点領域の境界を描画します
plt.contourf( xx、yy、Z、levels = [threshold、Z.max()]、colors = 'palevioletred')#通常のポイント領域、つまりしきい値から最大部分までの値を描画します

b = plt.scatter(X_train [:-n_outliers、0]、X_train [:-n_outliers、1]、c = 'white'、
s = 20、edgecolor = 'k')
c = plt.scatter(X_train [-n_outliers :、0]、X_train [-n_outliers:、1]、c = '黒'、
s = 20、edgecolor = 'k')
plt.axis( 'tight')
plt.xlim((-
7、7 ))plt .ylim((-
7、7 ))plt.legend([a.collections [0]、b、c]、
['学習した決定関数'、 '真の外れ値'、 '真の外れ値']、
loc =“左上”)
plt.show()
ここに画像の説明を挿入


  1. D.ホーキンス。外れ値の識別、チャップマンアンドホール、1980年。↩︎

  2. E.KnorrおよびR.Ng。距離ベースの外れ値の内包的知識を見つける。VLDB会議、1999年。↩︎

  3. L. Akoglu、E。Muller、およびJVreeken。外れ値の検出と説明に関するACMKDDワークショップ、2013年。http://www.outlieranalytics.org/odd13kdd/↩︎

  4. P.RousseeuwとA.Leroy ロバスト回帰と外れ値の検出。Wiley、2003年。↩︎

おすすめ

転載: blog.csdn.net/weixin_43595036/article/details/112488120