天天看點

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

在異常檢測的衆多算法中,Isolation Forest算法有着非常重要的地位。這種從異常點的定義出發建構的檢測模型往往在工業界更實用,除了帶來令人驚喜的檢測效果外,Isolation Forest算法也非常高效。目前公司的許多團隊已經嘗試了該算法在運維、安全等方面的應用,并且與其他異常檢驗算法相比,獲得了更可靠的實驗效果。作為一個廣受歡迎的算法,Tesla平台釋出了基于Spark實作的Isolation Forest分布式算法,以達到更快速的對海量資料進行異常檢測的目的。

Isolation Forest算法自2010年誕生至今受到了工業界的廣泛認可。不同于其他基于距離與密度的異常檢測算法,該算法從異常點的定義出發建構檢測模型。實驗發現,該算法的魯棒性強,檢測效果好,且時間複雜度低,特别在處理高維資料和海量資料方面具有獨特優勢。接下來本文詳細介紹Isolation Forest算法以及其分布式實作。

Isolation Forest(下文簡稱IForest)算法單純的從異常點的概念出發來識别異常點,這與其他基于距離與密度的方法完全不同。那麼IForest算法是如何定義異常值的呢?

IForest中異常值的定義

在樣本中占少數的那一類

與正常值的屬性相比有很大不同

總體而言,iForest算法中的異常值就是那些“少而特殊”的樣本。有了這個概念後,IForest采用了內建的方式來識别異常值。具體的做法是首先使用訓練樣本子集建構多棵isolation tree(下文簡稱ITree),然後多棵isolation tree構成一個IForest模型。在評估階段,通過計算每個樣本在IForest模型中的路徑長度,就可以得到每個樣本對應的異常得分(anomaly score)。下面我們詳細說明。

1.1.1 訓練階段

ITree是一種随機二叉樹,每個節點要麼有兩個孩子,要麼就是葉子節點。每個節點包含一個屬性q和一個劃分值p。ITree的建構過程如下:

從原始訓練集X中無放回的抽取樣本子集

劃分樣本子集,每次劃分都從樣本中随機選擇一個屬性q,再從該屬性中随機選擇一個劃分的值p,該p值介于屬性q的最大與最小值之間。

根據2中的屬性q與值p,劃分目前樣本子集,小于值p的樣本作為目前節點的左孩子,大于p值的樣本作為目前節點的右孩子。

重複上述2、3步驟,遞歸的建構每個節點的左、右孩子節點,直到滿足終止條件為止。通常終止條件為所有節點均隻包含一個樣本或者多條一樣的樣本,或者是樹的深度達到了限定的高度。

論文1中給出了ITree的詳細建構過程:

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

當完成了多棵ITree的建構後,這些ITree就構成了IForest。有兩個參數控制着IForest模型的複雜度。一個是每棵樹的樣本子集大小ψ\psiψ,它控制着訓練資料的大小,論文中的實驗發現,當該值增加到一定程度後,IForest的辨識能力會變得可靠,但沒有必要繼續增加下去,因為這并不會帶來準确率的提升,反而會影響計算時間和記憶體容量,實作發現ψ\psiψ取256對于很多資料集已經足夠;另外一個是ITree的個數t,它控制着模型的內建度,實驗發現t取值100已經足夠。

1.1.2 評估階段

訓練階段建構了IForest模型,接下來就需要用測試集對模型進行評估了。這裡的評估主要就是計算anomaly score,用S表示,其表達式如下:

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

其中h(x)表示樣本x在某棵樹中的路徑長度,即從ITree的根節點出發到葉子節點截止所經過的邊的個數e。E(h(x))則表示某個樣本x在所有樹中的平均路徑長度。值得注意的是,如果樣本x最終所落的葉子節點限制了樹的高度,那麼h(x)除了所經過的邊的個數e之外,還需要加上一個調整值c(size)。c(size)的定義同下文,size代表那些本可以用來繼續建構樹(卻因為定義了樹的高度而被限制)進而增加樹的高度的節點個數。

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

用于對h(x)進行标準化。

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

的定義如下:

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

其中表示歐拉常數

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

通常取0.5772156649。

有了上述的評估公式,就可以得到測試集每個樣本的異常值得分了,根據公式我們可以看出這個異常值得分在0到1之間。論文中給出了判斷異常值的方法:

(1)如果某個樣本的異常得分非常接近1,則該樣本就可以被定義為異常點

(2)如果某個樣本的異常得分遠小于0.5,則其可以被非常安全的視作正常點

(3)如果所有樣本的異常得分都接近0.5,則可以認為整個樣本集沒有明顯的異常點

從上面關于IForest算法的介紹中我們可以看出,它是一種無監督的算法。不同于以往的基于距離或者密度的異常檢測算法,IForest算法從異常點的概念出發,充分利用了資料集中異常點“少而特殊”的特點,通過建構随機二叉樹進而識别那些距離根節點更近的異常樣本。

相比其他異常算法,IForest算法的時間複雜度是線性的,同時占用的記憶體空間很少。通常使用較低的采樣和較少的樹就可以獲得一個性能優異的模型,而無需考慮原始資料集的大小。

是以可以說IForest算法是一種準确率較高且計算性能高效的算法。由于IForest從異常點的定義出發建構的模型,是以使用中以下情況需要你注意:

(1)如果訓練樣本中異常樣本的比例較高,違背了IForest的基本假設,最終的檢測結果将會受影響;

(2)異常檢測跟具體的應用場景緊密相關,算法檢測出的“異常”不一定是我們實際想要的。是以在構模組化型時,需要對特征進行篩選,過濾掉那些與檢測目标不太相關的特征,以避免識别出的“異常”與你的“異常”定義有偏差。

IForest算法非常适合分布式計算,在訓練階段可以并行的建構多棵ITree,同時在評估階段,所有樣本可以并行的通過IForest模型計算其異常得分。相比與單機版的IForest算法,分布式的IForest算法的計算效率将更高,耗時也更少。下面是IForest算法的分布式實作原理圖:

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

從上面的原理圖可以看到,整個分布式IForest模型的建立過程非常清晰,首先訓練階段從原始樣本集X中無放回的建構t棵ITree,為了提高效率以及友善實作,最好采用一開始無放回的采樣足夠多樣本供t棵樹構模組化型,然後将這些樣本按照相同的大小随機配置設定到各棵樹中。此時,t棵樹就可以根據1.1.1中的過程并行建立了。

由于各棵樹的樣本大小相同,同時建構都采用了随機方式,再加上算法對每棵樹的深度都預先進行了設定,是以,各棵樹的建構幾乎能同時終止。此時,将所有ITree都collect到driver端形成了IForest模型。

評估階段首先将預測樣本分布式的存儲,然後将IForest模型發送到各個executor端進行評估。詳細的評估過程參考1.1.2中的内容。

IForest子產品的算法參數介紹:

更快更準的異常檢測?交給分布式的 Isolation Forest 吧

模型輸入路徑:如果之前使用該子產品訓練了IForest模型,此時就可以填寫該模型路徑直接對測試資料進行檢測。沒有IForest模型則不填

模型輸出路徑:當首次使用該模型訓練IForest模型後,可将IForest模型儲存至該路徑下,友善下次直接使用。在已有IForest模型的情況下無需填寫此項。

每棵樹的樣本數:訓練階段的$$\psi$$參數,每個ITree的建構都采用相同的樣本個數,256是較為合适的值,過大對檢測能力提升效果不大,且會影響運作時長,甚至導緻記憶體溢出。

樹的個數:訓練階段的t參數,控制着模型的內建度,100是較為合适的值,過大同樣不能帶來檢測能力的提升,反而會影響計算性能。

樹的最大深度:控制着每棵樹的最大深度,在算法中,該參數用來控制異常點的覆寫度和隐藏度。過深或過淺的樹都無法有效識别異常點。注意本子產品中,樹的根節點深度為1。

Fei Tony Liu,Kai Ming Ting,Zhi-Hua Zhou. Isolation-Based Anomaly Detection.ACM Transactions on Knowledge Discovery from Data.Volume 6 Issue 1, March 2012