異常檢測實戰

數據科學導論 python語言實現

一、單變量異常檢測(一次觀測一個變量)

1.1 Z-scores 得分絕對值超過3的

1.2 箱線圖

 

import numpy as np
from sklearn import preprocessing
normailized_data = preprocessing.StandardScaler().fit_transform(boston.data[:,continuous_variables])
outlier_rows,outlier_columns = np.where(np.abs(normalized_data)>3)

單變量方法不能檢測哪些不是極端值的異常值,然而,如果它發現兩個或多個變量的組合出現不正常的值,所涉及的不是極端值的概率會大,因此多變量檢測應運而生

 

 

二、多變量異常檢測(同時考慮多個變量) 

2.1 covariance.EllipticEnvelope類:

假設全部數據可以表示成基本的多元高斯分佈,.EllipticEnvelope是一個試圖找出數據總體分佈關鍵參數的函數。檢查每個觀測量與總均值的距離,總均值要考慮數據集中的所有變量,因此算法能同時發現單變量和多變量的異常值

from sklearn.covariance import EllipticEnvelope

robust_covariance_est = EllipticEnvelope(contamination=0.05,store_precision=False,assume_centered = False)
robust_covariance_est.fit(data)
detection = robust_covariance_est.predict(data)
outliers = np.where(detection == -1)
regular = np.where(detection == 1)

缺點:當數據有多個分佈時,算法視圖將數據適應一個總體分佈,傾向於尋找最偏遠聚類中的潛在異常值,而忽略了數據中其他可能受異常值影響的區域

注意:數據要標準化再使用更好一點 

2.2svm.OneClassSVM類:

默認參數:kernel=rbf,degree=3,gamma,nu:決定模型是否符合一個精確分佈,還是應該保持某種標準分佈而不太注重適應現有的數據(如果有異常值存在,選擇後者)

from sklearn.decomposition import PCA
from sklearn import proprecessing
from sklearn import svm
# 標準化
continuous_variable = [n for n in range(boston.data.shape[1]) if n !=3]
normalized_data = preprocessing.StandardScalar().fit_transform(boston.data[:,continuous_variables])
# pca
pca = PCA(n_components = 5)
Zscore_components = pca.fit_transform(normalized_data)
vtot = 'PCA Variance expained' + str(round(np.sum(pca.explained_variance_ration_),3))
# oneclasssvm
outliers_fraction = 0.02
nu_estimate = 0.95*outliers_fraction + 0.05
machine_learning=svm.OneClassSVM(kernel='rbf',gamma=1/len(normalized_data),degree=3,nu=nu_estimate)
machine_learning.fit(normalized_data)
detection = machine_learning.predict(normalized_data)
outliers = np.where(detection==-1)
regular = np.where(detection==1)
# 可視化
from matplotlib import pyplot as plt 
for r in range(1,5):
    in_points = plt.scatter(Zscore_components[regular,0],Zscore_components[regular,r],c='blue',alpha=0.8,s=60,marker='o',edgecolor='white')
    out_points = plt.scatter(Zscore_components[outliers,0],Zscore_components[outliers,r],c='red',alpha=0.8,s=60,marker='o',edgecolor='white')
    plt.legend((in_points,out_points),('inliers','outliers'),scatterpoints=1,loc='best')
    plt.xlabel('Component 1 ( '+str(round(pca.explained_variance_ratio_[0],3))+')')
    plt.ylabel('Component'+str(r+1)+'('+str(round(pca.explained_variance_ratio_[r],3))+')')
    plt.xlim([-7,7])
    plt.ylim([-6,6])
    plt.title(vtot)
    plt.show()

當然,除了PCA還有RandomizedPCA,FactorAnalysis更適合大數據集合

 kernelPCA將信號映射到非線性空間

3.DBSCAN

from sklearn.cluster import DBSCAN
dbs_2 = DBSCAN(eps=0.5)
labels_2 = dbs_2.fit(dataset_2).labels_
np.unique(labels_2)
#如果結果裏出現-1,就是異常點所在的類

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章