1. 程式人生 > >iForest的演算法原理和詳解

iForest的演算法原理和詳解

"An outlier is an observation which deviates so much from other observations as to arouse suspicions that it was generated by a different mechanism."

異常檢測 (anomaly detection),或者又被稱為“離群點檢測” (outlier detection),是機器學習研究領域中跟現實緊密聯絡、有廣泛應用需求的一類問題。但是,什麼是異常,並沒有標準答案,通常因具體應用場景而異。

通常我們定義“異常”的兩個標準或者說假設:

  1. 異常資料跟樣本中大多數資料不太一樣。
  2. 異常資料在整體資料樣本中佔比比較小。

對於異常檢測而言,最直接的做法是利用各種統計的、距離的、密度的量化指標去描述資料樣本跟其他樣本的疏離程度(詳見異常檢測概論)。而 Isolation Forest (Liu et al. 2011) 的想法要巧妙一些,它嘗試直接去刻畫資料的“疏離”(isolation)程度,而不借助其他量化指標。Isolation Forest 因為簡單、高效,在學術界和工業界都有著不錯的名聲。

演算法介紹

我們先用一個簡單的例子來說明 Isolation Forest 的基本想法。假設現有一組資料(如下圖所示),我們要對這組資料進行隨機切分,希望可以把點“星”區分出來。具體的,確定一個維度的特徵,並在最大值和最小值之間隨機選擇一個值 x ,然後按照小於 x 和 大於等於x 可以把資料分成左右兩組。然後再隨機的按某個特徵維度的取值把資料進行細分,重複上述步驟,直到無法細分,直到資料不可再分。直觀上,異常資料由於跟其他資料點較為疏離,可能需要較少幾次切分就可以將它們單獨劃分出來,而正常資料恰恰相反。這正是 Isolation Forest(IForest)的核心概念。

Isolation an outlier

模型訓練

iForest (Isolation Forest)孤立森林 是一個基於Ensemble的快速異常檢測方法,具有線性時間複雜度和高精準度。IF採用二叉樹去對資料進行切分,資料點在二叉樹中所處的深度反應了該條資料的“疏離”程度。整個演算法大致可以分為兩步:iForest屬於Non-parametric和unsupervised的方法,即不用定義數學模型也不需要有標記的訓練。怎麼來切這個資料空間是iForest的設計核心思想,本文僅介紹最基本的方法。由於切割是隨機的,所以需要用ensemble的方法來得到一個收斂值(蒙特卡洛方法),即反覆從頭開始切,然後平均每次切的結果。iForest 由t個iTree(Isolation Tree)孤立樹 組成,每個iTree是一個二叉樹結構,其實現步驟如下:

訓練:構建一棵 iTree 時,先從全量資料中抽取一批樣本,然後隨機選擇一個特徵作為起始節點,並在該特徵的最大值和最小值之間隨機選擇一個值,將樣本中小於該取值的資料劃到左分支,大於等於該取值的劃到右分支。然後,在左右兩個分支資料中,重複上述步驟,直到滿足如下條件:

  1. 資料不可再分,即:只包含一條資料,或者全部資料相同。
  2. 二叉樹達到限定的最大深度。

模型預測

計算資料 x 的異常分值時,先要估算它在每棵 iTree 中的路徑長度(也可以叫深度)。具體的,先沿著一棵 iTree,從根節點開始按不同特徵的取值從上往下,直到到達某葉子節點。假設 iTree 的訓練樣本中同樣落在 x 所在葉子節點的樣本數為 T.size ,則資料 x 在這棵 iTree 上的路徑長度 h(x) ,可以用下面這個公式計算:

公式中,e 表示資料 x 從 iTree 的根節點到葉節點過程中經過的邊的數目,C(T.size) 可以認為是一個修正值,它表示在一棵用 T.size 條樣本資料構建的二叉樹的平均路徑長度。一般的,C(n) 的計算公式如下:

其中,H(n-1) 可用 ln(n-1)+0.5772156649 估算,這裡的常數是尤拉常數。資料 x 最終的異常分值 Score(x) 綜合了多棵 iTree 的結果:

公式中,E(h(x)) 表示資料 x 在多棵 iTree 的路徑長度的均值,$\psi$ 表示單棵 iTree 的訓練樣本的樣本數,$C(\psi)$ 表示用 $\psi$ 條資料構建的二叉樹的平均路徑長度,它在這裡主要用來做歸一化。

從異常分值的公式看,如果資料 x 在多棵 iTree 中的平均路徑長度越短,得分越接近 1,表明資料 x 越異常;如果資料 x 在多棵 iTree 中的平均路徑長度越長,得分越接近 0,表示資料 x 越正常;如果資料 x 在多棵 iTree 中的平均路徑長度接近整體均值,則打分會在 0.5 附近。

個人見解

1. iForest具有線性時間複雜度。因為是ensemble的方法,所以可以用在含有海量資料的資料集上面。通常樹的數量越多,演算法越穩定。由於每棵樹都是互相獨立生成的,因此可以部署在大規模分散式系統上來加速運算。

2. iForest不適用於特別高維的資料。由於每次切資料空間都是隨機選取一個維度,建完樹後仍然有大量的維度資訊沒有被使用,導致演算法可靠性降低。高維空間還可能存在大量噪音維度或無關維度(irrelevant attributes),影響樹的構建。對這類資料,建議使用子空間異常檢測(Subspace Anomaly Detection)技術。此外,切割平面預設是axis-parallel的,也可以隨機生成各種角度的切割平面,詳見“On Detecting Clustered Anomalies Using SCiForest”。

3. iForest僅對Global Anomaly 敏感,即全域性稀疏點敏感,不擅長處理區域性的相對稀疏點 (Local Anomaly)。目前已有改進方法發表於PAKDD,詳見“Improving iForest with Relative Mass”。

4. iForest推動了重心估計(Mass Estimation)理論發展,目前在分類聚類和異常檢測中都取得顯著效果,發表於各大頂級資料探勘會議和期刊(如SIGKDD,ICDM,ECML)。

Isolation Forest 是無監督的異常檢測演算法,在實際應用時,並不需要黑白標籤。需要注意的是:(1)如果訓練樣本中異常樣本的比例比較高,違背了先前提到的異常檢測的基本假設,可能最終的效果會受影響;(2)異常檢測跟具體的應用場景緊密相關,演算法檢測出的“異常”不一定是我們實際想要的。比如,在識別虛假交易時,異常的交易未必就是虛假的交易。所以,在特徵選擇時,可能需要過濾不太相關的特徵,以免識別出一些不太相關的“異常”。

相關程式碼