2023 Huashu Cup 数学モデリングのアイデア - ケース: 異常検出

質問のアイデア

(コンテストの質問が出たらすぐに CSDN で共有します)

https://blog.csdn.net/dc_sinor?type=blog

1. はじめに – 異常検出について

次のシナリオでの異常検出 (外れ値検出):

  • データの前処理
  • ウイルス・トロイの木馬の検出
  • 工業製品の試験
  • ネットワークトラフィックの検出

待ってください、重要な役割があります。上記のシナリオでは、異常なデータの量はごく一部であるため、次の理由により、SVM やロジスティック回帰などの分類アルゴリズムは適用できません。

教師あり学習アルゴリズムは、多数の陽性サンプルと多数の陰性サンプルに適しており、アルゴリズムがその特性を学習するのに十分なサンプルがあり、将来の新しいサンプルはトレーニング サンプルの分布と一致します。

異常検出および教師あり学習に関連するアルゴリズムの適用範囲は次のとおりです。

異常検出

  • クレジットカード詐欺
  • 製造製品の異常検知
  • データセンターマシンの異常検出
  • 侵入検知

教師あり学習

  • スパムの識別
  • ニュースのカテゴリー

2. 異常検知アルゴリズム

ここに画像の説明を挿入
ここに画像の説明を挿入

import tushare
from matplotlib import pyplot as plt
 
df = tushare.get_hist_data("600680")
v = df[-90: ].volume
v.plot("kde")
plt.show()

過去 3 か月間の取引量が 200,000 件を超える場合は、異常とみなされる可能性があります。

ここに画像の説明を挿入
ここに画像の説明を挿入

2. 箱ひげ図分析

import tushare
from matplotlib import pyplot as plt
 
df = tushare.get_hist_data("600680")
v = df[-90: ].volume
v.plot("kde")
plt.show()

ここに画像の説明を挿入
一般的に、株式の取引高が 20,000 株未満、または取引高が 80,000 株を超える場合は、より警戒する必要があることが知られています。

3. 距離/密度ベース

典型的なアルゴリズムは次のとおりです。「ローカル外れ値因子アルゴリズム - ローカル外れ値因子」では、「k 番目の距離、k 番目の距離」、「k 番目の距離の近傍、k 番目の距離の近傍」、「到達距離、到達可能な距離」が導入されます。 、および「ローカル到達可能密度、ローカル到達可能密度」および「ローカル外れ値係数、ローカル外れ値係数」を使用して外れ値を見つけます。

図 2 に示すように、C1 セットの点については、全体の間隔、密度、分散が比較的均一であり、同じクラスターとみなすことができます。C2 セットの点については、それらを視覚的に確認することもできます。クラスターとしてみなされます。点 o1 と点 o2 は比較的孤立しており、異常点または離散点と見なすことができます。ここで問題となるのは、密度分布が大きく異なる C1 と C2 の外れ値の特定を満たすアルゴリズムの一般性をどのように実現するかです。LOF なら私たちの目標を達成できます。

ここに画像の説明を挿入
ここに画像の説明を挿入

4. 分割の考え方に基づいて

典型的なアルゴリズムは「孤立の森、孤立の森」であり、その考え方は次のとおりです。

ランダムな超平面を使用してデータ空間 (データ空間) を分割 (分割) すると、1 回の切断で 2 つの部分空間が生成されます (ケーキをナイフで 2 つに切ることを想像してください)。その後、ランダムな超平面を使用して各部分空間を切り取り、各部分空間にデータ ポイントが 1 つだけになるまでこのサイクルが続きます。直感的に言えば、密度の高いクラスターは切断を停止するまでに何度も切断できることがわかりますが、密度が低い点は非常に早い段階で部分空間で簡単に停止する可能性があります。

このアルゴリズム フローは、超平面を使用して部分空間を分割し、同様の二分木を構築するプロセスです。

ここに画像の説明を挿入

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

rng = np.random.RandomState(42)

# Generate train data
X = 0.3 * rng.randn(100, 2)
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
# Generate some regular novel observations
X = 0.3 * rng.randn(20, 2)
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
# Generate some abnormal novel observations
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))

# fit the model
clf = IsolationForest(max_samples=100*2, random_state=rng)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

# plot the line, the samples, and the nearest vectors to the plane
xx, yy = np.meshgrid(np.linspace(-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='white')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
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],
           ["training observations",
            "new regular observations", "new abnormal observations"],
           loc="upper left")
plt.show()

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/dc_sinor/article/details/132008609