異常點檢測,有時也叫離羣點檢測,英文通常叫作Novelty Detection或者Outlier Detection,是比較常見的一類非監督學習算法,這裏就對異常點檢測算法作一個總結。html
何時咱們須要異常點檢測算法呢?常見的有三種狀況。一是在作特徵工程的時候須要對異常的數據作過濾,防止對歸一化等處理的結果產生影響。二是對沒有標記輸出的特徵數據作篩選,找出異常的數據。三是對有標記輸出的特徵數據作二分類時,因爲某些類別的訓練樣本很是少,類別嚴重不平衡,此時也能夠考慮用非監督的異常點檢測算法來作。算法
異常點檢測的目的是找出數據集中和大多數數據不一樣的數據,經常使用的異常點檢測算法通常分爲三類。分佈式
第一類是基於統計學的方法來處理異常數據,這種方法通常會構建一個機率分佈模型,並計算對象符合該模型的機率,把具備低機率的對象視爲異常點。好比特徵工程中的RobustScaler方法,在作數據特徵值縮放的時候,它會利用數據特徵的分位數分佈,將數據根據分位數劃分爲多段,只取中間段來作縮放,好比只取25%分位數到75%分位數的數據作縮放。這樣減少了異常數據的影響。函數
第二類是基於聚類的方法來作異常點檢測。這個很好理解,因爲大部分聚類算法是基於數據特徵的分佈來作的,一般若是咱們聚類後發現某些聚類簇的數據樣本量比其餘簇少不少,並且這個簇裏數據的特徵均值分佈之類的值和其餘簇也差別很大,這些簇裏的樣本點大部分時候都是異常點。好比我以前講到的BIRCH聚類算法原理和DBSCAN密度聚類算法均可以在聚類的同時作異常點的檢測。post
第三類是基於專門的異常點檢測算法來作。這些算法不像聚類算法,檢測異常點只是一個贈品,它們的目的就是專門檢測異常點的,這類算法的表明是One Class SVM和Isolation Forest.學習
下文主要會對One Class SVM和Isolation Forest作詳細的討論分析。大數據
One Class SVM也是屬於支持向量機你們族的,可是它和傳統的基於監督學習的分類迴歸支持向量機不一樣,它是無監督學習的方法,也就是說,它不須要咱們標記訓練集的輸出標籤。優化
那麼沒有類別標籤,咱們如何尋找劃分的超平面以及尋找支持向量呢?One Class SVM這個問題的解決思路有不少。這裏只講解一種特別的思路SVDD, 對於SVDD來講,咱們指望全部不是異常的樣本都是正類別,同時它採用一個超球體而不是一個超平面來作劃分,該算法在特徵空間中得到數據周圍的球形邊界,指望最小化這個超球體的體積,從而最小化異常點數據的影響。url
假設產生的超球體參數爲中心 $o$和對應的超球體半徑 $r>0$ ,超球體體積 $V(r)$ 被最小化,中心$o$ 是支持向量的線性組合;跟傳統SVM方法類似,能夠要求全部訓練數據點 $x_{i}$ 到中心的距離嚴格小於 $r $,但同時構造一個懲罰係數爲 $C$ 的鬆弛變量 $\xi_i$,優化問題以下所示:rest
$$\underbrace{min}_{r,o}V(r) + C\sum\limits_{i=1}^m\xi_i$$ $$||x_i-o||_2 \leq r + \xi_i,\;\; i=1,2,...m$$ $$\xi_i \geq 0,\;\;i=1,2,...m$$
和以前講的支持向量機系列相似的求解方法,在採用拉格朗日對偶求解以後,能夠判斷新的數據點 $z$ 是否在類內,若是$z$到中心的距離小於或者等於半徑$r$,則不是異常點,若是在超球體之外,則是異常點。
在sklearn中,咱們能夠用svm包裏面的OneClassSVM來作異常點檢測。OneClassSVM也支持核函數,因此普通SVM裏面的調參思路在這裏也適用。
Isolation Forest(如下簡稱IForest)是周志華老師的學生提出來的,主要是利用集成學習的思路來作異常點檢測,目前幾乎成爲異常點檢測算法的首選項,我以前在Bagging與隨機森林算法原理小結第4.3節中也簡略講解了IForest的思路,它是隨機森林你們族的一員。
算法自己並不複雜,主要包括第一步訓練構建隨機森林對應的多顆決策樹,這些決策樹通常叫iTree,第二步計算須要檢測的數據點$x$最終落在任意第t顆iTree的層數$h_t(x)$。而後咱們能夠得出$x$在每棵樹的高度平均值$h(x)$。第三步根據$h(x)$判斷$x$是不是異常點。
對於第一步構建決策樹的過程,方法和普通的隨機森林不一樣。
首先採樣決策樹的訓練樣本時,普通的隨機森林要採樣的樣本個數等於訓練集個數。可是iForest不須要採樣這麼多,通常來講,採樣個數要遠遠小於訓練集個數。緣由是咱們的目的是異常點檢測,只須要部分的樣本咱們通常就能夠將異常點區別出來了。
另外就是在作決策樹分裂決策時,因爲咱們沒有標記輸出,因此無法計算基尼係數或者和方差之類的劃分標準。這裏咱們使用的是隨機選擇劃分特徵,而後在基於這個特徵再隨機選擇劃分閾值,進行決策樹的分裂。直到樹的深度達到限定閾值或者樣本數只剩一個。
第二步計算要檢測的樣本點在每棵樹的高度平均值$h(x)$。首先須要遍歷每一顆iTree,獲得檢測的數據點$x$最終落在任意第t顆iTree的數層數$h_t(x)$。這個$h_t(x)$表明的是樹的深度,也就是離根節點越近,則$h_t(x)$越小,越靠近底層,則$h_t(x)$越大,根節點的高度爲0.
第三步是據$h(x)$判斷$x$是不是異常點。咱們通常用下面的公式計算$x$的異常機率分值:$$s(x,m) = 2^{-\frac{h(x)}{c(m)}}$$, $s(x,m)$的取值範圍是[0,1],取值越接近於1,則是異常點的機率也越大。其中,m爲樣本個數。的表達式爲:$$ c(m) =2\ln(m-1) + \xi - 2\frac{m-1}{m}, \; \xi 是歐拉常數$$
從$s(x,m)$表示式能夠看出,若是高度$h(x) \to 0$, 則$s(x,m) \to 1$,便是異常點的機率是100%,若是高度$h(x) \to m-1$, 則$s(x,m) \to 0$,即不多是異常點。若是高度$h(x) \to c(m)$, 則$s(x,m) \to 0.5$,便是異常點的機率是50%,通常咱們能夠設置$s(x,m)的一個閾值而後去調參,這樣大於閾值的才認爲是異常點。
在sklearn中,咱們能夠用ensemble包裏面的IsolationForest來作異常點檢測。
IForest目前是異常點檢測最經常使用的算法之一,它的優勢很是突出,它具備線性時間複雜度。由於是隨機森林的方法,因此能夠用在含有海量數據的數據集上面。一般樹的數量越多,算法越穩定。因爲每棵樹都是互相獨立生成的,所以能夠部署在大規模分佈式系統上來加速運算。對於目前大數據分析的趨勢來講,它的好用是有緣由的。
可是IForest也有一些缺點,好比不適用於特別高維的數據。因爲每次切數據空間都是隨機選取一個維度和該維度的隨機一個特徵,建完樹後仍然有大量的維度沒有被使用,致使算法可靠性下降。此時推薦降維後使用,或者考慮使用One Class SVM。
另外iForest僅對即全局稀疏點敏感,不擅長處理局部的相對稀疏點 ,這樣在某些局部的異常點較多的時候檢測可能不是很準。
而One Class SVM對於中小型的數據分析,尤爲是訓練樣本不是特別海量的時候用起來常常會比iForest順手,所以比較適合作原型分析。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)