1. 程式人生 > >Machine Learning第九講【異常檢測】-- (二)建立一個異常檢測系統

Machine Learning第九講【異常檢測】-- (二)建立一個異常檢測系統

一、Developing and Evaluating an Anomaly Detection System(異常檢測系統的衡量指標)

對於某一演算法,我們可以通過藉助某些數字指標來衡量演算法的好壞,仍舊以飛機引擎的例子來說:

假設有10000個正常的引擎,20個有瑕疵的引擎(異常)

我們將這些 引擎分為以下資料集:

  • 訓練集:使用6000個正常的引擎(y=0)
  • 交叉驗證集:使用2000個正常的引擎(y=0),10個異常的引擎(y=1)
  • 測試集:使用2000個正常的引擎(y=0),10個異常的引擎(y=1)

也就是10000個正常的引擎在訓練集、交叉驗證集和測試集裡面都有,且這三個資料集中沒有重合的資料。

當然,也有一部分人這樣分類:

  • 訓練集:使用6000個正常的引擎(y=0)
  • 交叉驗證集:使用4000個正常的引擎(y=0),10個異常的引擎(y=1)
  • 測試集:使用4000個正常的引擎(y=0),10個異常的引擎(y=1)

但是我們並不贊成第二種分類方法,因為它的交叉驗證集和測試集使用的是同一組資料。
接下來,對於演算法的評估過程如下:
(1)使用訓練集訓練模型p(x)
(2)使用模型p(x)在交叉驗證集上做預測,若p(x)<ε,則預測值y=0,若p(x)≥ε,則預測值y=1。
因為預測異常點,這裡面的資料肯定會比較偏斜,即正常的樣本(y=0)比較多,而異常樣本(y=1)比較少,因此使用Accuracy會產生雖然Accuracy高但是預測效果並不好的情況。我們可以採用下面的指標來衡量:
True Positive, False Positive, False Negative, True Negative
Precision/Recall
F1-score
我們可以選出交叉驗證集中F1-score最大值時對應的ε值,作為衡量指標ε。我們也可以使用交叉驗證集來評價演算法,確定應該選擇哪些特徵。

二、Anomaly Detection vs. Supervised Learning(異常檢測 vs. 監督學習)

我們應該什麼時候使用異常檢測,什麼使用監督學習呢?

異常檢測    
(1)正樣本(y=1)(正樣本的數量一般是0-20,也可能是50)的數量比較少(very small)--可以將這些正樣本存為交叉驗證集和測試集
負樣本(y=0)的數量有很多(large)--用大部分的負樣本訓練模型,因此只要有足夠的負樣本,便可以很好地擬合數據
(2)異常檢測有很多種型別,我們很難從數目較多的正樣本中學習出模型來預測未知的樣本,因為未知的樣本異常的原因可能多種多樣,而且可能是之前沒有見過的型別。(以飛機引擎為例,異常可能有很多種原因,可能是一個零件的損壞,也可能是全部零件的損壞)

監督學習
(1)正樣本和負樣本的數目都很多。
(2)有足夠數目的正樣本用來訓練模型,而且未來需要預測的樣本和模型中訓練樣本較為相似,這種情況需要使用監督學習演算法。(可能我們會覺得垃圾郵件的例子也很很多分類,那為什麼不適用異常檢測而使用監督學習呢?因為雖然垃圾郵件的型別有很多,但是我們垃圾郵件的訓練樣本也有很多,因此使用監督學習演算法)

 

實踐中,異常檢測和監督學習的例子有哪些?

異常檢測
詐騙預測--雖然詐騙預測一般使用異常檢測,但是如果有大量欺詐使用者的資料,預測模型能夠預測未知資料,我們傾向於使用監督學習演算法
工業界,如飛機引擎的檢測
資料中心用來檢測資料是否異常

監督學習
垃圾郵件分類
天氣預測,根據已有資料預測未來的天氣趨勢(晴天/陰天等)
癌症分類

 

三、Choosing What Features to Use(如何選擇特徵?)


首先,如果根據特徵畫出來的圖形和高斯分佈的圖形相差比較大,則我們需要對特徵做一些處理,使得圖形與高斯分佈的圖形相似,這樣能夠提高預測準確率,具體如下圖:

上面的圖形與高斯分佈的圖形很類似,所以我們不需要處理,而對於下面的圖形,因其與高斯分佈圖形相差太大,所以我們需要處理,可以使用log,或者開平方等函式。

將圖形變成高斯分佈之後,有利用我們進行預測,那我們應該怎麼進行異常檢測中的錯誤分析呢?

我們期望對於normal的樣本,p(x)的值大一些,對於anomalous的樣本,p(x)的值小一些
但是,大多數的情況是:無論是對於normal的樣本還是anomalous的樣本,p(x)都很大或者都很小
面對這種情況,我們需要找出那些預測錯誤的樣本(無論是normal還是anomalous),找出其共有特徵,看看是否可以提取出一些新特徵來提高預測準確率,來看下面的例子:

左圖是原始的圖形,它只包含一個特徵x1,其中A點是一個異常點,但是A點對應的p(x)還是比較大的,因此在預測的時候它是被錯誤預測的,即預測值y=0,將其預測為normal,但是其是anomalous的。我們分析之後發現其有一個特徵x2,因為我們加入特徵x2,加入x2之後,所有樣本的分佈圖如右圖,這時候,可能紅圈之內的樣本被預測為normal,紅圈之外的樣本被預測為anomalous,因此在含有2個特徵的情況下,這個異常樣本是可以被檢測出來的,這樣也就提高了預測的準確率。

再舉一個數據中心檢測的例子:

我們在選擇特徵時,需要會選擇那些取值不是很大也不是很小的特徵,比如:

x1 = memory use of computer
x2 = number of disk accesses/sec
x3 = CPU load
x4 = network traffic
我們將下來想知道哪些地方出現問題了,我認為CPU load和network traffic應該互為線性關係,在程式執行的過程中,發現有一組資料CPU load和network traffic都很大,但是懷疑一種情形:在執行的過程中,計算機進入了死迴圈,因此被卡住了,因此CPU load升高,但是network traffic沒有變化,在這種情況下,要檢測出異常,我可以新增新的特徵:x5 = (CPU load)/(network traffic)或者x6 = (CPU load)^2/(network traffic),這樣,若network traffic不變,而CPU load變大,x5或者x6就會出現異常,以便檢測。