paper 地址 https://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/tkdd11.pdf
孤立森林,isolation forest,簡稱 iforest;
它由 周志華 老師提出,本質是一種 無監督算法,其主要用於異常點檢測,在工業界有廣泛應用;
基本思想
異常點總是稀疏的,而且異常點總是離密集點較遠;
在整個數據空間中,隨機拿一個超平面進行切割,把數據集一分為二,然后繼續隨機切割子空間,迭代下去,直到每個子空間內只有一個樣本;
直觀上講,密集區域要被切割很多次才能分開到不同空間,而稀疏點很容易很早停在一個子空間;
看這樣一張圖,紅色框內是密集點,外面黑色的點為異常點
隨機切分,一定是異常點更容易被分到一個子空間;
孤立森林的目標就是找到 那條 紅色的邊框,就是我們的“決策邊界” ;
具體步驟
孤立森林需要建立多棵 二叉樹,以實現 集成學習 Ensemble 的思想;
至於怎么分裂數據集,是 iForest 的核心思想,本文只介紹基本方法;
訓練階段
白話文
1. 隨機選取 部分數據樣本 放到 二叉樹的根節點
2. 隨機選擇一個特征(attribute),獲取節點中樣本在該 維度 上的 取值空間(min max),在 取值空間 內 隨機選擇一個值,把 數據集 一分為二,放到兩個子節點
// 注意這步要記錄下 分裂的 維度 和分裂值
3. 如果 某個 子節點 只有一個樣本,或者 規定數目的樣本,或者 樹到達 規定 深度,則停止分裂
4. 重復 2、3 步,完成一棵二叉樹
5. 重復上述步驟,完成多棵二叉樹
論文參數設置
subsample:256
tree height:8
number of tree:100
測試階段
把樣本喂給每棵樹模型,獲取 樣本 在 該棵樹上的深度,最終 統計 所有樹的平均深度,深度越淺,越有可能是異常點,可設定閾值,小於閾值即為異常點;
注意幾點:
1. 如果 樣本 落在的節點中有多個樣本,則可以使用一個公式來修正它的 深度,公式見 paper
2. 論文對 樹的高度做了 歸一化,獲取深度的相對值
類似這樣
可以看到,d 更早的停在了子空間,說明 d 很可能是異常值
總結
應用
常用於 網絡安全中的攻擊檢測、金融交易欺詐檢測、疾病偵測、噪聲數據過濾等
優勢
iForest 是一種基於 Ensemble 的快速異常檢測算法,具有線性時間復雜度和高精准度,是符合大數據處理要求的 state-of-the-art 算法;
1. 自適應提高魯棒性
傳統的基於距離或者密度的異常檢測,其閾值都是全局閾值,在 異常不是很明顯時,這種做法容易出錯,孤立森林在每次分裂時都根據當前樣本集的最大和最小值選擇分裂點,是一種自適應的策略
2. 與隨機森林一樣采取了雙隨機的策略,隨機選擇樣本,隨機選擇特征,使得孤立森林能夠很好地避免“過擬合”
// 不同於 rf 的是,rf 是有放回抽樣,iforest 是無放回抽樣
3. 樹之間相互獨立,可以部署在分布式系統上,加速運算,特別是測試階段,非常高效
劣勢
不適合維度特別高的數據,一是因為 隨機選擇 特征,很可能有更有用的信息沒有被選到,二是可能有很多噪聲維度,導致模型可靠性差
優化思路
每次隨機選擇一個分裂點,這樣增加了模型的不確定性,或者說收斂變慢,我們可以這樣想,二叉樹的目的是把所有樣本分到不同空間,那么兩條路同時切分,肯定要比一條路切分速度更快,
所以我們可以采用某種策略,選擇合適的分裂點,使得分裂后的兩個樣本集相對較平衡,我大概考慮了幾個點:
a. 我們可以多選幾個分裂點,比較分裂后的效果,選擇一個更合適的
b. 把 dbscan 融合到分裂過程,把 密度相連 的樣本 盡量分到 一個樣本集
c. 參考資料1 鏈接了一些改進,自己可以看看
參考資料:
https://www.jianshu.com/p/5af3c66e0410 iForest (Isolation Forest)孤立森林 異常檢測 入門篇
https://blog.csdn.net/qq_39521554/article/details/81329047 異常檢測算法:孤立森林(Isolation Forest)
https://www.cnblogs.com/bonelee/p/7776711.html 異常檢測概覽——孤立森林 效果是最好的
https://www.zhihu.com/question/280696035 數據挖掘中常見的「異常檢測」算法有哪些?
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html sklearn API