異常檢測-基於孤立森林算法Isolation-based Anomaly Detection-2-實現


參考https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest.fit

 

class sklearn.ensemble.IsolationForest(n_estimators=100, max_samples=’auto’, contamination=’legacy’, max_features=1.0, bootstrap=False, n_jobs=None, behaviour=’old’, random_state=None, verbose=0, warm_start=False)

孤立森林算法

使用孤立森林算法對每個樣本返回異常分數

孤立森林通過隨機選取一個特征來“隔離”觀察,然后隨機選取該選取特征在數據集中最大、最小值之間的某個值做分割值

當遞歸分區能夠被一個樹結構表示時,需要用來隔離一個樣本的分割值數量等價於從樹的根節點尋找到該樣本的終端節點經過的路徑長度

這個路徑長度,是在這樣的隨機樹的森林中平均得到的,是一個衡量標准和我們的決策函數

隨機分區為異常生成明顯更短的路徑。因此當一個隨機樹森林為某個樣本共同生成一個更短的路徑長度時,就說明該樣本很可能是異常點

New in version 0.18.

 

參數:

1)n_estimators  : int, optional (default=100) 指定該森林中生成的隨機樹數量
2)max_samples  : int or float, optional (default=”auto”)
用來訓練隨機數的樣本數量,即子采樣的大小
  • 如果設置的是一個int常數,那么就會從總樣本X拉取max_samples個樣本來生成一棵樹iTree
  • 如果設置的是一個float浮點數,那么就會從總樣本X拉取max_samples * X.shape[0]個樣本,X.shape[0]表示總樣本個數
  • 如果設置的是"auto",則max_samples=min(256, n_samples),n_samples即總樣本的數量
  如果max_samples值比提供的總樣本數量還大的話,所有的樣本都會用來構造數,意思就是沒有采樣了,構造的n_estimators棵iTree使用的樣本都是一樣的,即所有的樣本
3)contamination  : float in (0., 0.5), optional (default=0.1)
取值范圍為(0., 0.5),表示異常數據占給定的數據集的比例
數據集中污染的數量,其實就是訓練數據中異常數據的數量,比如數據集異常數據的比例。定義該參數值的作用是在決策函數中定義閾值。如果設置為'auto',則決策函數的閾值就和論文中定義的一樣

在版本0.20中有變化:默認值從0.1變為0.22版本中的'auto'

4)max_features  : int or float, optional (default=1.0)
指定從總樣本X中抽取來訓練每棵樹iTree的屬性的數量,默認只使用一個屬性
  • 如果設置為int整數,則抽取max_features個屬性
  • 如果是float浮點數,則抽取max_features * X.shape[1]個屬性
5)bootstrap  : boolean, optional (default=False)

如果為True,則各個樹可放回地對訓練數據進行采樣。如果為False,則執行不放回的采樣。

6)n_jobs  : int or None, optional (default=None)

在運行fit()和predict()函數時並行運行的作業數量。除了在joblib.parallel_backend上下文的情況下,None表示為1。設置為-1則表示使用所有可用的處理器

7)behaviour  : str, default=’old’

決策函數decision_function的行為,可以是'old'和'new'。設置為behaviour='new'將會讓decision_function去迎合其他異常檢測算法的API,這在未來將會設置為默認值。正如在offset_屬性文檔中詳細解釋的那樣,decision_function變得依賴於contamination參數,以0作為其檢測異常值的自然閾值。

New in version 0.20:behaviour參數添加到了0.20版本中以實現后向兼容

behaviour='old'在0.20版本中以經棄用,在0.22版本中將不能使用

behaviour參數將在0.22版本中棄用,將在0.24版本中移除

8)random_state  : int, RandomState instance or None, optional (default=None)
  • 如果設置為int常數,則該random_state參數值是用於隨機數生成器的種子
  • 如果設置為RandomState實例,則該random_state就是一個隨機數生成器
  • 如果設置為None,該隨機數生成器就是使用在np.random中的RandomState實例
9)verbose  : int, optional (default=0) 控制樹構建過程的冗長性
10)warm_start  : bool, optional (default=False)
當設置為True時,重用上一次調用的結果去fit,添加更多的樹到上一次的森林1集合中;否則就fit一整個新的森林
屬性:
1)estimators_  : list of DecisionTreeClassifier
構造好的子樹的集合
2 estimators_samples_  : list of arrays
每個子樹抽取的樣本的子集
3)max_samples_  : integer
樣本的真正數量
4)offset_  : float
offset用來從原始分數開始定義決策函數,其關系是decision_function = score_samples - offset_。假設behaviour == ‘new’,則offset_如下定義:
  • 當contamination參數設置為'auto',當inliers的得分接近0且outliers的得分接近-1時,偏移量等於-0.5;
  • 當提供與“auto”不同的contamination參數時,則以在訓練中獲取期望的異常個數的方式來定義偏移量(決策函數< 0的樣本)。
  • 假設behaviour ==“old”,我們總是有offset_ = -0.5,使得決策函數獨立於contamination參數。
注意:其實現是基於一系列的ExtraTreeRegressor。每個樹的最大深度設置為ceil(log_2(n)),其中n是用於構建樹的樣本數量
方法:
decision_function(self, X)  基本分類器對樣本X的計算得到的平均異常分數
fit(self, X[, y, sample_weight])  訓練函數
fit_predict(self, X[, y])  對X進行訓練,並返回X的標簽,即異常或正常;等價於先運行fit()再運行predit()
get_params(self[, deep])  得到該森林的參數
predict(self, X)  預測一個采樣是否為異常
score_samples(self, X) 與原文中定義的異常值相反。
set_params(self, \*\*params)  設置該森林的參數

 

 

 

 

 

 

初始化:

__init__(self, n_estimators=100, max_samples=’auto’, contamination=’legacy’, max_features=1.0, bootstrap=False, n_jobs=None, behaviour=’old’, random_state=None, verbose=0, warm_start=False)

 

1.decision_function(self, X)
基本分類器對樣本X的計算得到的平均異常分數

輸入樣本的異常值計算即計算森林中樹的平均異常值。

對於一棵給定的樹,觀測結果的正常性的度量是包含在該觀測結果的葉子的深度,這等於分離這一點所需的分裂次數。當葉片中有幾個觀察值為n_left時,將添加一個n_left樣例隔離樹的平均路徑長度。

參數:

1)X  : array-like or sparse matrix, shape (n_samples, n_features)
輸入樣本。將在內部轉換為類型dtype=np.float32,如果一個稀疏矩陣被提供給一個稀疏的csr_matrix
返回:
1)scores  : array, shape (n_samples,)

輸入樣本的異常分數。越低越可能是異常,負數表示為異常,整數表示為正常

 

estimators_samples_

構造好的子樹的抽取的樣本的集合

返回一個動態生成的索引列表,該列表標識用於構造森林中每棵樹的樣本。

注意:在每次調用該屬性時都會重新創建該列表,以便通過不存儲采樣數據來減少對象內存占用。因此,獲取屬性的速度可能比預期的要慢。

 

2.fit (self, X, y=None, sample_weight=None)
訓練函數,構建森林
參數:
1)X  : array-like or sparse matrix, shape (n_samples, n_features)
輸入樣本。為得到最大效率使用dtype=np.float32。也支持稀疏矩陣,為得到最大效率使用csc_matrix
2)sample_weight  : array-like, shape = [n_samples] or None
樣本權重。如果為None,則每個樣本的權重相等
3)y  : Ignored
不使用,表示API的一致性
返回:
self  : object
3.fit_predict(self, X, y=None)
對樣本X訓練並返回樣本的標簽結果,即是異常或正常
返回-1表示異常,1表示正常
參數:
1)X  : ndarray, shape (n_samples, n_features)
輸入數據
2)y  : Ignored
不使用,表示API的一致性
4.get_params(self, deep=True)
得到該森林的參數
參數:
deep  : boolean, optional
如果為True,則將返回此森林estimator的參數以及包含的作為森林estimator的子對象。
返回:
params  : mapping of string to any
返回映射於其值的參數名
5.predict(self, X)
預測某個樣本是否是異常
參數:
X  : array-like or sparse matrix, shape (n_samples, n_features)
輸入樣本。將在內部轉換為類型dtype=np.float32,如果一個稀疏矩陣被提供給一個稀疏的csr_matrix
返回:
is_inlier  : array, shape (n_samples,)
對於每個觀測值,根據擬合好的模型,判斷是否為一個異常點,返回值為+1或-1
6.score_samples(self, X)
與原文中定義的異常值相反
輸入樣本的異常值計算為森林中樹木的平均異常值。
對於一棵給定的樹,觀測結果的正常性的度量是包含在該觀測結果的葉子的深度,這等於分離這一點所需的分裂次數。當葉片中有幾個觀察值為n_left時,將添加一個n_left樣例隔離樹的平均路徑長度。
參數:
X  : array-like or sparse matrix, shape (n_samples, n_features)
輸入樣本
返回:
輸入樣本的異常分數。越低越可能是異常
7.set_params(self, **params)
設置該森林(estimator)的參數


免責聲明!

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



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