天天看点

异常检测-高维数据的处理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