Coursera ML筆記 -----week9-1 異常檢測

歡迎點擊作者原文地址

Anormaly Detction/Density Estimation

無監督學習的另外一個應用是異常檢測,主要是驗證新的樣本數據是否是異常數據,常用於工業質量檢驗等。

我有一批全部正常(或大部分正常)的數據x(1),x(2),...,x(m)Rn ,希望通過這部分正常的數據建立起一個模型來評估新的數據x 是否正常,應該怎麼去做?

主要的手段是:
(基於正態分佈的)異常檢測(密度估計)

密度估計就是建立起一個模型來計算樣本正常的概率p(x) ,判斷p(x) 和閾值ϵ 之間的關係。當p(x)<ϵ 時,我們就說這個數據是異常的。

這個過程中,有這麼幾個問題是需要去考慮的:
1. 我們怎麼建立模型來計算p(x)
2. 如何評估/調整建立的這個模型
3. 我們的閾值ϵ 怎麼選擇
4. 我們的特徵如何選取

首先,我們考慮

如何建立模型來計算p(x)

  1. 從數據的特徵分量中選擇我們認爲有助於識別異常數據的特徵分量xj ,構建訓練集
  2. 假設訓練集數據的每個特徵分量都是服從正態分佈的,也就是xjN(μj,σ2j)
  3. 計算每一個特徵分量對應的μj,σ2j
    μj=1mi=1mx(i)j
    σ2j=1mi=1m(x(i)jμj)2
    其中,m 很大時,σ2j 的估計用總體方差1m 和樣本方差1m1 的差異並不明顯。
  4. 對於新的樣本,計算p(x)
    p(x)=p(x1;μ1,σ1)p(x2;μ2,σ2)...p(xn;μn,σn)=Πnj=1p(xj;μj,σj)=Πnj=112πσe(xjμj)22σ2  \spce(1)
  5. 判斷p(x)<ϵ

就理論而言,(1)式如果要成立,那麼所有的特徵分量xj 必須相互獨立。但是在實際的應用中,會發現即使xj 不滿足彼此相互獨立的要求,(1)式的計算效果也很好。所以對於xj 獨立性的問題不再單獨討論。
(這裏的概率密度函數用的是正態分佈,那麼可以說我們學習到的是基於正態分佈的密度估計。那如果我們假設xj 是服從其他的分佈,比如泊松分佈等等,那麼我們是否可以得到其他的密度估計方法?其他的密度估計方法和高斯分佈的效果相比如何?)
這裏的另外一個問題是需要做一個區分:在數學中,我們將分佈函數F(x) 看成是在x 點的概率,f(x) (也就是我們這裏的p(x) )看作是概率密度。所以在這裏,我們真正計算的並不是樣本數據的概率,而是樣本的概率密度。當然,採用概率的說法, 能夠有助於理解。

接下來

考慮如何評估並且調整建立的模型和閾值ϵ 的選取?

我們在supervise learning中瞭解到,對於一個模型,最好是能夠一個數值方式來對模型進行評估。可以是分類的準確率,也可以是評價矩陣,也可以是精準率/召回率,或者F1-score。並且可以把數據集分成訓練/驗證/測試集。
對於驗證集和測試集,我們假設其都是帶有label的數據,正常數據y=0 ,異常數據y=1 。那麼我們按照以下的步驟進行評估/調整:
1. 在訓練集x(1),x(2),...,x(m) 上訓練模型p(x)
2. 對驗證集的數據(x(i)cv,y(i)cv) 根據p(x) 來做預測

y={10ififp(x)<ϵp(x)ϵ

3. 數值評估。顯然驗證集的ycv 是skewed class,0多1少。那麼就只能考慮用評價矩陣,Precision/Recall,F1-score

閾值ϵ 怎麼選擇?
參考以前選d ,選λ 的方法,選取多個ϵ ,分別代入計算,選擇最大值

異常檢測 v.s. 監督學習

在上面的模型評估中,我們使用了一些帶有label的數據,並且我們的過程和前面在監督學習中涉及的有一些類似。所以會產生的一個疑問就是:我們爲什麼要用Anormaly Detction,而不用supervise learning ?或者轉換一下:我們在什麼情況下考慮使用Anormaly Detction,什麼情況下使用supervise learning

我們主要從兩個方面去判斷使用的方法:1.看數據中陽性數據y=1 的數量 2.看陽性數據之間的差異性。

和陰性數據y=0 相比,當陽性數據的數量特別少(至多50個),我們就採用異常檢測的方法,並把這些陽性數據放到驗證集和測試集中。而如果陽性數據比較多,我們就採用監督學習的方法。
當陽性數據之間的差異比較大(數據量不大),甚至到彼此之間沒有任何的共同點,下一次出現的異常數據可能根本就沒有在現有的陽性數據裏面出現,算法並不能從已有的陽性數據中學習到足夠的經驗,那麼我們可以考慮使用異常檢測的方法。如果陽性數據比較相似,從現有的陽性數據出發可以預測到下一次的陽性數據(陽性數據之間存在着某種關係),那麼就可以使用監督學習的方法。

當然,這裏面更重要的其實還是陽性數據的數量。例如:我們前面學習過的垃圾郵件分類。垃圾郵件之間的差異性確實會比較大,但是因爲垃圾郵件的數量特別多,所以我們認爲這是一個監督學習的問題,而不是一個異常檢測的問題。

特徵值的選取

我們在前面已經學習過了如何建立並且評估一個異常檢測的模型,但是其中有一點我們似乎忽略掉了。我們只提到了選擇合適的特徵分量來構建訓練集,但是我們並沒有說如何去選擇。那麼剩下的工作就是,我們怎麼去選擇特徵分量。
這個工作主要是從兩個方面去着手:
1. 非高斯分佈的特徵值處理
在前面我們假設各個特徵分量是服從正態分佈的,那如果它們不是服從正態分佈的話,我們的算法還能夠繼續使用麼?答案是肯定的,因爲我們可以將非高斯分佈的特徵值轉換成爲服從正態分佈的新特徵。常用的手段有:log(x+C),xsmallpower(0,1)
2. 如何增加合適的新特徵
這部分的工作主要是在於error analysis。
我們可能會遇到這麼一種情況,我們知道一個樣本是異常的,但是按照我們現有的模型去計算其p(x) ,我們會發現p(x)ϵ 。這個時候我們可以認爲,這個異常數據暗含了一種新的特徵的可能性很大。我們希望可以從中提取出新的特徵,來解決掉我們碰到的p(x)ϵ 的問題。

至此,我們的異常檢測的基本過程就已經學習完成!


拓展:基於多變量高斯分佈的異常檢測

前面已經學習過了基於單變量正態分佈的異常檢測,現在來了解基於多變量高斯分佈的異常檢測。
我們需要了解這麼幾個問題:
1. 什麼是多變量的高斯分佈
2. 我們怎麼將多變量高斯分佈運用到異常檢測中?
3. 單變量/多變量高斯分佈兩者有什麼關係?
4. 做異常檢測時,應該如何進行選擇

多變量的高斯分佈

對於一個數據xRn ,前面我們在計算其p(x) 時,我們使用了p(x)=Πmi=1p(xi;μ,σ2) 。現在我們不單獨考慮每一個特徵分量,而是將x 看成一個整體,把p(x) 的計算方法變成

p(x;μ,Σ)=1(2π)n2|Σ|12e12(xμ)TΣ1(xμ)

其中μRn,ΣRn×n (協方差矩陣covariance matrix),|Σ|Σ 的行列式determinant
對於矩陣Σ ,對角線上的元素代表了各個特徵的σ ,特徵越大則幅度越寬。非對角線元素代表了各個特徵之間的相關性,可以看作是相關係數,在matlab圖裏面的體現就是傾斜的程度(不妨和直線的斜率k聯想到一起)。μ 的各個分量則對應了各個特徵分量的μ

基於多變量高斯分佈的異常檢測

我們前面做error analysis的時候提到過這麼一種情況:對異常數據x ,由於某些特徵之間存在着某種關聯,會出現p(xi;μ,σ)ϵ 。我們前面用到的方法是構建新的特徵,但是在此處我們直接採用基於多變量高斯分佈的異常檢測的方法,它可以自動地找到特徵之間的關聯,不用我們去構建新的特徵。
以下是檢測過程:
1. 對模型p(x) 調參

μ=1mi=1mx(i),Σ=1mi=1m(x(i)μ)T(x(i)μ)

2. 對新數據x ,計算p(x)
p(x;μ,Σ)=1(2π)n2|Σ|12e12(xμ)TΣ1(xμ)

3. 判斷p(x;μ,Σ)<ϵ ?

單變量/多變量高斯分佈兩者異常檢測有什麼關係

單變量是多變量的一種特殊形式,是p(x;μ,Σ)Σ 是一個對角矩陣,即對角線元素以外的元素均爲0.

Σ=σ21σ22σ2n

如何選擇合適的高斯分佈

  單變量 多變量
處理特徵間的關聯 手動構建新特徵 自動發現
計算成本 低,n100000
訓練集大小 m 比較小也適用 必須滿足m>n(m10n) ,否則Σ 不可逆

在使用多變量的時候,如果出現了Σ 是奇異的,或者不可逆的情況,可以從以下兩個方面分析:
1. m是否大於n
2. Σ 是否有形如x1=x2,x3=x4+x5 的redundant feature,如果有則|Σ|=0 ,顯然是不可逆的。當然,這種狀況出現的可能性比較小。主要還是1的情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章