天天看點

異常檢測-高維資料的處理1高維問題的困難2Feature bagging方法孤立森林

github位址:連結

異常檢測專欄位址:[連結]

1.異常檢測-pyod包入門

2.異常檢測-高維資料處理

3.異常檢測-線性檢測模型

4.異常檢測-基于相似度的方法

5.異常檢測-基于統計學的方法

異常檢測-高維資料的處理

  • 1高維問題的困難
  • 2Feature bagging方法
    • 2.1feature bagging 原理
    • 2.2pyod feature bagging示例
  • 孤立森林
    • 3.1原理
    • 3.2示例:

1高維問題的困難

  1. 由于資料次元的上升,資料的樣本空間會呈指數級别增長,使得資料變得稀疏
  2. 次元越高,計算距離的計算量越大,并且由于空間的稀疏性,很多點之間的距離相差都不大

2Feature bagging方法

2.1feature bagging 原理

  • 參考:連結
異常檢測-高維資料的處理1高維問題的困難2Feature bagging方法孤立森林
  • bagging流程

    如圖所示,bagging方法通過使用bootstrap抽樣方法(随機有放回抽樣),随機地從原始資料集中抽取一定比例的樣本用來訓練基模型,并将基礎模型的預測結果,通過一定方法進行彙總,得到最終結果

  • feature bagging中抽取的不是樣本,而是抽取不同的特征來訓練模型,抽取的特征數量在(d/2——d-1)之間,d是特征次元
  • **bagging方法可以降低方差 **

1 C為常數, 則

Var ⁡ ( c X ) = E [ ( c X − E [ c X ] ) 2 ] = c 2 E [ ( X − E [ X ] ) 2 ] = c 2 Var ⁡ ( X ) \operatorname{Var}(c X)=E\left[(c X-E[c X])^{2}\right]=c^{2} E\left[(X-E[X])^{2}\right]=c^{2} \operatorname{Var}(X) Var(cX)=E[(cX−E[cX])2]=c2E[(X−E[X])2]=c2Var(X)

2. 獨立随機變量之和的方差等于各變量的方差之和:

Var ⁡ ( X 1 + ⋯ + X n ) = Var ⁡ ( X 1 ) + ⋯ + Var ⁡ ( X n ) \operatorname{Var}\left(X_{1}+\cdots+X_{n}\right)=\operatorname{Var}\left(X_{1}\right)+\cdots+\operatorname{Var}\left(X_{n}\right) Var(X1​+⋯+Xn​)=Var(X1​)+⋯+Var(Xn​)

3. 如果各模型獨立, 根據 (1)

(2) 可知, 整體方差 Var ⁡ ( 1 n ∑ i = 1 n X i ) = 1 n 2 Var ⁡ ( ∑ i = 1 n X i ) = σ 2 n \operatorname{Var}\left(\frac{1}{n} \sum_{i=1}^{n} X_{i}\right)=\frac{1}{n^{2}} \operatorname{Var}\left(\sum_{i=1}^{n} X_{i}\right)=\frac{\sigma^{2}}{n} Var(n1​∑i=1n​Xi​)=n21​Var(∑i=1n​Xi​)=nσ2​

2.2pyod feature bagging示例

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import matplotlib.font_manager
from sklearn.neighbors import LocalOutlierFactor
import seaborn as sns 
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False
from pyod.utils.data import generate_data,get_outliers_inliers

# 生成二維随機資料
X_train, Y_train = generate_data(n_train=200,train_only=True, n_features=15)

# 拆分出異常資料和正常資料
x_outliers, x_inliers = get_outliers_inliers(X_train,Y_train)

# 繪制生成的資料圖
F1 = X_train[:,[0]].reshape(-1,1)
F2 = X_train[:,[1]].reshape(-1,1)
sns.scatterplot(F1.reshape(-1),F2.reshape(-1),hue=Y_train)
plt.xlabel('F1')
plt.ylabel('F2') 
plt.show()
           
異常檢測-高維資料的處理1高維問題的困難2Feature bagging方法孤立森林
pyod.models.feature_bagging.FeatureBagging(  
            base_estimator=None, n_estimators=10,   
            contamination=0.1, max_features=1.0,   
            bootstrap_features=False, check_detector=True,   
            check_estimator=False, n_jobs=1,   
            random_state=None, combination='average',   
            verbose=0, estimator_params=None)
           
  • 參數
    • base_estimator 訓練的模型,預設為LOF
    • n_estimators 訓練模型的數量
    • max_features 每次抽取的最大特征數或特征比例
    • bootstrap_features 是否又放回
    • combination ‘average’ or ‘max’
from pyod.models.feature_bagging import FeatureBagging
from pyod.models.lof import LOF
from pyod.models.knn import KNN
from sklearn.metrics import accuracy_score
model1 = LOF()
model2 = KNN()
dic = {'bagging_LOF':model1,'bagging_KNN':model2}
for i,(name,model) in enumerate(dic.items()):
    clf = FeatureBagging(base_estimator=model,max_features=12,n_estimators = 10)
    clf.fit(X_train)
    y_pred = clf.predict(X_train)
    print(name,'準确率:',accuracy_score(Y_train,y_pred))
    ax1 = plt.subplot(1,2,i+1)
    sns.scatterplot(F1.reshape(-1),F2.reshape(-1),hue=Y_train,ax=ax1)
    ax1.set_title(name)
           
bagging_LOF 準确率: 0.945
bagging_KNN 準确率: 1.0
           
異常檢測-高維資料的處理1高維問題的困難2Feature bagging方法孤立森林

孤立森林

3.1原理

參考:連結
異常檢測-高維資料的處理1高維問題的困難2Feature bagging方法孤立森林
  • 原理:
    • 孤立森林方法中,異常資料被定義為“ 容易被孤立的離群點”
    • 通過随機地對資料集進行劃分,最終每個子區域将隻包含一個樣本點
    • 如上圖a,b所示,xi點需要劃分多次才能獨立出來,而x0隻需要少次就可以孤立出來,是以x0更有可能是異常點
    • 如上圖c所示,當設定不同的tree數量時,通過平均路徑長度,來判斷一個點是異常點的可能性大小
  • 特點
    • 适用于連續資料的無監督異常檢測
    • 樣本數較多會降低孤立森林孤立異常點的能力
    • 計算量較小,适宜于高維資料

3.2示例:

pyod.models.iforest.IForest(
        n_estimators=100, max_samples='auto', 
        contamination=0.1, max_features=1.0, 
        bootstrap=False, n_jobs=1, 
        behaviour='old', random_state=None, 
        verbose=0)
           
  • 參數
    • n_estimators 訓練器數量
    • max_samples 每個子訓練器提取的樣本數量
    • max_features 每個子訓練器提取的特征數量
from pyod.models.iforest import IForest

clf = IForest(n_estimators = 50,bootstrap = True)

clf.fit(X_train)

y_pred = clf.predict(X_train)

print('異常檢測的準确率:',accuracy_score(Y_train,y_pred))
           
異常檢測的準确率: 1.0