Isolation Forest 孤立森林的理解

1.基本原理篇

 

  • 直覺上:我們遞歸構建隨機劃分樹,所有實例均被劃分即構建完畢;異常值,比較早的被劃分,在樹中路徑長度比較短。論文中,提到了一個測試,如下圖

image.png

   

    從高斯分佈中隨機生成135個點,上圖中正常點xi需要12次隨機的劃分,而異常的點x0只需要4次劃分。

 

image.png

    樹的數量與xi,x0兩個點平均劃分長度的關係,可以看到隨着樹的增加,正常點和異常點的劃分路徑長度更加穩定

 

  • isolation tree:T 是一個外節點(沒有child) 或者是一個內部節點,包含測試和兩個子節點;測試包含兩個屬性q和p,其中q表示具體某個維度的值,p表示對該維度切分的閾值,min(q) < p < max(q)

 

  • 二叉樹:內部節點有n-1個,那麼外部節點就有n個,總節點數有2n-1個

image.png

紅色表示內部節點,藍色表示外部節點,滿足 外部節點數-內部節點數=1

線性增長

 

  • path length:記爲h(x) , x從樹的根節點走到外節點的路徑;下圖中黃色節點ABCD均爲外節點,h(D)=1,h(A)=3

 

image.png

 

  • anomaly score:

   image.png

c(n) 主要作用是對h(x)做歸一化,否則隨着n越大,樹的深度一般越深; 因爲itrees的結構跟binary search tree的結構是一樣的,所以h(x) 平均路徑的估計採用n次不成功的搜索的平均路徑,具體值爲

image.png

      H(i) 是調和級數,可以用ln(i)+0.577來估計

 

  • 根據s(x,n)公式:
  • 若E(h(x))->c(n); 那麼 s(x,n)->0.5;說明數據集不一定有異常值
  • 若E(h(x))->n-1,那麼s(x,n)->0;說明x是正常的
  • 若E(h(x))->0,那麼s(x,n)->1;說明x的平均路徑很短,那麼x爲異常的可能性非常高

 

2.特點

 

  • 不需要大量正常的樣本,值需要小樣本就可以建模; 相反,大樣本會減弱識別異常值的能力;paper中舉了一個例子,基於Mulcross數據集,當用全量的數據4096個進行建模的時候,auc只爲0.67;從中抽樣128個,auc可以達到0.91,爲什麼呢?看下圖,異常點的也非常聚集,密度高啊!

image.png

 

3.與其他經典算法的比較

image.png

 

  • 從上表中發現,iforest在大部分的數據集中,auc表現比較好;
  • 從上表中發現,iforest的運行速度更加高效;

 

4.效率分析

 

  • 基於Http 和 ForestCover兩份數據集,發現auc在小樣本的時候就收斂了;在http這個集中,採樣數爲128 ,在forestcover數據集中,採樣數爲512的時候,auc就收斂了。後續隨着樣本數的增加,auc提升不明顯了;

具體結果見下圖

image.png

 

5.是否只用正常樣本來做訓練?

 

  • paper中也做了一個試驗,基於Http和ForestCover兩份數據集,當訓練樣本中包含異常值的時候,測試集上的auc比 訓練樣本中不包含異常值的時候更高一些;

 

6.高維檢測能力

 

  • 高維的挑戰在於,點在高維空間是非常稀疏的,距離度量通常是無效的
  • paper中又做了一個測試,用Mammography和Annthyroid數據集,最多增加506個隨機的服從01均勻分佈的特徵,作爲模擬的噪聲,整個數據集總共爲512維(原始數據集是6維);首先通過峯度係數來計算每個特徵的值,進行排序。我們按照這個排序,不斷增加特徵,主要是觀察增加1~506個特徵情況下,iforest的異常檢測能力;當增加的維度(增加了6維)接近原始數據集維度的時候,auc表現比較好;具體見下圖

 

image.png

   點實線爲auc,點虛線爲運行時間,最上面的橫虛線爲iforest在原始數據集上(6維)的auc,效果比12維要好;

 

7.實現工具

 

reference:https://scikit-learn.org/dev/modules/generated/sklearn.ensemble.IsolationForest.html

 

參數

參數說明

n_estimators

因爲是ensemble,該參數表示樹的數量,默認是100

max_samples

默認是auto,每顆樹的樣本數;返回是 256與樣本數的最小值;或者可以 自己個數(int),或者樣本數的佔比(float)

contamination

默認是auto,閾值跟原始論文一樣;或者自己指定異常的比例

max_features

每課樹的特徵數,這個需要自己來指定;因爲api默認爲1,一般不大適用

bootstrap

如果是true,表示有放回的抽樣;如果是false的話,表示無放回抽樣

n_jobs

默認是None,-1表示使用所有的進程數,

random_state

是否要固定隨機種子,因爲iforest算法中有很多隨機的部分,比如特徵的選擇和切分都是隨機的

 

 

estimators_

每顆訓練好的樹的集合

estimators_samples

每棵樹的樣本集

max_samples_

實際的樣本數

offset_

實際異常得分-offset,作爲判斷異常的界限

 

 

8.實現demo

>>> from sklearn.ensemble import IsolationForest
>>> X = [[-1.1], [0.3], [0.5], [100]]
>>> clf = IsolationForest(random_state=0).fit(X)
>>> clf.predict([[0.1], [0], [90]])
array([ 1,  1, -1])

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章