1. 程式人生 > >異常檢測概覽——孤立森林和局部異常因子算法效果是最好的

異常檢測概覽——孤立森林和局部異常因子算法效果是最好的

amp identify alt str jpg svm 3rd 影響 .net

轉自博客:

一、關於異常檢測

異常檢測(outlier detection)在以下場景:

  • 數據預處理
  • 病毒木馬檢測
  • 工業制造產品檢測
  • 網絡流量檢測

等,有著重要的作用。由於在以上場景中,異常的數據量都是很少的一部分,因此諸如:SVM、邏輯回歸等分類算法,都不適用,因為:

監督學習算法適用於有大量的正向樣本,也有大量的負向樣本,有足夠的樣本讓算法去學習其特征,且未來新出現的樣本與訓練樣本分布一致。

以下是異常檢測和監督學習相關算法的適用範圍:

異常檢測:信用卡詐騙、制造業產品異常檢測、數據中心機器異常檢測、入侵檢測

監督學習:垃圾郵件識別、新聞分類

二、異常檢測算法

1. 基於統計與數據分布

假設數據集應滿足正態分布(Normal Distribution),即:

技術分享

分布的平均值為μ和方差為σ2 。

技術分享

當滿足上圖訓練數據的正態分布,如果x的值大於4或者小於-4,都可以認為是異常值。

以下以“600680”股票成交量為例:

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

近三個月,成交量大於200000就可以認為發生了異常(天量,嗯,要註意風險了……)

技術分享

算法示例:

技術分享

2. 箱線圖分析

箱線圖,不做過多說明了:

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

圖:

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

技術分享

大體可以知道,該股票在成交量少於20000,或者成交量大於80000,就應該提高警惕啦!

3. 基於距離/密度

典型的算法是:“局部異常因子算法-Local Outlier Factor”,該算法通過引入“k-distance,第k距離”、“k-distance neighborhood,第k距離鄰域”、“reach-distance,可達距離”、以及“local reachability density,局部可達密度 ”和“local outlier factor,局部離群因子”,來發現異常點,詳情可參考:異常點/離群點檢測算法--LOF - wangyibo0201的博客 - 博客頻道 - CSDN.NET

4. 基於劃分思想

典型的算法是 “孤立森林,Isolation Forest”,其思想是:

假設我們用一個隨機超平面來切割(split)數據空間(data space), 切一次可以生成兩個子空間(想象拿刀切蛋糕一分為二)。之後我們再繼續用一個隨機超平面來切割每個子空間,循環下去,直到每子空間裏面只有一個數據點為止。直觀上來講,我們可以發現那些密度很高的簇是可以被切很多次才會停止切割,但是那些密度很低的點很容易很早的就停到一個子空間了。

這個的算法流程即是使用超平面分割子空間,然後建立類似的二叉樹的過程:

技術分享

詳情見:

iForest (Isolation Forest)孤立森林 異常檢測 入門篇IsolationForest example

示例代碼:

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()

結果如下,其中:紅色即為異常點,白色是訓練集,綠色是測試數據
技術分享

註意:孤立森林不適用於特別高維的數據。由於每次切數據空間都是隨機選取一個維度,建完樹後仍然有大量的維度信息沒有被使用,導致算法可靠性降低。高維空間還可能存在大量噪音維度或無關維度(irrelevant attributes),影響樹的構建。孤立森林算法具有線性時間復雜度。因為是ensemble的方法,所以可以用在含有海量數據的數據集上面。通常樹的數量越多,算法越穩定。由於每棵樹都是互相獨立生成的,因此可以部署在大規模分布式系統上來加速運算。

5. 其他算法

包括:One-class SVM 以及 Elliptic Envelope 等。

參考:2.7. Novelty and Outlier Detection

6. 值得一提

這些算法裏面,孤立森林和局部異常因子算法相比之下,效果是最好的。

文章參考資料:

Isolation ForestLOF – Identifying Density-Based Local Outlierskamidox.com異常檢測(anomaly detection)如何在Python中實現這五類強大的概率分布 - Python - 伯樂在線博客頻道 - CSDN.NET2.7. Novelty and Outlier DetectioniForest (Isolation Forest)孤立森林 異常檢測 入門篇異常點檢測算法(一)
異常值檢測算法(二)
異常點檢測算法(三)
異常點檢測算法綜述

異常檢測概覽——孤立森林和局部異常因子算法效果是最好的