【机器学习】异常检测算法之(HBOS)-Histogram-based Outlier Score
HBOS全名為:Histogram-based Outlier Score。它是一種單變量方法的組合,不能對特征之間的依賴關系進行建模,但是計算速度較快,對大數據集友好,其基本假設是數據集的每個維度相互獨立,然后對每個維度進行區間(bin)劃分,區間的密度越高,異常評分越低。理解了這句話,基本就理解了這個算法。下面我專門畫了兩個圖來解釋這句話。
一、HBOS算法流程
1、靜態寬度直方圖
標準的直方圖構建方法,在值范圍內使用k個等寬箱,樣本落入每個箱的頻率(相對數量)作為密度(箱子高度)的估計,時間復雜度:O(n)
注意:等寬分箱,每個箱中的數據寬度相同,不是指數據個數相同。例如序列[5,10,11,13,15,35,50,55,72,92,204,215],數據集中最大值是215,最小值是5,分成3個箱,故每個箱的寬度應該為(215-5)/3=70,所以箱的寬度是70,這就要求箱中數據之差不能超過70,并且要把不超過70的數據全放在一起,最后的分箱結果如下:
箱一:5,10,11,13,15,35,50,55,72;箱二:92;箱三:204,215
這個是分5箱的圖
2、動態寬度直方圖
首先對所有值進行排序,然后固定數量的N/k 個連續值裝進一個箱里,其 中N是總實例數,k是箱個數,直方圖中的箱面積表示實例數,因為箱的寬度是由箱中第一個值和最后一個值決定的,所有箱的面積都一樣,因此每一個箱的高度都是可計算的。這意味著跨度大的箱的高度低,即密度小,只有一種情況例外,超過k個數相等,此時允許在同一個箱里超過N/k值,時間復雜度:O(n×log(n))
還是用序列[5,10,11,13,15,35,50,55,72,92,204,215]舉例,也是假如分3箱,那么每箱都是4個,寬度為邊緣之差,第一個差為15-5=10,第二差為72-35=37,第三個箱寬為215-92=123,為了保持面積相等,所以導致后面的很矮,前面的比較高,如下圖所示(非嚴格按照規則):
二、算法推導過程
對每個維度都計算了一個獨立的直方圖,其中每個箱子的高度表示密度的估計,然后為了使得最大高度為1(確保了每個特征與異常值得分的權重相等),對直方圖進行歸一化處理。最后,每一個實例的HBOS值由以下公式計算:
推導過程:
假設樣本p第 i 個特征的概率密度為p i ( p ) ,則p的概率密度可以計算為,d為總的特征的個數:
兩邊取對數:
概率密度越大,異常評分越小,為了方便評分,兩邊乘以“-1”:
最后可得:
PyOD是一個可擴展的Python工具包,用于檢測多變量數據中的異常值。它可以在一個詳細記錄API下訪問大約20個離群值檢測算法。
三、應用案例詳解
1、基本用法
from pyod.models.hbos HBOSHBOS(n_bins=10, alpha=0.1, tol=0.5, contamination=0.1)2、模型參數
n_bins:分箱的數量
alpha:用于防止邊緣溢出的正則項
tol:用于設置當數據點落在箱子外時的寬容度
contamination:用于設置異常點的比例
3、應用案例
#導入包 from pyod.utils.data import generate_data,evaluate_print# 樣本的生成 X_train, y_train, X_test, y_test = generate_data(n_train=200, n_test=100, contamination=0.1)X_train.shape (200, 2)X_test.shape (100, 2)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_#返回未知數據上的分類標簽 (0: 正常值, 1: 異常值) y_test_pred = clf.predict(X_test) # 返回未知數據上的異常值 (分值越大越異常) y_test_scores = clf.decision_function(X_test) print(y_test_pred) array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])print(y_test_scores) array([1.94607743, 1.94607743, 1.94607743, 3.18758465, 2.99449223,1.94607743, 3.18758465, 2.99449223, 1.94607743, 3.18758465,1.94607743, 1.94607743, 3.18758465, 1.94607743, 1.94607743,1.94607743, 3.18758465, 1.94607743, 2.99449223, 1.94607743,1.94607743, 1.94607743, 1.94607743, 3.18758465, 3.18758465,2.99449223, 1.94607743, 1.94607743, 1.94607743, 3.18758465,1.94607743, 2.99449223, 1.94607743, 1.94607743, 1.94607743,1.94607743, 2.99449223, 1.94607743, 1.94607743, 1.94607743,1.94607743, 1.94607743, 3.18758465, 1.94607743, 1.94607743,2.99449223, 2.99449223, 3.18758465, 2.99449223, 1.94607743,1.94607743, 1.94607743, 1.94607743, 1.94607743, 3.18758465,1.94607743, 3.18758465, 3.18758465, 1.94607743, 1.94607743,1.94607743, 2.99449223, 3.18758465, 2.99449223, 1.94607743,1.94607743, 3.18758465, 1.94607743, 1.94607743, 1.94607743,1.94607743, 1.94607743, 1.94607743, 2.99449223, 1.94607743,2.99449223, 1.94607743, 3.18758465, 3.18758465, 1.94607743,2.99449223, 2.99449223, 1.94607743, 1.94607743, 1.94607743,1.94607743, 2.99449223, 1.94607743, 3.18758465, 1.94607743,6.36222028, 6.47923046, 6.5608128 , 6.52101746, 6.36222028,6.52015473, 6.44010653, 5.30002108, 6.47923046, 6.51944504])# 模型評估 clf_name = 'HBOS' evaluate_print(clf_name, y_test, y_test_scores) HBOS ROC:1.0, precision @ rank n:1.0# 模型可視化 visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,y_test_pred, show_figure=True, save_figure=False)四、總?? 結
HBOS這個算法原理簡單,復雜度低,在大數據場景比較好用,但是異常識別的效果一般,且針對特征間比較獨立的場景,簡單點講該算法就是把數據劃分為多個區間,然后根據每個區間的頻次根據概率密度函數轉化為對應的出現概率,在將這個概率轉化為異常分數,以此來區分異常數據
因此HBOS在全局異常檢測問題上表現良好,但在局部異常的檢測上效果一般。
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【机器学习】异常检测算法之(HBOS)-Histogram-based Outlier Score的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java xml约束_[Java教程]X
- 下一篇: 我的世界服务器修改末地难度,涨姿势啦!我