異常検出-線形モデル

I.はじめに

通常、実際のデータの属性には高い相関関係があります。この依存関係は、相互に属性を予測する機能を提供します。予測と異常検出の概念は密接に関連しています。結局のところ、外れ値は特定のモデルの期待値(または予測値)と一致していません。線形モデルは、この目標を達成するために属性間の依存関係を使用することに焦点を当てています。古典的な統計文献では、このプロセスは回帰モデリングと呼ばれています。
回帰モデリングは、相関分析のパラメトリック形式です。相関分析のいくつかの形式は、他の独立変数から従属変数を予測しようとしますが、他の形式の相関分析は、潜在変数の形式でデータ全体を要約します。後者の例は、主成分分析法です。これらの2つの形式のモデリングは、外れ値分析のさまざまなシナリオで非常に役立ちます。前者は時系列などの複雑なデータ型に役立ち、後者は通常の多次元データ型に役立ちます。
線形モデルの主な仮定は、(通常の)データが低次元の部分空間に埋め込まれていることです。したがって、この埋め込みモデルに準拠していないデータポイントは、外れ値と見なされます。線形法では、異常な点の振る舞いが他の点と大きく異なる低次元の部分空間を見つけることが目標です。

2つの線形回帰モデル

線形回帰では、データの観測値は一連の線形方程式によってモデル化されます。具体的には、データ内のさまざまな次元は、線形方程式のセットを使用して相互に関連付けられており、それらの係数はデータ駆動型の方法で学習する必要があります。観測値の数は通常、データの次元数よりもはるかに多いため、この連立方程式は、正確に解くことができない(つまり、ゼロエラー)過剰決定系の連立方程式です。したがって、これらのモデルによって学習された係数は、線形モデルによって予測された値からのデータポイントの二乗誤差の偏差を最小限に抑えます。誤差関数の正確な選択により、特定の変数が特別に扱われるか(つまり、予測変数値の誤差)、または変数が均一に扱われるか(つまり、推定された低次元平面からの誤差距離)が決まります。 。エラー関数のこれらの異なる選択は、同じモデルにつながることはありません。実際、特に外れ値が存在する場合、これらのモデルは性質が大きく異なります。
回帰分析は、一般的に統計の分野で重要なアプリケーションと見なされています。このアプリケーションの古典的な例では、特定の従属変数の値を一連の独立変数から学習する必要があります。これは時系列分析の一般的な状況です。独立変数は説明変数とも呼ばれます。これはコンテキストデータ型の一般的なテーマであり、一部の属性(たとえば、時間、空間位置、または隣接するシーケンス値)は独立していると見なされ、他の属性(たとえば、温度や環境の測定値)は関連していると見なされます。単純な多次元データ型の場合、すべての次元が同じ方法で処理され、すべての属性間の最適な線形関係が推定されます。
属性がコンテキスト属性と動作属性に分割されている、時間データや空間データなどのドメインについて考えてみます。この場合、特定の行動属性値は通常、期待値からの偏差を決定するために、そのコンテキスト近傍の行動属性の線形関数として予測されます。これは、時間または空間データから多次元データセットを構築することによって実現されます。このデータセットでは、特定の行動属性値(現在の時刻の温度など)が従属変数と見なされ、それに関連する近傍の行動値が示されます。 (たとえば、前のウィンドウの温度)は独立変数と見なされます。したがって、推定された偏差は、外れ値ポイントを定量化するために使用されます。この場合、外れ値は予測された従属変数の誤差に基づいて定義され、独立変数間の関係の異常はそれほど重要ではないと見なされます。したがって、最適化プロセスの焦点は、正規データのモデルを構築するために、従属変数の予測誤差を最小化することです。このモデルから逸脱する値は、外れ値としてマークされます。
通常、異常検出と呼ばれるものは、変数に特別な処理を加えません。外れ値の定義は、基になるデータポイントの全体的な分布に基づいています。したがって、より一般的な回帰モデリングが必要です。このメソッドは、すべての変数を処理し、データの射影誤差をこのレベルに最小化することにより、最良の回帰レベル。この場合、変数X1、X2、...、Xdのセットがあり、対応する回帰平面が次のとおりであると仮定します。
ここに画像の説明を挿入
後続の計算の便宜のために、次の制約がパラメーターに課されます
ここに画像の説明を挿入
。L2ノルムが使用されます。ターゲット関数として:
ここに画像の説明を挿入

3、PCA

最小二乗法は、単に(d-1)次元の超平面を見つけて、直交方向に沿って最適なデータ値と誤差を取得しようとしているだけです。主成分分析は、この問題の一般化です。具体的には、任意の次元の最適な表現超平面を見つけることができます。言い換えると、PCA法は、k次元の超平面(k <dの任意の値)を決定できるため、残りの(dk)次元の2乗投影誤差を最小限に抑えることができます。最小二乗の最適解は、主成分分析の特殊なケースであり、k = d-1を設定することによって得られます。
異常検出に関連する主成分分析の主な特性は次のとおりです。

  • 最初のk個の固有ベクトルが選択された場合(最大のk個の固有値に従って)、これらの固有ベクトルによって定義されたk次元のスーパーフラットは次元kのすべてのスーパーフラットにあり、すべてのデータポイントはその平均になります距離は非常に小さいです平らな面で可能な限り。
  • データが直交固有ベクトルに対応する軸システムに変換される場合、各固有ベクトル次元に沿った変換されたデータの差は、対応する固有値に等しくなります。この新しい式では、変換されたデータの分散はゼロです。
  • 固有値が小さい固有ベクトルに沿った変換されたデータの差は非常に小さいため、これらの方向に沿った変換されたデータの平均からの有意な偏差は、外れ値を示している可能性があります。
    ここに画像の説明を挿入
    主成分分析と従属変数回帰は、いくつかの外れ値の存在をより安定して処理できます。これは、主成分分析が特定の変数ではなく、最適なスーパーフラットに基づいて誤差を計算するためです。より多くの外れ値がデータに追加されると、最適なスーパーフラットの変化は通常、外れ値の選択に影響を与えるほど大きくはありません。したがって、回帰モデルは最初からより正確であるため、この方法では正しい外れ値が選択される可能性が高くなります。

4つの例

1.データの視覚化

インポート警告
warnings.filterwarnings( 'ignore')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno
##ロードトレーニングセットとテストセット;
パス= ' 。/ '
f = open (path + 'breast-cancer-unsupervised-ad.csv')
Train_data = pd.read_csv(f)
##簡単な観測データ(head()+ shape)
Train_data.head()
ここに画像の説明を挿入
##簡単な観測データ(tail()+ shape )
Train_data.tail()
ここに画像の説明を挿入
## describe()を使用して、データの関連する統計に精通し
ますTrain_data.describe()
ここに画像の説明を挿入
## info()を使用して、データタイプ
Train_data.info()
<class'pandasに精通します。 core.frame.DataFrame '>
RangeIndex:367エントリ、0〜366
データ列(合計31列):

列の非ヌルカウントDtype


0 f0 367 non-null float64
1 f1 367 non-null float64
2 f2 367 non-null float64
3 f3 367 non-null float64
4 f4 367 non-null float64
5 f5 367 non-null float64
6 f6 367 non-null float64
7 f7367非nullfloat64
8 f8367非nullfloat64
9 f9367
非ヌルfloat6410 f10367
非ヌルfloat6411 f11367
非ヌルfloat6412 f12367
非ヌルfloat6413 f13367非ヌルfloat6414
f14 367 non-null float64
15 f15 367 non-null float64
16 f16 367 non-null float64
17 f17 367 non-null float64
18 f18 367 non-null float64
19 f19 367 non-null float64
20 f20 367 non-null float64
21 F21 367の非ヌルのfloat64
22 F22 367の非ヌルのfloat64
23 F23 367の非ヌルのfloat64
24 F24 367の非ヌルのfloat64
25 F25 367の非ヌルのfloat64
26 F26 367の非ヌルのfloat64
27 F27 367の非ヌルのfloat64
28 f28367非nullfloat64
29 f29367非ヌルfloat6430
ラベル367非ヌルオブジェクト
dtypes:float64(30)、object(1)
メモリ使用量:89.0+ KB
numeric_features = ['f' + str(i)for i in range(30)]
##相関連性分析
数値= Train_data [numeric_features]
相関= numeric.corr()
f、ax = plt.subplots(figsize =(14、14))
sns.heatmap(correlation、square = True)
plt.title( '数値特徴と価格の相関'、y = 1、size = 16)
plt.show()
ここに画像の説明を挿入
##各デジタル機能の分布の視覚化
f = pd.melt(Train_data、value_vars = numeric_features)
g = sns.FacetGrid(f、col =“ variable”、col_wrap = 6、sharex = False、sharey = False)
g = g.map(sns.distplot、“ value”、hist = False、rug = True)
ここに画像の説明を挿入
sns.set()#
30個のフィーチャが2つのペア間の相関グラフを生成するため、30x30で合計900個ありますサブグラフ、サブ画像は非常に密に見え、より構成可能です。
#ここでは、最初の6つの機能間の相関関係のみを示しています。
sns.pairplot(Train_data [numeric_features [:6]]、size = 2、kind = 'scatter'、diag_kind = 'kde')
plt.savefig( 'correlation.png')
plt.show()
ここに画像の説明を挿入
from sklearn.manifold import TSNE
tsne = TSNE(n_components = 2、#埋め込みスペースの次元(埋め込みスペースは結果スペースを意味します)
init = 'pca'、#埋め込みスペースの初期化、
文字列' random '、 'pca'またはnumpy配列random_state = 0を受け取ります)
結果= tsne.fit_transform(numeric)
x_min、x_max = np.min(result、0)、np.max(result、0)
result =(result-x_min)/(x_max-x_min)
label = Train_data ['label']
fig = plt.figure(figsize = (
7、7))#f、ax = plt.subplots()
color = {'o':0、 'n':7}
for i in range(result.shape [0]):
plt.text(result [ i、0]、result [i、1]、str(label [i])、
color = plt.cm.Set1(color [label [i]] / 10。)、
fontdict = {'weight': 'bold' 、 'サイズ':9})
plt.xticks([])
plt.yticks([])
plt.title( 'データ次元削減の視覚化')
plt.show()
ここに画像の説明を挿入

2. pyodライブラリを使用して例を生成し、ライブラリのpcaモジュールを使用して検出します

from pyod.models.pca import PCA
from pyod.utils.data import generate_data
from pyod.utils.data import Evaluation_print
from pyod.utils.example import
Visualize #Generate sample data
X_train、y_train、X_test、y_test =
generate_data(n_train = 1000、 #トレーニングポイントの数
n_test = 250、#テストポイントの数
n_features = 2、
汚染= 0.05、#外れ値の割合
random_state = 29)
#trainone_class_svm検出器
clf_name = 'PCA'
clf = PCA()
clf.fit(X_train)
トレーニングデータの予測ラベルと外れ値スコアを取得します
y_train_pred = clf.labels_#バイナリラベル(0:インライア、1:外れ値)
y_train_scores = clf.decision_scores_#生の異常スコア#
テストデータの予測を取得
y_test_pred = clf.predict(X_test)#異常ラベル(0または1)
y_test_scores = clf.decision_function(X_test)#異常スコア#評価し
て結果を出力
print( "\ nトレーニングデータ:")
evaluate_print(clf_name、y_train、y_train_scores)
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)

トレーニングデータについて:
PCA ROC:0.997、精度@ランクn:0.94

テストデータ:
PCA ROC:0.9793、精度@ランクn:0.75
ここに画像の説明を挿入

おすすめ

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