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