github地址:链接
异常检测专栏地址:[链接]
1.异常检测-pyod包入门
2.异常检测-高维数据处理
3.异常检测-线性检测模型
4.异常检测-基于相似度的方法
5.异常检测-基于统计学的方法
异常检测-高维数据的处理
- 1高维问题的困难
- 2Feature bagging方法
-
- 2.1feature bagging 原理
- 2.2pyod feature bagging示例
- 孤立森林
-
- 3.1原理
- 3.2示例:
1高维问题的困难
- 由于数据维度的上升,数据的样本空间会呈指数级别增长,使得数据变得稀疏
- 维度越高,计算距离的计算量越大,并且由于空间的稀疏性,很多点之间的距离相差都不大
2Feature bagging方法
2.1feature 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=1nXi)=n21Var(∑i=1nXi)=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()
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
孤立森林
3.1原理
参考:链接
- 原理:
- 孤立森林方法中,异常数据被定义为“ 容易被孤立的离群点”
- 通过随机地对数据集进行划分,最终每个子区域将只包含一个样本点
- 如上图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