假設你有一些數據如下圖

這時,給一個新的數據,我們認為這個數據和原來的數據差距不大,因此認為這個數據時正常的

對於下圖所示的新數據,我們認為它是“異常點”,因為它距離其他數據較遠

一般情況下
- 異常檢測的訓練數據集都是正常/都是不正常的數據
- 然后判斷測試數據是否是異常數據
異常檢測方法:
- 根據無標簽的測試數據建立模型(p(x))來給出數據正常/不正常的可能性
- 然后將新數據代入模型中計算 p(x),如果 p(x) < ε ,就將其定義為異常數據;如果 p(x) ≥ ε,就將其定義為正常數據
異常檢測的例子
欺詐檢測:
- x(i) 是第 i 個用戶的行為特征
- 建立模型 p(x)
- 運用 p(x_new) 來定義用戶是否有可能欺詐
用於制造業:
監控數據中心的計算機
- x(i) 是第 i 個計算機的特征
高斯分布(復習)
高斯分布用
\[N\left( {\mu ,{\sigma ^2}} \right)\]
表示,其中 μ 稱為均值,σ 稱為標准差。表征 x 服從高斯分布用
\[x \sim N\left( {\mu ,{\sigma ^2}} \right)\]
表示。
給出數據,且已知數據 x 服從高斯分布(N(μ, σ2))
\[\begin{array}{l}
\left\{ {{x^{\left( 1 \right)}},{x^{\left( 2 \right)}},...,{x^{\left( m \right)}}} \right\}\\
{x^{\left( 1 \right)}} \in
\end{array}\]
用如下公式分別確定 μ,和 σ2
\[\begin{array}{l}
\mu = \frac{1}{m}\sum\limits_{i = 1}^n {{x^{\left( i \right)}}} \\
{\sigma ^2} = \frac{1}{m}\sum\limits_{i = 1}^m {{{\left( {{x^{\left( i \right)}} - \mu } \right)}^2}}
\end{array}\]
注意:數學中確定 σ 會用 m-1 作為分母,但是在機器學習中通常用 m 作為分母,由於數據量很大,所以影響不大。
有如下數據集
\[\begin{array}{l}
\left\{ {{x^{\left( 1 \right)}},{x^{\left( 2 \right)}},...,{x^{\left( m \right)}}} \right\}\\
x \in {R^n}\\
{x^{\left( i \right)}} = \left( {x_1^{\left( i \right)},x_2^{\left( i \right)},...,x_n^{\left( i \right)}} \right)
\end{array}\]
假設數據的每個特征都服從高斯分布(如果不服從,看下面特征處理部分)
\[\begin{array}{l}
{x_1} \sim N\left( {{\mu _1},\sigma _1^2} \right)\\
{x_2} \sim N\left( {{\mu _2},\sigma _3^2} \right)\\
.\\
.\\
{x_n} \sim N\left( {{\mu _n},\sigma _n^2} \right)
\end{array}\]
則定義模型 p(x)
\[p\left( x \right) = p\left( {{x_1};{\mu _1},\sigma _1^2} \right)p\left( {{x_2};{\mu _2},\sigma _2^2} \right) \cdot \cdot \cdot p\left( {{x_n};{\mu _n},\sigma _n^2} \right)\]
或
\[p\left( x \right) = \prod\limits_{j = 1}^n {p\left( {{x_j};{\mu _j},\sigma _j^2} \right)} \]
這里假設每個因素是相互獨立的(即使不獨立這個模型也能很好的工作)
算法的流程
1,選擇您認為可能表示異常示例的特征x
2,計算模型參數 μ1, ...., μn, σ12, ..., σn2
\[\begin{array}{l}
{\mu _j} = \frac{1}{m}\sum\limits_{i = 1}^n {x_j^{\left( i \right)}} \\
\sigma _j^2 = \frac{1}{m}\sum\limits_{i = 1}^m {{{\left( {x_j^{\left( i \right)} - {\mu _j}} \right)}^2}}
\end{array}\]
3,計算新數據的 p(x)
\[p\left( x \right) = \prod\limits_{j = 1}^n {p\left( {{x_j};{\mu _j},\sigma _j^2} \right)} = \prod\limits_{j = 1}^n {\frac{1}{{\sqrt {2\pi } {\sigma _j}}}\exp \left( { - \frac{{{{\left( {{x_j} - {\mu _j}} \right)}^2}}}{{2\sigma _j^2}}} \right)} \]
4,如果 p(x) < ε 就定義為異常
如何評價異常檢測結果?
雖然異常檢測可以是無監督的,但是為了評估模型的性能,我們假設可以得到“有標簽”的數據
舉例
對於飛機引擎的例子,如果有
- 10000 好的引擎樣本
- 20 個以嘗引擎樣本
可以將數據做如下分類
- 訓練集:6000 個好的引擎(y=0)
- 交叉驗證集:2000 個好的引擎(y=0),10 個異常的引擎(y=1)
- 測試集:2000 個好的引擎(y=0),10 個異常的引擎(y=1)
然后,運用訓練集去訓練模型得到 p(x)
接着用交叉驗證集去測試模型准確率
\[y = \left\{ {\begin{array}{*{20}{c}}
{\begin{array}{*{20}{c}}
1&{p(x) < \varepsilon \left( {anomaly} \right)}
\end{array}}\\
{\begin{array}{*{20}{c}}
0&{p(x) \ge \varepsilon \left( {nomal...} \right)}
\end{array}}
\end{array}} \right.\]
這里有幾個評價指標
- True positive, false positive, false negative, true negative
- Precision/Recall
- F1-score
交叉驗證集的作用
- 根據這些評價指標的結果可以調整 ε 的大小
- 根據這些評價指標的結果可以調整選取的表征引擎狀態的特征
最后,將最終模型運用在測試集上
既然有了標簽,為什么不用監督學習?
| Anomaly detection | Supervised learning |
| Very small number of positive examples (y = 1). (0-20 is common) |
Large number of positive and negative examples. |
| Large number of negative (y = 0) examples. |
|
| Many different "type" of anomalies. Hard of any algorithm to learn from positive examples what the anomalies look like; |
Enough positive examples for algorithm to get a sense of what positive examples are like, future positive examples likely to be similar to ones in training set. |
| future anomalies may look nothing like any of the anomalous examples we've seen so far. |
總結:
異常數據特點
- 異常檢測通常只有很少的正樣本(y = 1),但是有很多的負樣本;
- 正樣本“類型”差異度大,這就導致任何算法都很難從這些差異較大的正樣本中學到“信息”;
- 將來出現的正樣本有有很大可能與已有的正樣本沒有任何“相似度”。
其實上面的種種特點已經表明,監督學習算法很難適應上述數據特點:
- 監督學習需要大量的正樣本與負樣本來建立模型,這樣它才能知道“正樣本長得想什么”,“負樣本長的像什么”;
- 監督學習對預測樣本的要求是:將來的正負樣本與訓練集中的樣本具有一定的相似度。
因此,對於異常數據,選用異常檢測模型。
如何選擇特征
選擇那些:當異常事件發生時,特征的值非常大或者非常小的特征。
特征處理
上面假設數據的特征服從某種高斯分布

如果服從最好,如果不服從,而是像這樣

這種情況下,雖然算法也能較好的運行,但是一般情況下會將數據進行處理,比如將 x 替換為 log(x)
\[x \leftarrow \log \left( x \right)\]
數據分布就更像高斯分布了。

同理,也可以使用別的表達式來處理原始特征,使其更接近高斯分布
\[\begin{array}{l}
x \leftarrow \log \left( {x + c} \right)\\
x \leftarrow {x^c}
\end{array}\]
異常檢測的誤差分析
我們希望得到的情況是:
- 對於正常數據,希望得到的 p(x) 盡可能大
- 對於異常數據,希望得到的 p(x) 盡可能小
但是,通常情況下,你會發現,正常數據異常數據得到的 p(x) 都很大,該怎么辦?
比如,當你發現在某個特征中得到較大 p(x1) 的數據是一個異常點

這時,你可以建立一個新的特征,比如 xj+1 來使得 p(x1)p(xj+1) 很小,這樣得到的最終 p(x) 就會比較小,從而符合我們的要求。

運用多元高斯分布做異常檢測
對於如下數據

假如 x1, x2 服從如下分布

對於如下數據點,可以看出它應該屬於異常點

但是,對於常規的運用高斯分布的異常檢測模型來說,它得到的 p(x) 與箭頭所指數據得到的 p(x) 是一樣的,這是不合理的。

多元高斯分布
在多元高斯分布的異常檢測模型中,我們不再分別單獨使用 p(x1), p(x2),...,而是將它們整合到一起。這里有參數
\[\mu \in {R^n},\sum \in {R^{nxn}}\]
μ 是各個特征的均值組成的 n 維向量,Σ 是 n x n 的協方差矩陣
定義模型為
\[p\left( {x;\mu ,\sum } \right) = \frac{1}{{{{\left( {2\pi } \right)}^{\frac{n}{2}}}{{\left| \sum \right|}^{\frac{1}{2}}}}}\exp \left( { - \frac{1}{2}{{\left( {x - \mu } \right)}^T}{\sum ^{ - 1}}\left( {x - \mu } \right)} \right)\]
|Σ| 表示矩陣的行列式
接下來給出不同 μ 與 Σ 情況下的圖形
可以看到 Σ 取不同值時 p(x) 的大小和變化趨勢的變化








以及 μ 變化時,圖形的變化趨勢

這樣,圖形就能很好的適應前面提到的常規高斯分布的異常檢測模型難以解決的問題了。
如何確定 參數 μ 和參數 Σ ?
假設訓練集為
\[\left\{ {{x^{\left( 1 \right)}},{x^{\left( 2 \right)}},...,{x^{\left( m \right)}}} \right\}\]
則
\[\begin{array}{l}
\mu = \frac{1}{m}\sum\limits_{i = 1}^n {{x^{\left( i \right)}}} \\
\sum = \frac{1}{m}\sum\limits_{i = 1}^m {\left( {{x^{\left( i \right)}} - \mu } \right){{\left( {{x^{\left( i \right)}} - \mu } \right)}^T}}
\end{array}\]
對比發現,傳統高斯分布預測模型其實時多元高斯分布預測模型的一個特例,當
\[\sum = \left[ {\begin{array}{*{20}{c}}
{\sigma _1^2}&{}&{}&{}\\
{}&{\sigma _2^2}&{}&{}\\
{}&{}&.&{}\\
{}&{}&{}&{\sigma _1^2}
\end{array}} \right]\]
時,多元高斯分布模型就變成了傳統高斯分布模型。
那么,什么時候用傳統模型,什么時候用多元模型?
- 傳統模型在處理“特征之間有關聯”的情況時需要手動創建新的特征來避免關聯,而多元模型可以自動解決關聯問題;
- 傳統模型的計算開銷小於多元模型;
- 多元模型需要訓練樣本數量 m 大於特征數量 n ,否則 Σ 不可逆。而通常情況下只有當 m >> n (m > 10n)時,運用多元模型才是合適的。傳統模型即使在訓練集很小的情況下也能很好的工作。
