isolation forest進行異常點檢測


一、簡介

孤立森林(Isolation Forest)是另外一種高效的異常檢測算法,它和隨機森林類似,但每次選擇划分屬性和划分點(值)時都是隨機的,而不是根據信息增益或者基尼指數來選擇。在建樹過程中,如果一些樣本很快就到達了葉子節點(即葉子到根的距離d很短),那么就被認為很有可能是異常點。

具體步驟:

Forest 由t個iTree(Isolation Tree)孤立樹 組成,每個iTree是一個二叉樹結構,其實現步驟如下:

1. 從訓練數據中隨機選擇Ψ個點樣本點作為subsample,放入樹的根節點。

2. 隨機指定一個維度(attribute),在當前節點數據中隨機產生一個切割點p——切割點產生於當前節點數據中指定維度的最大值和最小值之間。

3. 以此切割點生成了一個超平面,然后將當前節點數據空間划分為2個子空間:把指定維度里小於p的數據放在當前節點的左孩子,把大於等於p的數據放在當前節點的右孩子。

4. 在孩子節點中遞歸步驟2和3,不斷構造新的孩子節點,直到 孩子節點中只有一個數據(無法再繼續切割) 或 孩子節點已到達限定高度 。

獲得t個iTree之后,iForest 訓練就結束,然后我們可以用生成的iForest來評估測試數據了。對於一個訓練數據x,我們令其遍歷每一棵iTree,然后計算x最終落在每個樹第幾層(x在樹的高度)。就可以得出x在森林中的高度平均值,即 the average path length over t iTrees。*值得注意的是,如果x落在一個節點中含多個訓練數據,可以使用一個公式來修正x的高度計算,詳細公式推導見原論文

獲得每個測試數據的average path length后,我們可以設置一個閾值(邊界值),average path length 低於此閾值的測試數據即為異常。也就是說 “iForest identifies anomalies as instances having the shortest average path lengths in a dataset ”(異常在這些樹中只有很短的平均高度). *值得注意的是,論文中對樹的高度做了歸一化,並得出一個0到1的數值,即越短的高度越接近1(異常的可能性越高)。

 

為什么距離d很短就認為是異常點呢?

比如一個維度里有1,2,3,4,5,100,從當前維度的最大值和最小值之間隨機選擇一個值作為切分點,假如是50,那么大於50的分在右子樹,小於50的分在左子樹,最終分成了兩組,【1,2,3,4,5】和【100】,而在【100】這個樣本組里,因為只有一個樣本點了,所以不再划分了,高度就是1了,所以距離很短。

二、代碼實現

import numpy as np  
import pandas as pd
import matplotlib.pyplot as plt  
from sklearn.ensemble import IsolationForest  
from scipy import stats  
rng = np.random.RandomState(42)
n_samples=6 #樣本總數
# fit the model clf = IsolationForest(max_samples=n_samples, random_state=rng, contamination=0.33) #contamination為異常樣本比例 clf.fit(df.values) scores_pred = clf.decision_function(df.values) print(scores_pred) print(len(scores_pred)) threshold = stats.scoreatpercentile(scores_pred, 100 * outliers_fraction)
結果:[ 0.11573485  0.12433055  0.13780741  0.12351238  0.06556263 -0.05915569]

clf.predict(df.values)
array([ 1,  1,  1,  1, -1, -1])
三、測試

predict(X)
 
        
          返回值:+1 表示正常樣本, -1表示異常樣本。
decision_function(X)
 
        
          返回樣本的異常評分。 值越小表示越有可能是異常樣本。

test=[[2,4,50,3,5,69,8]]
clf.decision_function(test)
輸出:
array([0.08241789])
clf.predict(df.values)
輸出:
array([ 1,  1,  1,  1, -1, -1])

四、算法應用

Isolation Forest 算法主要有兩個參數:一個是二叉樹的個數;另一個是訓練單棵 iTree 時候抽取樣本的數目。實驗表明,當設定為 100 棵樹,每棵樹高度不超過8,抽樣樣本數為 256 條時候,IF 在大多數情況下就已經可以取得不錯的效果。這也體現了算法的簡單、高效。

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

五、IF特點

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)。




參考鏈接:https://www.jianshu.com/p/5af3c66e0410
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM