異常檢測的統(tǒng)計(jì)學(xué)方法的一般思想是:學(xué)習(xí)一個(gè)擬合給定數(shù)據(jù)集的生成模型悼粮,然后識別該模型低概率區(qū)域中的對象,把它們作為異常點(diǎn)曾棕。
即利用統(tǒng)計(jì)學(xué)方法建立一個(gè)模型扣猫,然后考慮對象有多大可能符合該模型。
1 參數(shù)方法
1.1 基于正態(tài)分布的一元異常點(diǎn)檢測
用Python畫一個(gè)簡單的箱線圖:
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
data = np.random.randn(50000) * 20 + 20
sns.boxplot(data=data)
實(shí)驗(yàn)結(jié)果如下:
2.2 多元異常點(diǎn)檢測
3 非參數(shù)方法
4 基于角度的方法
5 HBOS
HBOS算法流程:
為每個(gè)數(shù)據(jù)維度做出數(shù)據(jù)直方圖翘地。對分類數(shù)據(jù)統(tǒng)計(jì)每個(gè)值的頻數(shù)并計(jì)算相對頻率申尤。對數(shù)值數(shù)據(jù)根據(jù)分布的不同采用以下兩種方法:
- 靜態(tài)寬度直方圖:標(biāo)準(zhǔn)的直方圖構(gòu)建方法,在值范圍內(nèi)使用k個(gè)等寬箱衙耕。樣本落入每個(gè)桶的頻率(相對數(shù)量)作為密度(箱子高度)的估計(jì)昧穿。時(shí)間復(fù)雜度:O(n)
- 動態(tài)寬度直方圖:首先對所有值進(jìn)行排序,然后固定數(shù)量的Nk個(gè)連續(xù)值裝進(jìn)一個(gè)箱里橙喘,其中N是總實(shí)例數(shù)时鸵,k是箱個(gè)數(shù);直方圖中的箱面積表示實(shí)例數(shù)厅瞎。因?yàn)橄涞膶挾仁怯上渲械谝粋€(gè)值和最后一個(gè)值決定的寥枝,所有箱的面積都一樣,因此每一個(gè)箱的高度都是可計(jì)算的磁奖。這意味著跨度大的箱的高度低囊拜,即密度小,只有一種情況例外比搭,超過k個(gè)數(shù)相等冠跷,此時(shí)允許在同一個(gè)箱里超過Nk值。
時(shí)間復(fù)雜度:O(n×log(n))
6 學(xué)習(xí)總結(jié):
1.異常檢測的統(tǒng)計(jì)學(xué)方法由數(shù)據(jù)學(xué)習(xí)模型身诺,以區(qū)別正常的數(shù)據(jù)對象和異常點(diǎn)蜜托。使用統(tǒng)計(jì)學(xué)方法的一個(gè)優(yōu)點(diǎn)是,異常檢測可以是統(tǒng)計(jì)上無可非議的霉赡。當(dāng)然橄务,僅當(dāng)對數(shù)據(jù)所做的統(tǒng)計(jì)假定滿足實(shí)際約束時(shí)才為真。
2.HBOS在全局異常檢測問題上表現(xiàn)良好穴亏,但不能檢測局部異常值蜂挪。但是HBOS比標(biāo)準(zhǔn)算法快得多重挑,尤其是在大數(shù)據(jù)集上。
7. HBOS模型實(shí)驗(yàn)
該實(shí)驗(yàn)在jupyter notebook編輯器中完成棠涮。
實(shí)驗(yàn)步驟如下:
- 利用generate_data函數(shù)生成異常值占比為10%的toy set
from pyod.utils.data import generate_data,evaluate_print
contamination = 0.1 # percentage of outliers
n_train = 200 # number of training points
n_test = 100 # number of testing points
X_train, y_train, X_test, y_test = generate_data(
n_train=n_train, n_test=n_test, contamination=contamination)
2.導(dǎo)入hbos谬哀,生成一個(gè)HBOS的異常檢測器對象。 用fit()方法
from pyod.models import hbos
from pyod.utils.example import visualize
clf = hbos.HBOS()
clf.fit(X_train)
y_train_pred = clf.labels_
y_train_socres = clf.decision_scores_
y_test_pred = clf.predict(X_test) # 返回未知數(shù)據(jù)上的分類標(biāo)簽 (0: 正常值, 1: 異常值)
y_test_scores = clf.decision_function(X_test) # 返回未知數(shù)據(jù)上的異常值 (分值越大越異常)
3 獲得結(jié)果并進(jìn)行可視化觀察
clf_name = 'HBOS'
print("\nOn Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
y_test_pred, show_figure=True, save_figure=False)
實(shí)驗(yàn)結(jié)果如下圖所示:
On Test Data:
HBOS ROC:1.0, precision @ rank n:1.0
致謝Datawhale團(tuán)隊(duì)