一:問題動機
將介紹異常檢測問題,這是機器學習算法的常見應用,那么什么是異常檢測問題?
(一)舉例介紹異常檢測
舉例:比如生產汽車引擎,需要進行質量測試,而作為測試的一部分,需要測量汽車引擎的一些特征變量:
比如:x_1引擎運轉時產生的熱量;x_2引擎的振動;
我們根據數據集:,把數據繪制成圖,如下圖:
這樣,異常檢測問題可以定義如下:
假設,之后生產了一個新的汽車引擎,而新的汽車引擎有一個特征變量集,所謂的異常檢測問題就是希望知道新的汽車引擎是否有某種異常,或者說希望判斷這個引擎是否需要進一步測試。
如果落在原來的特征集之中,認為它是沒有異常的;如果
出現在離原來的特征集很遠的地方,則認為它是有異常的,需要做進一步檢測,如上圖所示。
更正式地定義:給定一個數據集,對它進行數據建模,當有新的特征變量
時:
(二)異常檢測的應用案例
(1)欺詐檢測
例如有些網站會記錄用戶的一些信息,打字速度、單位時間瀏覽網頁次數
等等,然后用這些建立模型
,看哪些用戶的
。
接下來看篩選出的用戶,讓他們做身份驗證,從而可以讓網站防御異常行為或欺詐行為。
(2)工業生產領域
就像之前提到的汽車引擎的問題,可以找到異常的汽車引擎,然后進一步的檢測這些引擎的質量。
(3)數據中心的計算機監控
如果管理一個計算機集群,可以為每台計算機計算特征向量,內存損耗、硬盤訪問量
、CPU負載
等等。
給定正常情況下數據中心計算機的特征變量,可以建立模型,觀察是否有某台計算機
,可以檢測這些計算機的情況。
二:高斯分布
(一)定義
假設x是一個實數的隨機變量(),如果x服從高斯分布,其均值為
,方差為
,記作
高斯分布的圖像如下:
數學公式:
(二)案例觀察u和σ的影響---分布函數中心和高斯分布寬度
高斯分布的幾個例子如下:
(三)參數估計問題
參數估計問題:給定數據集,希望能找到能夠估算出μ
和
σ2的值。
參數估計的公式:
三:高斯分布構建異常檢測算法
應用高斯分布來推導異常檢測算法
假設有數據集:,且
,要處理異常檢測問題先是要用數據集建立概率建模
,試圖解決哪些特征量出現概率高,哪些特征量出現概率低。因此,x是個向量。要建立模型
。
注:每個特征相互獨立
(一)那么如何對這些項進行建模呢?
假定特征是分散的,它服從高斯分布
,同樣,也假設其他的特征服從高斯分布,那么得到模型:
雖然上面的公式是指對於每個特征都是獨立的情況下成立的,但是在實踐中結果表明:無論這些特征量是否近乎獨立,並且即使這個獨立假設不成立,這個算法也能正常運行。
這個分布項的估計問題有時稱作是密度估計問題。
(二)異常檢測算法的步驟和實現
1.選擇那些你認為處於異常狀態(有反常樣本)的特征作為輸入:x^(1),x^(2),...,x^(m)
2.我們要針對每一個特征計算μ和σ2的估計值。
3.一旦我們獲得了平均值和方差的估計值,給定新的一個訓練實例,根據模型計算 p(x):
當p(x)<ε時,為異常。
(三)案例
下圖是一個由兩個特征的訓練集,以及特征的分布情況:
下面的三維圖表表示的是密度估計函數,z軸為根據兩個特征的值所估計p(x)值:
我們選擇一個ε,將p(x)=ε作為我們的判定邊界,當p(x)>ε時預測數據為正常數據,否則為異常。
四:開發和評價一個異常檢測系統
將介紹如何開發一個異常檢測的應用來解決實際問題,同時也將重點介紹如何評估一個異常檢測算法。
在前面,我們已經提到了使用實數評價法的重要性。這樣做的想法是:當你在用某個學習算法來開發一個具體的機器學習應用時,你常常需要做出很多決定。比如說,選擇用什么樣的特征等等。而如果你找到某種評價算法的方式直接返回一個數字,來告訴你算法的好壞,那么你做這些決定就顯得更容易了。
所以比如你要決定,現在有一個額外的特征我要不要把這個特征考慮進來?如果你帶上這個特征運行你的算法,再去掉這個特征運行你的算法,然后得到某個返回的數字。這個數字就直接告訴你,這個特征到底是讓算法表現變好了還是變差了。這樣,你就有了一種更好、更簡單的決定要不要納入這個特征。
到目前為止,都把異常檢測看作是一個無監督學習問題,因為用的是無標簽的數據,但如果有一個帶標簽的數據來指定哪些是異常樣本和哪些是正常樣本,這是能評估異常檢測的標准方法。
為了評估一個異常檢測系統,假設有一些帶標簽的數據,代表異常樣本,同時還有一些無異常樣本。(用y=0表示無異常樣本,y=1表示異常樣本)
(一)異常檢測算法的開發過程和評估方法
(1)假設有訓練集(之后再講交叉驗證集和測試集):把該訓練集看作是無標簽的,所以它是一個很大的無異常樣本集合(正常樣本,即使溜進了一些異常樣本也沒關系);
(2)定義一個交叉驗證集和測試集,用來評估這個異常檢測算法。
具體來說:對於交叉驗證集和測試集,我們假設在其中包含一些已知是異常的樣本。
(二)案例講解
假設有10000個(絕大多數正常)的汽車引擎,還有20個異常的汽車引擎:
有了這組數據,要把數據分離到訓練集、交叉驗證集和測試集中,一種典型的方法如下:
注意:對於額外的20個異常樣本,我們將其分別放置在驗證集、測試集中
得到了訓練集、交叉驗證集和測試集之后,接下來使如如何推導和評估算法:
(1)首先使用訓練集擬合模型p(x),即是把m個無標簽樣本都用高斯函數來擬合;(雖然是無標簽,但是我們將他認為是正常的樣本)
(2)然后在交叉驗證集和測試集上,假設有一個樣本x,用異常檢測算法來預測出y的值;
(3)什么是好的評價指標?
▷ 計算True positive、false positive、false negative、true negative的比例
▷ 計算出算法的精確率和召回率
▷ 計算出F1-score,來總結和反映精確率和召回率
通過上述方法,就可以評價異常檢測算法在樣本集中的表現了。
(4)選擇參數ε的方法:嘗試使用不同的ε值,然后從中選出一個,該值能夠最大化F1-score。
總之:使用訓練集、驗證集、測試集的方法是:當我們進行決策時,比如(是否納入某個特征或者定義參數ε作為閾值),我們可以使用驗證集進行評估算法,然后決定是否采用該決策。當我們找到合適的決策(選取合適的ε值)以后,我們就可以用最后的模型測試集進行評估(評估訓練集得出的模型)
這里討論了評估一個異常檢測算法的步驟,開始用一些帶標簽的數據來評估異常檢測算法,很像在監督學習中所做的。
補充:其他分配方法(不推薦)
這里是將4000個樣本,同時用於驗證集和測試集,然而通常我們認為驗證集和測試集應該使用兩個完全不同的樣本
五:異常檢測VS監督學習
在前面學習中,討論了評估一個異常檢測的過程,當時我們使用了一些帶有標簽的數據,舉了一些例子,這些例子它們要么是正常的,要么是異常的,y要么等於1,要么等於0.所以問題就出來了,假如我們有這些帶有標簽的數據。我們有一些例子,我們知道它們是異常,還有一些例子我們知道它們是正常的,那么為什么我們不用一個監督學習算法,那么為什么我們不用一個邏輯回歸或者一個神經網絡算法去試圖從我們的帶標簽的數據中直接學習,並去預測是否y等於1或者y等於0呢?
在這將介紹一些思想和方法可以在使用異常檢測算法時用到,並且在使用監督學習算法時,這些方法可能會更有效。
(一)異常檢測VS監督學習(1)
1.異常檢測
它的正常例子數量更少,記住當y=1時這些例子為異常樣例(0-20個正樣本);
通常會有一個相比於正樣本數量更大的負樣本,可以用這數量龐大的負樣本來擬合出的值。
所以如果只有負樣本,仍然可以很好的擬合p(x)的值。
2.監督學習
在合理范圍內有大量的正樣本和負樣本。
3. 所以這是一種思考方式決定應該使用異常檢測算法還是監督學習算法。
(二)異常檢測VS監督學習(2)
1.異常檢測
對於異常檢測應用來說,經常有許多不同類型的異常(比如發動機,出問題的異常有多種,還可能是以前沒有出現過的異常)。
因此,如果是這種情況,有很少數量的正樣本,那么對一個算法就很難去從小數量的正樣本中去學習異常是什么;尤其是,未來可能出現的異常看起來會與已有的截然不同,如果是這種情況,那么更有可能的是對負樣本用高斯分布模型來建模。
2.監督學習
在一些其他問題中,有足夠數量的正樣本或是一個已經能識別正樣本的算法;尤其是,假如認為未來可能出現的正樣本與當前訓練集中的正樣本類似,那么這種情況下,使用監督學習算法更合理,它能夠查看大量正樣本和大量負樣本來學到相應特征。
3.所以決定應該使用異常檢測算法還是監督學習算法,它們之間關鍵不同在於在異常檢測中,通常只有很少量的正樣本,對學習算法而言是不可能從這些正樣本中學習到足夠的內容。
(三)使用異常檢測的應用和監督學習算法的應用
希望這節課能讓你明白一個學習問題的什么樣的特征,能讓你把這個問題當作是一個異常檢測,或者是一個監督學習的問題。另外,對於很多技術公司可能會遇到的一些問題,通常來說,正樣本的數量很少,甚至有時候是0,也就是說,出現了太多沒見過的不同的異常類型,那么對於這些問題,通常應該使用的算法就是異常檢測算法。
六:選擇要使用的功能---如何設計或選擇異常檢測算法的特征
對於異常檢測算法,我們使用的特征是至關重要的(對運行有很大影響),下面談談如何選擇特征。
(一)特征轉換
異常檢測假設特征符合高斯分布:(分布如下)
如果數據的分布不是高斯分布,異常檢測算法也能夠工作,但是最好還是將數據轉換成高斯分布,例如使用對數函數:
上圖看上去不像高斯分布的圖像,是一個不均勻的分布,遇到這樣的數據,通常會對數據進行一些不同地轉換,使得它看上去更接近高斯分布。比如會進行一次對數轉換log(x)或者log(x+c),進行一次指數轉換
(二) 如何得到異常檢測算法的特征?
這跟我們之前討論監督學習算法時,誤差分析步驟是類似的。我們先由訓練集完整的訓練出一個算法,然后在驗證集中運行算法,然后找出那些預測出錯的樣本。並看看我們能否找到一些其他的特征來幫助學習算法,讓那些在交叉驗證集中判斷出錯的樣本表現得更好。
通過一個誤差分析步驟:
1.異常檢測中,希望p(x)的值在正常樣本的情況下比較大,在異常的情況下比較小;
2.一個很常見的問題:p(x)是可比較的,當樣本正常和異常時,
p(x)的值都比較大。
(三)誤差分析
一個常見的問題是一些異常的數據可能也會有較高的p(x)值,因而被算法認為是正常的。
這種情況下誤差分析能夠幫助我們,我們可以分析那些被算法錯誤預測為正常的數據,觀察能否找出一些問題。
我們可能能從問題中發現我們需要增加一些新的特征,增加這些新特征后獲得的新算法能夠幫助我們更好地進行異常檢測。
具體實例1:
假如從我們得正常樣本擬合出來數據服從高斯分布,如下圖:
有一個異常樣本,並假設這異常樣本x1的取值為2.5,如下圖所示:
不難看出,這個異常樣本被淹沒在一對正常樣本當中,而我們得算法沒能把他標記為異常樣本。如果這代表汽車引擎的生產或其他什么,那么我會做的是看看我的訓練樣本,看看到底是哪一個具體的汽車引擎出錯了,看看通過這個樣本能不能啟發我想出新的特征x2來幫助算法找出異常的樣本與正常樣本的區別。
所以,希望能否創建一個新的特征下x2,使數據能夠像下圖中展示出來:(所有的訓練樣本就是下面紅叉)
當然,也希望能看到異常樣本,對於異常樣本,這個特征x2能發現不尋常的值。因此對於上面提及的綠色樣本(異常點),其x_1特征值依舊是2.5,但是特征值x_2很有可能是一個比較大的值(3.5)或者比較小的值:
現在如果再給數據建模,會發現異常檢測算法在中間區域的數據有較高的概率,然后越到外層概率越小,到了圖中綠色樣本時,算法會給出很低的概率,這就更容易將異常樣本從正常的樣本中區分出來了。
具體實例2:
在平常選擇特征變量時的一些思考:通常來說,選擇特征變量的方法是選擇那些既不會特別大也不會特別小的特征,對於那些我們認為很有可能是異常的樣本。我們還是用監控數據中心的計算機的例子:
假如有一個計算機集群的管理,如何判斷哪一台計算機有異常?,假設計算機特征有:
x1:內存使用量
x2:磁盤的容量
x3:CPU的負載程度
x4:網絡流量
一般來說,我們認為CPU負載和網絡流量線性相關。但是,如果出現CPU執行代碼進入死循環,導致CPU負載高(相對於大多數CPU負載樣本來說,還是被歸於正常值),而網絡流量為正常或者極低(也是正常),那么這里我們可以想出一個新的特征x5來幫助更好的檢測異常,x5=CPU負載程度/網絡流量,通過這種建立特征的方法,就可以捕捉到這些特殊的特征組合所出現的異常值。 (因為CPU負載高,網絡流量正常,導致x_5極大,為異常)
這就是誤差分析的過程以及如何為異常檢測算法建立新的特征來檢測不同的異常情況。
七: 多變量高斯分布
將介紹目前為止學習的異常檢測算法的一種延伸,這個延伸將會用到多元高斯分布。(優劣皆有),可以捕捉到之前的算法檢測不出來的異常。
(一)案例講解
為了理解這個算法,我們先來看看一個例子:(數據中心的監控機)
如果我把這兩個特征變量 x1 和 x2當做高斯分布來建模
這就是異常檢測算法給 x1 和 x2 建模的方法。
假使我們有兩個相關的特征,而且這兩個特征的值域范圍比較寬(如上),這種情況下,一般的高斯分布模型可能不能很好地識別異常數據。
其原因在於,一般的高斯分布模型嘗試的是去同時抓住兩個特征的偏差,因此創造出一個比較大的判定邊界。
下圖中是兩個相關特征,洋紅色的線(根據ε的不同其范圍可大可小)是一般的高斯分布模型獲得的判定邊界,很明顯綠色的X所代表的數據點很可能是異常值,但是其p(x)值卻仍然在正常范圍內。
多元高斯分布將創建像圖中藍色曲線所示的判定邊界。
(二)多元高斯分布定義
假設有特征變量,不為
分別建模,而要建立一個整體的
模型,就是為所有
建立統一模型。
參數是和
(Σ被稱為協方差矩陣)。
多元高斯分布的公式:
(三)多元高斯分布案例---修改Σ后,p(x)是什么樣子的?
1.Σ帶來的影響(一次改變Σ中兩個元素)<各個特征沒有相關性>
下面以二維特征變量為例:其中μ表示了高斯模型二維分布中心,Σ表示協方差矩陣,衡量的是各個特征的方差,或者說是特征變量x_1和x_2的變化量。如下圖二,減少Σ,那么凸起鼓包寬度會減小,凸起高度會增加。
2.Σ帶來的影響(一次改變Σ中一個元素)<各個特征沒有相關性>
如圖二中,將1改為0.6以后,它所作的事就是減少第一個特征變量x_1的方差,同時保持第二個特征變量x_2的方差不變。
3.Σ帶來的影響(一次改變Σ中多個元素)<各個特征之間有相關性>
可以給x_1和x_2高度相關的情況建立模型。所以具體來說,如果改變協方差矩陣非對角線上的元素,就會得到一種不同的高斯分布。比如圖二到圖三,將非對角線上的值由0.5到0.8,我們會得到一個更高更窄的,沿着x=y這條線的分布。(可以看做x和y是一起增加的)
相反的,如果我們將其設置為負值,會沿着x=-y進行分布:
(四)多元高斯分布案例---修改μ后,p(x)是什么樣子的?
通過這些例子可以讓我們對多元高斯分布所能描述的概率分布有更多的了解,它最大的優點就是能描述兩個特征變量之間可能存在正相關或者負相關的情況。
八:使用多變量高斯分布的異常檢測
(一)多元高斯分布
參數擬合(參數估計):
假如有一組訓練集樣本:(每一個樣本都是n維向量,且服從多元高斯分布)
如何去估計參數μ和Σ?
(二)開發異常檢測算法
首先用數據來擬合該模型,通過設定的μ和Σ來擬合;
接着當有一個新樣本x,也是測試樣本,然后需要用多元高斯分布的公式計算,如果得到
很小(
),就標記該樣本異常。
(二)多元高斯模型和原始模型的關系
原始模型實際上就是某種特殊情況下的多元高斯分布,這種特殊的情形就是當協方差矩陣Σ在非對角線上都是0的時候(各個特征相互獨立,不相關),也就如下所示:
如果用這σ值,將它們放在協方差矩陣中,這時兩個模型就會完全相同,所以這個原始意義上的模型只是多元高斯模型的一種特殊情況。
(三)如何在這兩個模型之間進行選擇呢?
原始模型要用的跟多一些;多元高斯模型用的相對少一些,但它在捕捉特征間的關系方面有着很多優點。
原始模型:
需要手動創建一些新特征來捕捉異常的組合值,因為比如x1和x2組合值出現異常的時候,可能x1和x2本身看起來都是很正常的值,如果花時間來手動創建這樣一個新特征,原始模型就才能運行的更好;
原始模型最大的優勢在於它的計算成本比較低(換言之,它能適應巨大規模n);
即使有一個較小的有一定相關性的訓練集,也能順利運行,這是一個較小的無標簽樣本用來擬合模型。
多元高斯模型:
對比之下,多元高斯模型就能自動地捕捉這種不同特征之間的關系;
但是它的計算成本比較高(即:能適應的n值的范圍比較小);
必須使訓練樣本數量m大於特征數量n,如果在參數估計時不能滿足這個條件的話,協方差矩陣就會不可逆(1.m<n;2.有冗余特征),將無法使用多元高斯模型。
這就是如何用多元高斯模型來進行異常檢測,所以通過本章的學習,我們了解了異常檢測這個算法,並且掌握了高斯模型在異常檢測算法中的應用。