數據科學導論 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,就是異常點所在的類