異常檢測問題介紹
假想你是一個飛機引擎製造商,當你生產的飛機引擎從生產線上流出時,你需要進行QA(質量控制測試),而作爲這個測試的一部分,你測量了飛機引擎的一些特徵變量,比如引擎運轉時產生的熱量,或者引擎的振動等等
這樣一來,你就有了一個數據集,從到,如果你生產了個引擎的話,你將這些數據繪製成圖表,看起來就是這個樣子
這裏的每個點、每個叉,都是你的無標籤數據。這樣,異常檢測問題可以定義如下:我們假設後來有一天,你有一個新的飛機引擎從生產線上流出,而你的新飛機引擎有特徵變量。所謂的異常檢測問題就是:我們希望知道這個新的飛機引擎是否有某種異常,或者說,我們希望判斷這個引擎是否需要進一步測試。
給定數據集 ,我們假使數據集是正常的,我們希望知道新的數據 是不是異常的,即這個測試數據不屬於該組數據的機率如何。我們所構建的模型應該能根據該測試數據的位置告訴我們其屬於一組數據的可能性 。
上圖中,在藍色圈內的數據屬於該組數據的可能性較高,而越是偏遠的數據,其屬於該組數據的可能性就越低。
這種方法稱爲密度估計,表達如下
異常檢測主要用來識別欺騙。例如在線採集而來的有關用戶的數據,一個特徵向量中可能會包含如:用戶多久登錄一次,訪問過的頁面,在論壇發佈的帖子數量,甚至是打字速度等。嘗試根據這些特徵構建一個模型,可以用這個模型來識別那些不符合該模式的用戶。
異常檢測可以概述爲:
樣本的第個用戶特徵
模型爲我們其屬於一組數據的可能性,通過檢測非正常樣本
用高斯分佈解決異常檢測
對於給定的數據集 ,我們要針對每一個特徵計算 和的估計值
給定新的一個訓練實例,根據模型計算
當時,判斷爲異常
下圖是一個由兩個特徵的訓練集,以及特徵的分佈情況:
假設上圖中綠色的點是需要測試的樣本,設定, 根據已有的公式計算
, 正常
, 異常
下面的三維圖表表示的是密度估計函數,軸爲根據兩個特徵的值所估計值:
開發和評估一個異常檢測系統
當我們開發一個異常檢測系統時,我們從帶標記(異常或正常)的數據着手,我們從其中選擇一部分正常數據用於構建訓練集,然後用剩下的正常數據和異常數據混合的數據構成交叉檢驗集和測試集。
例如:我們有10000臺正常引擎的數據,有20臺異常引擎的數據。 我們這樣分配數據:
6000臺正常引擎的數據作爲訓練集
2000臺正常引擎和10臺異常引擎的數據作爲交叉檢驗集
2000臺正常引擎和10臺異常引擎的數據作爲測試集
具體的評價方法如下:
- 根據訓練集數據,我們估計特徵的平均值和方差並構建函數
- 對交叉檢驗集,我們嘗試使用不同的值作爲閥值,並預測數據是否異常,根據值,或者之比選擇
- 選出 後,針對測試集進行預測,計算異常檢驗系統的值,或者之比
異常檢測與監督學習的對比
異常檢測 | 監督學習 |
---|---|
非常少量的正向類(異常數據 ), 大量的負向類() | 同時有大量的正向類和負向類 |
許多不同種類的異常,非常難。根據非常少量的正向類數據來訓練算法 | 有足夠多的正向類實例,足夠用於訓練 算法,未來遇到的正向類實例可能與訓練集中的非常近似 |
未來遇到的異常可能與已掌握的異常、非常的不同 | -- |
例如: 欺詐行爲檢測 生產(例如飛機引擎)檢測數據中心的計算機運行狀況 | 例如:郵件過濾器 天氣預報 腫瘤分類 |
對於很多技術公司可能會遇到的一些問題,通常來說,正樣本的數量很少,甚至有時候是0,也就是說,出現了太多沒見過的不同的異常類型,那麼對於這些問題,通常應該使用的算法就是異常檢測算法。
異常檢測選擇特徵與誤差分析
異常檢測假設特徵符合高斯分佈,如果數據的分佈不是高斯分佈,異常檢測算法也能夠工作,但是最好還是將數據轉換成高斯分佈。例如使用對數函數,爲非負常數
一個常見的問題是一些異常的數據可能也會有較高的值,因而被算法認爲是正常的。這種情況下誤差分析能夠幫助我們,我們可以分析那些被算法錯誤預測爲正常的數據,觀察能否找出一些問題。我們可能能從問題中發現我們需要增加一些新的特徵,增加這些新特徵後獲得的新算法能夠幫助我們更好地進行異常檢測。
上圖中,左邊的曲線圖,假設有一個異常樣本是圖中的綠色點,它也有很高的值。想檢測出來這種異常點的可行方法是增加一些特徵,比如右圖中增加特徵,綠色的異常樣本呢就能和正常樣本很好地區分開,值也會變得很小。例如,在檢測數據中心的計算機狀況的例子中,我們可以用CPU負載與網絡通信量的比例作爲一個新的特徵,如果該值異常地大,便有可能意味着該服務器是陷入了一些問題中。