異常檢測概述

1、什么是異常檢測

異常檢測(Outlier Detection),顧名思義,是識別與正常數據不同的數據,與預期行為差異大的數據。

識別如信用卡欺詐,工業(yè)生產異常,網絡流里的異常(網絡侵入)等問題,針對的是少數的事件。

1.1 異常的類別

點異常:指的是少數個體實例是異常的,大多數個體實例是正常的,例如正常人與病人的健康指標;

上下文異常:又稱上下文異常,指的是在特定情境下個體實例是異常的,在其他情境下都是正常的,例如在特定時間下的溫度突然上升或下降,在特定場景中的快速信用卡交易;

群體異常:指的是在群體集合中的個體實例出現異常的情況,而該個體實例自身可能不是異常,例如社交網絡中虛假賬號形成的集合作為群體異常子集,但子集中的個體節(jié)點可能與真實賬號一樣正常。

1.2 異常檢測任務分類

有監(jiān)督:訓練集的正例和反例均有標簽

無監(jiān)督:訓練集無標簽

半監(jiān)督:在訓練集中只有單一類別(正常實例)的實例,沒有異常實例參與訓練

1.3 異常檢測場景

  • 故障檢測

  • 物聯網異常檢測

  • 欺詐檢測

  • 工業(yè)異常檢測

  • 時間序列異常檢測

  • 視頻異常檢測

  • 日志異常檢測

  • 醫(yī)療日常檢測

  • 網絡入侵檢測

2、異常檢測常用方法

2.1 傳統方法

2.1.1 基于統計學的方法

統計學方法對數據的正常性做出假定。它們假定正常的數據對象由一個統計模型產生,而不遵守該模型的數據是異常點。統計學方法的有效性高度依賴于對給定數據所做的統計模型假定是否成立。

異常檢測的統計學方法的一般思想是:學習一個擬合給定數據集的生成模型,然后識別該模型低概率區(qū)域中的對象,把它們作為異常點。

即利用統計學方法建立一個模型,然后考慮對象有多大可能符合該模型。

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

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

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

2.1.2 線性模型

典型的如PCA方法,Principle Component Analysis是主成分分析,簡稱PCA。它的應用場景是對數據集進行降維。降維后的數據能夠最大程度地保留原始數據的特征(以數據協方差為衡量標準)。
PCA的原理是通過構造一個新的特征空間,把原數據映射到這個新的低維空間里。PCA可以提高數據的計算性能,并且緩解"高維災難"。

2.1.3 基于相似度的方法

??這類算法適用于數據點的聚集程度高、離群點較少的情況。同時,因為相似度算法通常需要對每一個數據分別進行相應計算,所以這類算法通常計算量大,不太適用于數據量大、維度高的數據。
??基于相似度的檢測方法大致可以分為三類:

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

2.2 集成方法

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

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

**feature bagging **:

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

孤立森林

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

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

img

2.3 機器學習

在有標簽的情況下,可以使用樹模型(gbdt,xgboost等)進行分類,缺點是異常檢測場景下數據標簽是不均衡的,但是利用機器學習算法的好處是可以構造不同特征。

3、異常檢測常用開源庫

Scikit-learn:

Scikit-learn是一個Python語言的開源機器學習庫。它具有各種分類,回歸和聚類算法。也包含了一些異常檢測算法,例如LOF和孤立森林。

官網:https://scikit-learn.org/stable/

PyOD:

Python Outlier Detection(PyOD)是當下最流行的Python異常檢測工具庫,其主要亮點包括:

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

? ——https://zhuanlan.zhihu.com/p/58313521

4、練習

1、學習pyod庫基本操作

from __future__ import division
from __future__ import print_function

import os
import sys
from pyod.models.knn import KNN
from pyod.models.loci import LOCI
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize

#構建數據集,其中包括正常與異常
contamination = 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)

# 訓練KNN檢測器
clf_name = 'KNN'
clf = KNN()
clf.fit(X_train)
#訓練樣本數需要大于6個

#訓練LOCI檢測器
#clf_name = 'LOCI'
#clf = LOCI()
#clf.fit(X_train)

# 訓練集預測
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)  

# 評估結果
print("\nOn Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nOn Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)
##On Training Data:
##LOCI ROC:0.9594, precision @ rank n:0.6
##On Test Data:
##LOCI ROC:0.9633, precision @ rank n:0.7

#結果可視化
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
              y_test_pred, show_figure=True, save_figure=True)

knn.png

參考資料:

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1異常檢測概述 2異常檢測常用方法 傳統方法 基于傳統統計學方法 統計學方法對數據的正常性做出假定。它們假定正常的...
    許志輝Albert閱讀 1,539評論 0 0
  • 一、離群點是什么? 離群點,是一個數據對象,它顯著不同于其他數據對象,與其他數據分布有較為顯著的不同。有時也稱非離...
    堂堂正正的大號閱讀 2,780評論 0 2
  • 異常對象被稱作離群點。異常檢測也稱偏差檢測和例外挖掘。常見的異常成因:數據來源于不同的類(異常對象來自于一個與大多...
    尼小摩閱讀 3,127評論 0 1
  • 1、什么是異常檢測 異常檢測(Outlier Detection),顧名思義,是識別與正常數據不同的數據,與預期行...
    noob鴿閱讀 629評論 0 0
  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了? 不是不允許自己墜落, 我沒有滴水不進的保護膜。 就是害怕變得面...
    悶熱當乘涼閱讀 4,480評論 0 13

友情鏈接更多精彩內容