前言
IForest即孤立森林,可以用于做異常檢測。一句話總結IForest做異常檢測的原理:異常點密度小,基于樹模型容易被一下切割出來,正常值密度大,需要切割多次才能得到目標值。
原理
iForest算法得益于隨機森林的思想,與隨機森林由大量決策樹組成一樣,iForest森林也由大量的二叉樹組成。iForest中的樹叫isolation tree,簡稱iTree。iTree樹和決策樹不太一樣,其構建過程也比決策樹簡單,是一個完全隨機的過程。
每個iTree的實現步驟
1、 假設數據集有N條數據,構建一顆iTree時,從N條數據中均勻抽樣(一般是無放回抽樣)出ψ個樣本出來,作為這顆樹的訓練樣本。
2、 在樣本中,隨機選一個特征,并在這個特征的所有值范圍內(最小值與最大值之間)隨機選一個值,對樣本進行二叉劃分,將樣本中小于該值的劃分到節點的左邊,大于等于該值的劃分到節點的右邊。由此得到一個分裂條件和左、右兩邊的數據集。
3、 然后分別在左右兩邊的數據集上重復上面的過程,直到數據集只有一條記錄或者達到了樹的限定高度。
獲得t個iTree之后,iForest 訓練就結束,然后我們可以用生成的iForest來評估測試數據了。對于一個訓練數據x,我們令其遍歷每一棵iTree,然后計算x最終落在每個樹第幾層(x在樹的高度)。然后我們可以得出x在每棵樹的高度平均值,即 the average path length overt iTrees。
獲得每個測試數據的average path length后,我們可以設置一個閾值(邊界值),average path length 低于此閾值的測試數據即為異常。
圖1 iForest構建iTree示例,異常數據點(17,17)通常離根節點很近
由于異常數據的數量較小且特征值和正常數據差別很大。因此,構建iTree的時候,異常數據離根更近,而正常數據離根更遠。一棵iTree的結果往往不可信,iForest算法通過多次抽取樣本,構建多棵二叉樹。最后整合所有樹的結果,并取平均深度作為最終的輸出深度,由此計算數據點的異常分值。
優缺點
優點:
iForest具有線性時間復雜度,IForest是集成算法,因此可以用在海量數據集上,通常樹的數量越多,算法越穩定。
缺點:
1、不適用與特別高維的數據。由于每次切數據空間都是隨機選取一個維度,建完樹后仍然有大量的維度信息沒有被使用,導致算法可靠性降低。高維空間還可能存在大量噪音維度或無關維度(irrelevant attributes),影響樹的構建。對這類數據,建議使用子空間異常檢測(Subspace Anomaly Detection)技術
2、iForest僅對Global Anomaly 敏感,即全局稀疏點敏感,不擅長處理局部的相對稀疏點 (Local Anomaly)。目前已有改進方法發表于PAKDD,詳見“Improving iForest with Relative Mass”。
適用場景
適用于樣本維度不是特別高的場景
參數詳解
classpyod.models.iforest.IForest(n_estimators=100, max_samples='auto', contamination=0.1, max_features=1.0, bootstrap=False, n_jobs=1, random_state=None, verbose=0)n_estimators:估算器數量。默認100棵樹
max_samples:訓練每個估算器(tree)需要抽取的樣本數。默認選256個樣本建樹
int:抽取max_samples個
float:抽取max_samples*X.shape[0](即樣本行數)個
auto:抽取min(256, n_samples)個contamination:污染度即假設每個數據集包含的噪聲含量
;
max_features:訓練每個估算器需要抽取的特征數,高維數據時不必分割所有特征
int:抽取max_features個
float:抽取max_features*X.shape[1]即(樣本列數)個<占比>bootstrap:
true:單一樹需擬合替換的隨機樣本
false:進行無需更換的取樣n_jobs:并行作業數。-1時,n_jobs為CPU核心數random_state:隨機數種子/生成器verbose:控制建樹過程
總結
經實踐,發現IForest針對數據量大,特征少的業務場景,進行異常識別的效果非常不錯。但是需要注意在調整contamination參數的時候,若數據中識別的噪聲數據量不滿足該參數,則不會做任何處理。即若設置噪聲占比為10%,但是模型識別的噪聲數量小于10%(比如只識別了7%的噪聲),這個時候模型只會返回7%的噪聲,并不會按照10%噪聲占比量進行返回。一定要注意這種情況,這種情況可能的原因之一:當噪聲數據聚成了一個簇時,若實際的噪聲占比為15%,但是我初始設置的是contamination為10%。這時候由于有約5%的噪聲在模型中對應的深度相同,即異常分數相同,則造成模型最終認為這些數據在當前的參數設定下不能認定為噪聲。
PS:該模型最終是將每條數據在IForest中所處的深度轉化為一個異常值分數,按照異常值分數進行排序,通過contamination的設定值截取前top的數據作為噪聲輸出來完成整個噪聲識別流程。