異常檢測(一)概述

1異常檢測概述

image.png

2異常檢測常用方法

傳統(tǒng)方法

基于傳統(tǒng)統(tǒng)計(jì)學(xué)方法

統(tǒng)計(jì)學(xué)方法對數(shù)據(jù)的正常性做出假定。它們假定正常的數(shù)據(jù)對象由一個(gè)統(tǒng)計(jì)模型產(chǎn)生,而不遵守該模型的數(shù)據(jù)是異常點(diǎn)。統(tǒng)計(jì)學(xué)方法的有效性高度依賴于對給定數(shù)據(jù)所做的統(tǒng)計(jì)模型假定是否成立。

異常檢測的統(tǒng)計(jì)學(xué)方法的一般思想是:學(xué)習(xí)一個(gè)擬合給定數(shù)據(jù)集的生成模型,然后識別該模型低概率區(qū)域中的對象,把它們作為異常點(diǎn)。

即利用統(tǒng)計(jì)學(xué)方法建立一個(gè)模型,然后考慮對象有多大可能符合該模型。(很多時(shí)候一些數(shù)據(jù)分析的異動(dòng)告警也是利用這樣的方法,當(dāng)某些數(shù)據(jù)在三個(gè)\sigma之外,就會(huì)被視為異常)

假定輸入數(shù)據(jù)集為{x^{(1)}, x^{(2)}, ..., x^{(m)}},數(shù)據(jù)集中的樣本服從正態(tài)分布,即x^{(i)}\sim N(\mu, \sigma^2),我們可以根據(jù)樣本求出參數(shù)\mu\sigma

\mu=\frac 1m\sum_{i=1}^m x^{(i)}

\sigma^2=\frac 1m\sum_{i=1}^m (x^{(i)}-\mu)^2

線性模型

典型的如PCA方法,Principle Component Analysis是主成分分析,簡稱PCA。它的應(yīng)用場景是對數(shù)據(jù)集進(jìn)行降維。降維后的數(shù)據(jù)能夠最大程度地保留原始數(shù)據(jù)的特征(以數(shù)據(jù)協(xié)方差為衡量標(biāo)準(zhǔn))。 PCA的原理是通過構(gòu)造一個(gè)新的特征空間,把原數(shù)據(jù)映射到這個(gè)新的低維空間里。PCA可以提高數(shù)據(jù)的計(jì)算性能,并且緩解"高維災(zāi)難"。
PCA降維的一個(gè)基本點(diǎn)與兩個(gè)原則,一個(gè)基本點(diǎn):中心化;兩個(gè)基本原則:最大投影方差(即點(diǎn)與點(diǎn)之間投影后的距離越遠(yuǎn)越好),最小重構(gòu)代價(jià)(對降維后的數(shù)據(jù)進(jìn)行升維之后,信息損失越小越好)

基于相似度的方法

這類算法適用于數(shù)據(jù)點(diǎn)的聚集程度高、離群點(diǎn)較少的情況。同時(shí),因?yàn)橄嗨贫人惴ㄍǔP枰獙γ恳粋€(gè)數(shù)據(jù)分別進(jìn)行相應(yīng)計(jì)算,所以這類算法通常計(jì)算量大,不太適用于數(shù)據(jù)量大、維度高的數(shù)據(jù)。
??基于相似度的檢測方法大致可以分為三類:

  • 基于集群(簇)的檢測,如DBSCAN等聚類算法。
    ??聚類算法是將數(shù)據(jù)點(diǎn)劃分為一個(gè)個(gè)相對密集的“簇”,而那些不能被歸為某個(gè)簇的點(diǎn),則被視作離群點(diǎn)。這類算法對簇個(gè)數(shù)的選擇高度敏感,數(shù)量選擇不當(dāng)可能造成較多正常值被劃為離群點(diǎn)或成小簇的離群點(diǎn)被歸為正常。因此對于每一個(gè)數(shù)據(jù)集需要設(shè)置特定的參數(shù),才可以保證聚類的效果,在數(shù)據(jù)集之間的通用性較差。聚類的主要目的通常是為了尋找成簇的數(shù)據(jù),而將異常值和噪聲一同作為無價(jià)值的數(shù)據(jù)而忽略或丟棄,在專門的異常點(diǎn)檢測中使用較少。
    ??聚類算法的優(yōu)缺點(diǎn):
    (1)能夠較好發(fā)現(xiàn)小簇的異常;
    (2)通常用于簇的發(fā)現(xiàn),而對異常值采取丟棄處理,對異常值的處理不夠友好;
    (3)產(chǎn)生的離群點(diǎn)集和它們的得分可能非常依賴所用的簇的個(gè)數(shù)和數(shù)據(jù)中離群點(diǎn)的存在性;
    (4)聚類算法產(chǎn)生的簇的質(zhì)量對該算法產(chǎn)生的離群點(diǎn)的質(zhì)量影響非常大。
  • 基于距離的度量,如k近鄰算法。
    ??k近鄰算法的基本思路是對每一個(gè)點(diǎn),計(jì)算其與最近k個(gè)相鄰點(diǎn)的距離,通過距離的大小來判斷它是否為離群點(diǎn)。在這里,離群距離大小對k的取值高度敏感。如果k太小(例如1),則少量的鄰近離群點(diǎn)可能導(dǎo)致較低的離群點(diǎn)得分;如果k太大,則點(diǎn)數(shù)少于k的簇中所有的對象可能都成了離群點(diǎn)。為了使模型更加穩(wěn)定,距離值的計(jì)算通常使用k個(gè)最近鄰的平均距離。
    ??k近鄰算法的優(yōu)缺點(diǎn):
    (1)簡單;
    (2)基于鄰近度的方法需要O(m2)時(shí)間,大數(shù)據(jù)集不適用;
    (3)對參數(shù)的選擇敏感;
    (4)不能處理具有不同密度區(qū)域的數(shù)據(jù)集,因?yàn)樗褂萌珠撝?,不能考慮這種密度的變化。
  • 基于密度的度量,如LOF(局部離群因子)算法。
    ??局部離群因子(LOF)算法與k近鄰類似,不同的是它以相對于其鄰居的局部密度偏差而不是距離來進(jìn)行度量。它將相鄰點(diǎn)之間的距離進(jìn)一步轉(zhuǎn)化為“鄰域”,從而得到鄰域中點(diǎn)的數(shù)量(即密度),認(rèn)為密度遠(yuǎn)低于其鄰居的樣本為異常值。
    LOF(局部離群因子)算法的優(yōu)缺點(diǎn):
    (1)給出了對離群度的定量度量;
    (2)能夠很好地處理不同密度區(qū)域的數(shù)據(jù);
    (3)對參數(shù)的選擇敏感。

集成方法

集成是提高數(shù)據(jù)挖掘算法精度的常用方法。集成方法將多個(gè)算法或多個(gè)基檢測器的輸出結(jié)合起來。其基本思想是一些算法在某些子集上表現(xiàn)很好,一些算法在其他子集上表現(xiàn)很好,然后集成起來使得輸出更加魯棒。集成方法與基于子空間方法有著天然的相似性,子空間與不同的點(diǎn)集相關(guān),而集成方法使用基檢測器來探索不同維度的子集,將這些基學(xué)習(xí)器集合起來。

常用的集成方法有Feature bagging,孤立森林等。

feature bagging

與bagging法類似,只是對象是feature。

孤立森林:

孤立森林假設(shè)我們用一個(gè)隨機(jī)超平面來切割數(shù)據(jù)空間,切一次可以生成兩個(gè)子空間。然后我們繼續(xù)用隨機(jī)超平面來切割每個(gè)子空間并循環(huán),直到每個(gè)子空間只有一個(gè)數(shù)據(jù)點(diǎn)為止。直觀上來講,那些具有高密度的簇需要被切很多次才會(huì)將其分離,而那些低密度的點(diǎn)很快就被單獨(dú)分配到一個(gè)子空間了。孤立森林認(rèn)為這些很快被孤立的點(diǎn)就是異常點(diǎn)。

用四個(gè)樣本做簡單直觀的理解,d是最早被孤立出來的,所以d最有可能是異常。


孤立森林

機(jī)器學(xué)習(xí)

在有標(biāo)簽的情況下,可以使用樹模型(gbdt,xgboost等)進(jìn)行分類,缺點(diǎn)是異常檢測場景下數(shù)據(jù)標(biāo)簽是不均衡的,但是利用機(jī)器學(xué)習(xí)算法的好處是可以構(gòu)造不同特征。

異常檢測常用開源庫

Sklearn & PyOD

https://zhuanlan.zhihu.com/p/58313521
知乎專欄對PyOD做了詳細(xì)的說明,下面我就簡單的說一下常用API

https://pyod.readthedocs.io/en/latest/
PyOD官網(wǎng)

PyOD

Python Outlier Detection(PyOD)的亮點(diǎn)

  • 包括了20種常見的異常檢測算法,比如經(jīng)典的LOF/LOCI/ABOD以及最新的深度學(xué)習(xí)如對抗生成模型(GAN)和集成異常檢測(outlier ensemble)
  • 支持不同版本的Python:包括2.7 和3.5+;支持多種操作系統(tǒng):windows,macOS和Linux
  • 簡單易用且一致的API,只需要幾行代碼就可以完成異常檢測,方便大量評估算法
  • 使用JIT和并行化(parallelization)進(jìn)行優(yōu)化,加速算法運(yùn)行及拓展性(scalability),可以處理大量數(shù)據(jù)

1.背景

PyOD提供了約20種異常檢測算法(詳見圖1)部分算法介紹可以參考「數(shù)據(jù)挖掘中常見的「異常檢測」算法有哪些?」或異常檢測領(lǐng)域的經(jīng)典教科書[7]。同時(shí)該工具庫也包含了一系列輔助功能,包括數(shù)據(jù)可視化及結(jié)果評估等:

PyOD中所包括的算法一欄

2.API介紹與實(shí)例

特別需要注意的是,異常檢測算法基本都是無監(jiān)督學(xué)習(xí),所以只需要X(輸入數(shù)據(jù)),而不需要y(標(biāo)簽)。PyOD的使用方法和Sklearn中聚類分析很像,它的檢測器(detector)均有統(tǒng)一的API。所有的PyOD檢測器clf均有統(tǒng)一的API以便使用,完整的API使用參考可以查閱(API CheatSheet - pyod 0.6.8 documentation):

  • fit(x):用數(shù)據(jù)x來“訓(xùn)練/擬合“ 檢測器clf。即初始化檢測器clf后,用X來訓(xùn)練它
  • fit_predict_score(x,y):用數(shù)據(jù)x來訓(xùn)練檢測器clf,并預(yù)測x的預(yù)測值,并在真實(shí)標(biāo)簽y上進(jìn)行評估,此處的y只用于評估,而非訓(xùn)練
  • decision_function(x):在檢測器clf被fit后,可以通過函數(shù)來預(yù)測未知數(shù)據(jù)的異常程度,返回值為原始分?jǐn)?shù),并非0或1。返回分?jǐn)?shù)越高,則該數(shù)據(jù)點(diǎn)的異常程度越高
  • predict(X):在檢測器clf被fit后,預(yù)測未知數(shù)據(jù)的異常概率,返回該點(diǎn)是異常點(diǎn)的概率

當(dāng)檢測器clf被初始化且fitx(x)函數(shù)被執(zhí)行后,clf就會(huì)生成兩個(gè)重要的屬性:

  • decision_scores:數(shù)據(jù)x上的異常打分,分?jǐn)?shù)越高,則該異常點(diǎn)的異常成都越高
  • labels_:數(shù)據(jù)X上的異常標(biāo)簽,返回值為二分類標(biāo)簽(0為正常點(diǎn),1位異常點(diǎn))

不難看出,當(dāng)我們初始化一個(gè)檢測器clf后,可以直接用數(shù)據(jù)X來“訓(xùn)練”clf,之后我們便可以得到X的異常分值(clf.decision_scores)以及異常標(biāo)簽(clf.labels_)。當(dāng)clf被訓(xùn)練后(當(dāng)fit函數(shù)被執(zhí)行后),我們可以使用decision_function()和predict()函數(shù)來對未知數(shù)據(jù)進(jìn)行訓(xùn)練。

簡單的異常檢測

from pyod.models.knn import KNN   # imprt kNN分類器

# 訓(xùn)練一個(gè)kNN檢測器
clf_name = 'kNN'
clf = KNN() # 初始化檢測器clf
clf.fit(X_train) # 使用X_train訓(xùn)練檢測器clf

# 返回訓(xùn)練數(shù)據(jù)X_train上的異常標(biāo)簽和異常分值
y_train_pred = clf.labels_  # 返回訓(xùn)練數(shù)據(jù)上的分類標(biāo)簽 (0: 正常值, 1: 異常值)
y_train_scores = clf.decision_scores_  # 返回訓(xùn)練數(shù)據(jù)上的異常值 (分值越大越異常)

# 用訓(xùn)練好的clf來預(yù)測未知數(shù)據(jù)中的異常值
y_test_pred = clf.predict(X_test)  # 返回未知數(shù)據(jù)上的分類標(biāo)簽 (0: 正常值, 1: 異常值)
y_test_scores = clf.decision_function(X_test)  #  返回未知數(shù)據(jù)上的異常值 (分值越大越異常)

不難看出,PyOD的API和scikit-learn非常相似,只需要幾行就可以得到數(shù)據(jù)的異常值。當(dāng)檢測器得到輸出后,我們可以用以下代碼評估其表現(xiàn),或者直接可視化分類結(jié)果


# 評估預(yù)測結(jié)果
print("\nOn Test Data:")
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)
可視化結(jié)果——來源知乎
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容