您的位置:首頁>科技>正文

吳恩達機器學習中文版筆記:異常檢測(Anomaly Detection)

大資料文摘經授權轉載

作者:黃海廣

在接下來的一系列視頻中, 我將向大家介紹異常檢測(Anomaly detection)問題。 這是機器學習演算法的一個常見應用。

這種演算法的一個有趣之處在於:它雖然主要用於非監督學習問題, 但從某些角度看, 它又類似於一些監督學習問題。

問題的動機

參考文檔:15-1-Problem Motivation(8 min).mkv

在接下來的一系列視頻中, 我將向大家介紹異常檢測(Anomaly detection)問題。 這是機器學習演算法的一個常見應用。 這種演算法的一個有趣之處在於:它雖然主要用於非監督學習問題, 但從某些角度看, 它又類似於一些監督學習問題。

什麼是異常檢測呢?為了解釋這個概念, 讓我舉一個例子吧:

假想你是一個飛機引擎製造商, 當你生產的飛機引擎從生產線上流出時, 你需要進行QA(品質控制測試), 而作為這個測試的一部分, 你測量了飛機引擎的一些特徵變數, 比如引擎運轉時產生的熱量,

或者引擎的振動等等。

這樣一來, 你就有了一個資料集, 從x(1)到x(m), 如果你生產了m個引擎的話, 你將這些資料繪製成圖表, 看起來就是這個樣子:

這裡的每個點、每個叉, 都是你的無標籤資料。 這樣, 異常檢測問題可以定義如下:我們假設後來有一天, 你有一個新的飛機引擎從生產線上流出, 而你的新飛機引擎有特徵變數xtest。 所謂的異常檢測問題就是:我們希望知道這個新的飛機引擎是否有某種異常, 或者說, 我們希望判斷這個引擎是否需要進一步測試。 因為, 如果它看起來像一個正常的引擎, 那麼我們可以直接將它運送到客戶那裡, 而不需要進一步的測試。

給定資料集x(1), x(2), .., x(m), 我們假使資料集是正常的, 我們希望知道新的資料xtest是不是異常的,

即這個測試資料不屬於該組資料的幾率如何。 我們所構建的模型應該能根據該測試資料的位置告訴我們其屬於一組資料的可能性P(x)。

上圖中, 在藍色圈內的資料屬於該組資料的可能性較高, 而越是偏遠的資料, 其屬於該組資料的可能性就越低。

這種方法稱為密度估計, 表達如下:

欺詐檢測:

x(i)=用戶的第個i活動特徵

模型P(x)為我們其屬於一組資料的可能性, 通過P(x)<ε檢測非正常用戶。

異常檢測主要用來識別欺騙。 例如線上採集而來的有關使用者的資料, 一個特徵向量中可能會包含如:使用者多久登錄一次, 訪問過的頁面, 在論壇發佈的帖子數量, 甚至是打字速度等。 嘗試根據這些特徵構建一個模型, 可以用這個模型來識別那些不符合該模式的使用者。

再一個例子是檢測一個資料中心, 特徵可能包含:記憶體使用情況, 被訪問的磁片數量, CPU的負載, 網路的通信量等。 根據這些特徵可以構建一個模型, 用來判斷某些電腦是不是有可能出錯了。

高斯分佈

參考視頻:15-2-Gaussian Distribution (10 min).mkv

在這個視頻中, 我將介紹高斯分佈, 也稱為正態分佈。 回顧高斯分佈的基本知識。

通常如果我們認為變數x符合高斯分佈x~N(u,σ2)其概率密度函數為:

我們可以利用已有的資料來預測總體中的u和σ2的計算方法如下:

高斯分佈樣例:

注:機器學習中對於方差我們通常只除以m而非統計學中的(m-1)。 這裡順便提一下, 在實際使用中, 到底是選擇使用1/m還是1/(m-1)其實區別很小, 只要你有一個還算大的訓練集, 在機器學習領域大部分人更習慣使用1/m這個版本的公式。 這兩個版本的公式在理論特性和數學特性上稍有不同, 但是在實際使用中, 他們的區別甚小, 幾乎可以忽略不計。

演算法

參考視頻:15-3-Algorithm (12 min).mkv

在本節視頻中, 我將應用高斯分佈開發異常檢測演算法。

異常檢測演算法:

對於給定的資料集x(1),x(2),..,x(m),我們要針對每一個特徵計算u和σ2的估計值。

一旦我們獲得了平均值和方差的估計值,給定新的一個訓練實例,根據模型計算P(x):

當P(x)<ε時,為異常。

下圖是一個由兩個特徵的訓練集,以及特徵的分佈情況:

下面的三維圖表表示的是密度估計函數,z軸為根據兩個特徵的值所估計P(x)值:

我們選擇一個ε,將P(x)=ε作為我們的判定邊界,當P(x)>ε時預測資料為正常資料,否則為異常。

在這段視頻中,我們介紹了如何擬合P(x),也就是x的概率值,以開發出一種異常檢測演算法。同時,在這節課中,我們也給出了通過給出的資料集擬合參數,進行參數估計,得到參數u和σ然後檢測新的樣本,確定新樣本是否是異常。

在接下來的課程中,我們將深入研究這一演算法,同時更深入地介紹,怎樣讓演算法工作地更加有效。

開發和評價一個異常檢測系統

參考視頻:15-4-Developing and Evaluating an Anomaly Detection System(13 min).mkv

異常檢測演算法是一個非監督學習演算法,意味著我們無法根據結果變數y的值來告訴我們資料是否真的是異常的。我們需要另一種方法來説明檢驗演算法是否有效。當我們開發一個異常檢測系統時,我們從帶標記(異常或正常)的資料著手,我們從其中選擇一部分正常資料用於構建訓練集,然後用剩下的正常資料和異常資料混合的資料構成交叉檢驗集和測試集。

例如:我們有10000台正常引擎的資料,有20台異常引擎的資料。我們這樣分配資料:

6000台正常引擎的資料作為訓練集

2000台正常引擎和10台異常引擎的資料作為交叉檢驗集

2000台正常引擎和10台異常引擎的資料作為測試集

具體的評價方法如下:

根據測試集資料,我們估計特徵的平均值和方差並構建P(x)函數

對交叉檢驗集,我們嘗試使用不同的ε值作為閥值,並預測資料是否異常,根據F1值或者查準率與查全率的比例來選擇ε

選出ε後,針對測試集進行預測,計算異常檢驗系統的F1值,或者查準率與查全率之比

異常檢測與監督學習對比

參考視頻:15-5-Anomaly Detection vs. Supervised Learning(8 min).mkv

之前我們構建的異常檢測系統也使用了帶標記的資料,與監督學習有些相似,下面的對比有助於選擇採用監督學習還是異常檢測:

兩者比較:

希望這節課能讓你明白一個學習問題的什麼樣的特徵,能讓你把這個問題當做是一個異常檢測,或者是一個監督學習的問題。另外,對於很多技術公司可能會遇到的一些問題,通常來說,正樣本的數量很少,甚至有時候是0,也就是說,出現了太多沒見過的不同的異常類型,那麼對於這些問題,通常應該使用的演算法就是異常檢測演算法。

選擇特徵

參考視頻:15-6-Choosing What Features to Use (12 min).mkv

對於異常檢測演算法,我們使用的特徵是至關重要的,下面談談如何選擇特徵:

異常檢測假設特徵符合高斯分佈,如果資料的分佈不是高斯分佈,異常檢測演算法也能夠工作,但是最好還是將資料轉換成高斯分佈,例如使用對數函數:x=log(x+c),其中c為非負常數;或者x=xc,c為0-1之間的一個分數,等方法。(編者注:在python中,通常用np.log1p()函數,log1p就是log(x+1),可以避免出現負數結果,反向函數就是np.expm1())

誤差分析:

一個常見的問題是一些異常的資料可能也會有較高的P(x)值,因而被演算法認為是正常的。這種情況下誤差分析能夠説明我們,我們可以分析那些被演算法錯誤預測為正常的資料,觀察能否找出一些問題。我們可能能從問題中發現我們需要增加一些新的特徵,增加這些新特徵後獲得的新演算法能夠説明我們更好地進行異常檢測。

異常檢測誤差分析:

我們通常可以通過將一些相關的特徵進行組合,來獲得一些新的更好的特徵(異常資料的該特徵值異常地大或小),例如,在檢測資料中心的電腦狀況的例子中,我們可以用CPU負載與網路通信量的比例作為一個新的特徵,如果該值異常地大,便有可能意味著該伺服器是陷入了一些問題中。

在這段視頻中,我們介紹了如何選擇特徵,以及對特徵進行一些小小的轉換,讓資料更像正態分佈,然後再把資料登錄異常檢測演算法。同時也介紹了建立特徵時,進行的誤差分析方法,來捕捉各種異常的可能。希望你通過這些方法,能夠瞭解如何選擇好的特徵變數,從而説明你的異常檢測演算法,捕捉到各種不同的異常情況。

多元高斯分佈(選修)

參考視頻:15-7-Multivariate Gaussian Distribution(Optional)(14 min).mkv

假使我們有兩個相關的特徵,而且這兩個特徵的值域範圍比較寬,這種情況下,一般的高斯分佈模型可能不能很好地識別異常資料。其原因在於,一般的高斯分佈模型嘗試的是去同時抓住兩個特徵的偏差,因此創造出一個比較大的判定邊界。

下圖中是兩個相關特徵,洋紅色的線(根據ε的不同其範圍可大可小)是一般的高斯分佈模型獲得的判定邊界,很明顯綠色的X所代表的資料點很可能是異常值,但是其P(x)值卻仍然在正常範圍內。多元高斯分佈將創建像圖中藍色曲線所示的判定邊界。

在一般的高斯分佈模型中,我們計算P(x)的方法是:通過分別計算每個特徵對應的幾率然後將其累乘起來,在多元高斯分佈模型中,我們將構建特徵的協方差矩陣,用所有的特徵一起來計算P(x)。

我們首先計算所有特徵的平均值,然後再計算協方差矩陣:

注:其中u是一個向量,其每一個單元都是原特徵矩陣中一行資料的均值。最後我們計算多元高斯分佈的P(x):

其中:

|∑|是定矩陣,在Octave中用det(sigma)計算

∑1是逆矩陣,下面我們來看看協方差矩陣是如何影響模型的:

上圖是5個不同的模型,從左往右依次分析:

是一個一般的高斯分佈模型

通過協方差矩陣,令特徵1擁有較小的偏差,同時保持特徵2的偏差

通過協方差矩陣,令特徵2擁有較大的偏差,同時保持特徵1的偏差

通過協方差矩陣,在不改變兩個特徵的原有偏差的基礎上,增加兩者之間的正相關性

通過協方差矩陣,在不改變兩個特徵的原有偏差的基礎上,增加兩者之間的負相關性

多元高斯分佈模型與原高斯分佈模型的關係:

可以證明的是,原本的高斯分佈模型是多元高斯分佈模型的一個子集,即像上圖中的第1、2、3,3個例子所示,如果協方差矩陣只在對角線的單位上有非零的值時,即為原本的高斯分佈模型了。

原高斯分佈模型和多元高斯分佈模型的比較:

原高斯分佈模型被廣泛使用著,如果特徵之間在某種程度上存在相互關聯的情況,我們可以通過構造新新特徵的方法來捕捉這些相關性。

如果訓練集不是太大,並且沒有太多的特徵,我們可以使用多元高斯分佈模型。

使用多元高斯分佈進行異常檢測(可選)

參考視頻:15-8-Anomaly Detection using the Multivariate Gaussian Distribution(Optional)(14 min).mkv

在我們談到的最後一個視頻,關於多元高斯分佈,看到的一些建立的各種分佈模型,當你改變參數,u和∑。在這段視頻中,讓我們用這些想法,並應用它們制定一個不同的異常檢測演算法。

要回顧一下多元高斯分佈和多元正態分佈:

分佈有兩個參數,u和∑。其中u這一個n維向量和∑的協方差矩陣,是一種n*n的矩陣。而這裡的公式x的概率,如按u和參數化∑,和你的變數u和∑,你可以得到一個範圍的不同分佈一樣,你知道的,這些都是三個樣本,那些我們在以前的視頻看過了。

因此,讓我們談談參數擬合或參數估計問題:

我有一組樣本x(1),x(2),..,x(m)是一個n維向量,我想我的樣本來自一個多元高斯分佈。我如何嘗試估計我的參數u和∑以及標準公式?

估計他們是你設置u是你的訓練樣本的平均值。

並設置∑:

這其實只是當我們使用PCA演算法時候,有∑時寫出來。所以你只需插入上述兩個公式,這會給你你估計的參數u和你估計的參數∑。所以,這裡給出的資料集是你如何估計u和∑讓我們以這種方法而只需將其插入到異常檢測演算法。那麼,我們如何把所有這一切共同開發一個異常檢測演算法?

首先,我們把我們的訓練集,和我們的擬合模型,我們計算P(x)要知道,設定u和描述的一樣∑。

如圖,該分佈在中央最多,越到外面的圈的範圍越小。

並在該點是出路這裡的概率非常低。

原始模型與多元高斯模型的關係如圖:

其中:協方差矩陣∑為:

原始模型和多元高斯分佈比較如圖:

想要查看完整版課程筆記的同學請移步GitHub:

https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes

異常檢測演算法:

對於給定的資料集x(1),x(2),..,x(m),我們要針對每一個特徵計算u和σ2的估計值。

一旦我們獲得了平均值和方差的估計值,給定新的一個訓練實例,根據模型計算P(x):

當P(x)<ε時,為異常。

下圖是一個由兩個特徵的訓練集,以及特徵的分佈情況:

下面的三維圖表表示的是密度估計函數,z軸為根據兩個特徵的值所估計P(x)值:

我們選擇一個ε,將P(x)=ε作為我們的判定邊界,當P(x)>ε時預測資料為正常資料,否則為異常。

在這段視頻中,我們介紹了如何擬合P(x),也就是x的概率值,以開發出一種異常檢測演算法。同時,在這節課中,我們也給出了通過給出的資料集擬合參數,進行參數估計,得到參數u和σ然後檢測新的樣本,確定新樣本是否是異常。

在接下來的課程中,我們將深入研究這一演算法,同時更深入地介紹,怎樣讓演算法工作地更加有效。

開發和評價一個異常檢測系統

參考視頻:15-4-Developing and Evaluating an Anomaly Detection System(13 min).mkv

異常檢測演算法是一個非監督學習演算法,意味著我們無法根據結果變數y的值來告訴我們資料是否真的是異常的。我們需要另一種方法來説明檢驗演算法是否有效。當我們開發一個異常檢測系統時,我們從帶標記(異常或正常)的資料著手,我們從其中選擇一部分正常資料用於構建訓練集,然後用剩下的正常資料和異常資料混合的資料構成交叉檢驗集和測試集。

例如:我們有10000台正常引擎的資料,有20台異常引擎的資料。我們這樣分配資料:

6000台正常引擎的資料作為訓練集

2000台正常引擎和10台異常引擎的資料作為交叉檢驗集

2000台正常引擎和10台異常引擎的資料作為測試集

具體的評價方法如下:

根據測試集資料,我們估計特徵的平均值和方差並構建P(x)函數

對交叉檢驗集,我們嘗試使用不同的ε值作為閥值,並預測資料是否異常,根據F1值或者查準率與查全率的比例來選擇ε

選出ε後,針對測試集進行預測,計算異常檢驗系統的F1值,或者查準率與查全率之比

異常檢測與監督學習對比

參考視頻:15-5-Anomaly Detection vs. Supervised Learning(8 min).mkv

之前我們構建的異常檢測系統也使用了帶標記的資料,與監督學習有些相似,下面的對比有助於選擇採用監督學習還是異常檢測:

兩者比較:

希望這節課能讓你明白一個學習問題的什麼樣的特徵,能讓你把這個問題當做是一個異常檢測,或者是一個監督學習的問題。另外,對於很多技術公司可能會遇到的一些問題,通常來說,正樣本的數量很少,甚至有時候是0,也就是說,出現了太多沒見過的不同的異常類型,那麼對於這些問題,通常應該使用的演算法就是異常檢測演算法。

選擇特徵

參考視頻:15-6-Choosing What Features to Use (12 min).mkv

對於異常檢測演算法,我們使用的特徵是至關重要的,下面談談如何選擇特徵:

異常檢測假設特徵符合高斯分佈,如果資料的分佈不是高斯分佈,異常檢測演算法也能夠工作,但是最好還是將資料轉換成高斯分佈,例如使用對數函數:x=log(x+c),其中c為非負常數;或者x=xc,c為0-1之間的一個分數,等方法。(編者注:在python中,通常用np.log1p()函數,log1p就是log(x+1),可以避免出現負數結果,反向函數就是np.expm1())

誤差分析:

一個常見的問題是一些異常的資料可能也會有較高的P(x)值,因而被演算法認為是正常的。這種情況下誤差分析能夠説明我們,我們可以分析那些被演算法錯誤預測為正常的資料,觀察能否找出一些問題。我們可能能從問題中發現我們需要增加一些新的特徵,增加這些新特徵後獲得的新演算法能夠説明我們更好地進行異常檢測。

異常檢測誤差分析:

我們通常可以通過將一些相關的特徵進行組合,來獲得一些新的更好的特徵(異常資料的該特徵值異常地大或小),例如,在檢測資料中心的電腦狀況的例子中,我們可以用CPU負載與網路通信量的比例作為一個新的特徵,如果該值異常地大,便有可能意味著該伺服器是陷入了一些問題中。

在這段視頻中,我們介紹了如何選擇特徵,以及對特徵進行一些小小的轉換,讓資料更像正態分佈,然後再把資料登錄異常檢測演算法。同時也介紹了建立特徵時,進行的誤差分析方法,來捕捉各種異常的可能。希望你通過這些方法,能夠瞭解如何選擇好的特徵變數,從而説明你的異常檢測演算法,捕捉到各種不同的異常情況。

多元高斯分佈(選修)

參考視頻:15-7-Multivariate Gaussian Distribution(Optional)(14 min).mkv

假使我們有兩個相關的特徵,而且這兩個特徵的值域範圍比較寬,這種情況下,一般的高斯分佈模型可能不能很好地識別異常資料。其原因在於,一般的高斯分佈模型嘗試的是去同時抓住兩個特徵的偏差,因此創造出一個比較大的判定邊界。

下圖中是兩個相關特徵,洋紅色的線(根據ε的不同其範圍可大可小)是一般的高斯分佈模型獲得的判定邊界,很明顯綠色的X所代表的資料點很可能是異常值,但是其P(x)值卻仍然在正常範圍內。多元高斯分佈將創建像圖中藍色曲線所示的判定邊界。

在一般的高斯分佈模型中,我們計算P(x)的方法是:通過分別計算每個特徵對應的幾率然後將其累乘起來,在多元高斯分佈模型中,我們將構建特徵的協方差矩陣,用所有的特徵一起來計算P(x)。

我們首先計算所有特徵的平均值,然後再計算協方差矩陣:

注:其中u是一個向量,其每一個單元都是原特徵矩陣中一行資料的均值。最後我們計算多元高斯分佈的P(x):

其中:

|∑|是定矩陣,在Octave中用det(sigma)計算

∑1是逆矩陣,下面我們來看看協方差矩陣是如何影響模型的:

上圖是5個不同的模型,從左往右依次分析:

是一個一般的高斯分佈模型

通過協方差矩陣,令特徵1擁有較小的偏差,同時保持特徵2的偏差

通過協方差矩陣,令特徵2擁有較大的偏差,同時保持特徵1的偏差

通過協方差矩陣,在不改變兩個特徵的原有偏差的基礎上,增加兩者之間的正相關性

通過協方差矩陣,在不改變兩個特徵的原有偏差的基礎上,增加兩者之間的負相關性

多元高斯分佈模型與原高斯分佈模型的關係:

可以證明的是,原本的高斯分佈模型是多元高斯分佈模型的一個子集,即像上圖中的第1、2、3,3個例子所示,如果協方差矩陣只在對角線的單位上有非零的值時,即為原本的高斯分佈模型了。

原高斯分佈模型和多元高斯分佈模型的比較:

原高斯分佈模型被廣泛使用著,如果特徵之間在某種程度上存在相互關聯的情況,我們可以通過構造新新特徵的方法來捕捉這些相關性。

如果訓練集不是太大,並且沒有太多的特徵,我們可以使用多元高斯分佈模型。

使用多元高斯分佈進行異常檢測(可選)

參考視頻:15-8-Anomaly Detection using the Multivariate Gaussian Distribution(Optional)(14 min).mkv

在我們談到的最後一個視頻,關於多元高斯分佈,看到的一些建立的各種分佈模型,當你改變參數,u和∑。在這段視頻中,讓我們用這些想法,並應用它們制定一個不同的異常檢測演算法。

要回顧一下多元高斯分佈和多元正態分佈:

分佈有兩個參數,u和∑。其中u這一個n維向量和∑的協方差矩陣,是一種n*n的矩陣。而這裡的公式x的概率,如按u和參數化∑,和你的變數u和∑,你可以得到一個範圍的不同分佈一樣,你知道的,這些都是三個樣本,那些我們在以前的視頻看過了。

因此,讓我們談談參數擬合或參數估計問題:

我有一組樣本x(1),x(2),..,x(m)是一個n維向量,我想我的樣本來自一個多元高斯分佈。我如何嘗試估計我的參數u和∑以及標準公式?

估計他們是你設置u是你的訓練樣本的平均值。

並設置∑:

這其實只是當我們使用PCA演算法時候,有∑時寫出來。所以你只需插入上述兩個公式,這會給你你估計的參數u和你估計的參數∑。所以,這裡給出的資料集是你如何估計u和∑讓我們以這種方法而只需將其插入到異常檢測演算法。那麼,我們如何把所有這一切共同開發一個異常檢測演算法?

首先,我們把我們的訓練集,和我們的擬合模型,我們計算P(x)要知道,設定u和描述的一樣∑。

如圖,該分佈在中央最多,越到外面的圈的範圍越小。

並在該點是出路這裡的概率非常低。

原始模型與多元高斯模型的關係如圖:

其中:協方差矩陣∑為:

原始模型和多元高斯分佈比較如圖:

想要查看完整版課程筆記的同學請移步GitHub:

https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes

Next Article
喜欢就按个赞吧!!!
点击关闭提示