首頁技術文章正文

孤立森林算法介紹,這次終于看懂了!

更新時間:2019-11-08 來源:黑馬程序員 瀏覽量:

孤立森林算法應用于網絡安全中的攻擊檢測,金融交易欺詐檢測,疾病偵測,和噪聲數據過濾等。

 

1. 孤立森林簡介

iForest(IsolationForest)孤立森林是一個基于Ensemble 的快速異常檢測方法,具有線性時間復雜度和高精準度,是符合大數據處理要求的state-of-the-art算法。


iForest 適用于連續(xù)數據的異常檢測,將異常定義為“容易被孤立的離群點”,可以理解為分布稀疏且離密度高的群體較遠的點。用統計學來解釋,在數據空間里面,分布稀疏的區(qū)域表示數據發(fā)生在此區(qū)域的概率很低,因而可以認為落在這些區(qū)域里的數據是異常的。


iForest 即不用定義數學模型也不需要有標記的訓練。對于如何查找哪些點是否容易被孤立,iForest 使用了一套非常高效的策略。


假設我們用一個隨機超平面來切割數據空間, 切一次可以生成兩個子空間。之后我們再繼續(xù)用一個隨機超平面來切割每個子空間,循環(huán)下去,直到每子空間里面只有一個數據點為止。直觀上來講,我們可以發(fā)現那些密度很高的簇是可以被切很多次才會停止切割,但是那些密度很低的點很容易很早的就停到一個子空間了。

 

 

1575879241325_孤立森林算法.png


2. 算法思路

怎么來切這個數據空間是iForest的設計核心思想,這里僅介紹最基本的方法。由于切割是隨機的,所以需要用ensemble的方法來得到一個收斂值(蒙特卡洛方法),即反復從頭開始切,然后平均每次切的結果。iForest由t個iTree(Isolation Tree)孤立樹組成,每個iTree

是一個二叉樹結構,其實現步驟如下:

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

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

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

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

 

獲得t個iTree之后,iForest訓練就結束,然后我們可以用生成的iForest來評估測試數據了。對于一個訓練數據x,我們令其遍歷每一棵iTree,然后計算x 最終落在每個樹第幾層(x在樹的高度)。然后我們可以得出x在每棵樹的高度平均值。獲得每個測試數據的高度平均值后,我們可以設置一個閾值(邊界值),高度平均值低于此閾值的測試數據即為異常。也就是說異常在這些樹中只有很短的平均高度?!就扑]了解黑馬程序員大數據課程

 

1575879250727_孤立森林算法2.png


b 和c 的高度為3,a的高度是2,d的高度是1??梢钥吹絛 最有可能是異常,因為其最早就被孤立(isolated)了。

 

3. 算法建模

3.1 參數設置

(1)n_estimators:int,可選(默認值= 100),集合中的基本估計量的數量

(2)max_samples:int 或float,optional(default =“auto”)

         從X 中抽取的樣本數量,以訓練每個基本估計量。

         ?如果為int,則繪制max_samples 采樣。

         ?如果為float,則繪制max_samples * X.shape [0]個采樣。

         ?如果是“auto”,那么max_samples = min(256,n_samples)。

         ?如果max_samples 大于提供的樣本數量,則所有樣本都將用于所有樹木(不進行采樣)。

(3)contamination:float(0.,0.5),可選(默認值= 0.1)

(4)數據集的contamination 量,即數據集中異常值的比例。在擬合時用于定義決策函數的閾值。

3.2 代碼實戰(zhàn)

代碼實現:

import pandas as pd
import numpy as np
from sklearn.ensemble import IsolationForest
#todo:孤立森林建模
#1. 生成訓練數據
rng = np.random.RandomState(42)
X = 0.3 * rng.randn(100, 2) #生成100 行,2 列
X_train = np.r_[X + 2, X - 2]
print(X_train)
# 產生一些異常數據
X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))
iForest= IsolationForest(contamination=0.1)
iForest = iForest.fit(X_train)
#預測
pred = iForest.predict(X_outliers)
print(pred)
# [-1 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1]
#-1 為異常值1 表示正常值


代碼解釋:

1575879261041_孤立森林算法3.jpg


猜你喜歡:

圖論算法介紹
冒泡排序算法

分享到:
在線咨詢 我要報名
和我們在線交談!