1. 程式人生 > 其它 >異常檢測——線性相關方法

異常檢測——線性相關方法

技術標籤:機器學習

異常檢測——線性相關方法


學習筆記~

引言

真實資料集中不同維度的資料通常具有高度的相關性,這是因為不同的屬性往往是由相同的基礎過程以密切相關的方式產生的。在古典統計學中,這被稱為——迴歸建模,一種引數化的相關性分析。一類相關性分析試圖通過其他變數預測單獨的屬性值,另一類方法用一些潛在變數來代表整個資料。前者的代表是 線性迴歸,後者一個典型的例子是 主成分分析。本文將會用這兩種典型的線性相關分析方法進行異常檢測。

需要明確的是,這裡有兩個重要的假設:
  假設一:近似線性相關假設。線性相關假設是使用兩種模型進行異常檢測的重要理論基礎。
  假設二:子空間假設。子空間假設認為資料是鑲嵌在低維子空間中的,線性方法的目的是找到合適的低維子空間使得異常點(o)在其中區別於正常點(n)。

基於這兩點假設,在異常檢測的第一階段,為了確定特定的模型是否適合特定的資料集,對資料進行探索性和視覺化分析是非常關鍵的。

資料視覺化

以breast-cancer-unsupervised-ad資料集為例做一些簡單的資料視覺化。

#coding:utf-8
#匯入warnings包,利用過濾器來實現忽略警告語句。
import warnings
warnings.filterwarnings('ignore')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno
## 1) 載入訓練集和測試集;
path = 'dataverse_files/'
f=open(path+'breast-cancer-unsupervised-ad.csv')
Train_data = pd.read_csv(f)
## 2) 簡略觀察資料(head()+shape)
Train_data.head()
## 2) 簡略觀察資料(tail()+shape)
Train_data.tail()
## 1) 通過describe()來熟悉資料的相關統計量
Train_data.describe()
## 2) 通過info()來熟悉資料型別
Train_data.info()
numeric_features = ['f' + str(i) for i in range(30)]
## 1) 相關性分析
numeric = Train_data[numeric_features]
correlation = numeric.corr()
f , ax = plt.subplots(figsize = (14, 14))
sns.heatmap(correlation,square = True)
plt.title('Correlation of Numeric Features with Price',y=1,size=16)
plt.show())
## 3) 每個數字特徵得分佈視覺化
f = pd.melt(Train_data, value_vars=numeric_features)
g = sns.FacetGrid(f, col="variable", col_wrap=6, sharex=False, sharey=False)
g = g.map(sns.distplot, "value", hist=False, rug=True)
#變數兩兩之間的相關性
sns.set()
sns.pairplot(Train_data[numeric_features],size = 2 ,kind
='scatter',diag_kind='kde')
plt.savefig('correlation.png')
plt.show()
#資料降維視覺化
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, init='pca', random_state=0)
result = tsne.fit_transform(numeric)
x_min, x_max = np.min(result, 0), np.max(result, 0)
result = (result - x_min) / (x_max - x_min)
label = Train_data['label']
fig = plt.figure(figsize = (7, 7))
#f , ax = plt.subplots()
color = {'o':0, 'n':7}
for i in range(result.shape[0]):
plt.text(result[i, 0], result[i, 1], str(label[i]),
color=plt.cm.Set1(color[label[i]] / 10.),
fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.title('Visualization of data dimension reduction')

線性迴歸

線上性迴歸中,我們假設不同維度的變數具有⼀定的相關性,並可以通過⼀個相關係數矩陣進⾏衡量。因此對於特定的觀測值,可以通過線性⽅程組來建模。在實際應⽤中,觀測值的數量往往遠⼤於資料的維度,導致線性⽅程組是⼀個超定⽅程,不能直接求解。因此需要通過優化的⽅法,最小化模型預測值與真實資料點的誤差。
線性迴歸是統計學中⼀個重要的應⽤,這個重要的應⽤往往是指通過⼀系列⾃變數去預測⼀個特殊因變數的值。在這種情況下,異常值是根據其他⾃變數對因變數的影響來定義的,而⾃變數之間相互關係中的異常則不那麼重要。這⾥的異常點檢測主要⽤於資料降噪,避免異常點的出現對模型效能的影響,因而這⾥關注的興趣點主要是正常值(n)。
而我們通常所說的異常檢測中並不會對任何變數給與特殊對待,異常值的定義是基於基礎資料點的整體分佈,這⾥我們關注的興趣點主要是異常值(o)。
⼴義的迴歸建模只是⼀種⼯具,這種⼯具既可以⽤來進⾏資料降噪也可以進⾏異常點檢測。

基於自變數與因變數的線性迴歸

最小二乘法

為了簡單起⻅,這⾥我們⼀元線性迴歸為例:
Y = ∑ i = 1 d a i ⋅ X i + a d + 1 Y= \begin{matrix} \sum_{i=1}^d a_i \cdot X_i + a_{d+1} \end{matrix} Y=i=1daiXi+ad+1
變數Y為因變數,也就是我們要預測的值; X 1 . . . X d X_1...X_d X1...Xd 為⼀系列因變數,也就是輸⼊值。係數 a 1 . . . a d + 1 a_1...a_{d+1} a1...ad+1為要學習的引數。假設資料共包含N 個樣本,第j個樣本包含的資料為 x j 1 . . . x j d x_{j1}...x_{jd} xj1...xjd y j y_j yj,帶⼊式(1)如下式所⽰:

y j = ∑ i = 1 d a i ⋅ X j i + a d + 1 + ϵ j y_j=\begin{matrix} \sum_{i=1}^d a_i \cdot X_{ji} + a_{d+1}+ {\epsilon}_j\end{matrix} yj=i=1daiXji+ad+1+ϵj

這⾥ ϵ j {\epsilon}_j ϵj為第 j j j個樣本的誤差。以 Y Y Y代表 N × 1 N\times1 N×1 的因變數矩陣 ( y 1 . . . y N ) T (y_1...y_N)^T (y1...yN)T,即樣本中的真實值;以 U U U代表 N × ( d + 1 ) N \times (d+1) N×(d+1)的⾃變數矩陣,其中第 j j j⾏為 ( x j 1 . . . x j d , 1 ) (x_{j1}...x_{jd}, 1) (xj1...xjd,1);以 A A A代表 ( d + 1 ) × 1 (d+1) \times 1 (d+1)×1的係數矩陣 ( a 1 . . . a d + 1 ) T (a_1...a_{d+1})^T (a1...ad+1)T。則模型可表⽰為: f ( U , A ) = U ⋅ A f(U,A)=U \cdot A f(U,A)=UA
定義目標函式為:

L ( A ) = 1 2 ∣ ∣ Y − U ⋅ A ∣ ∣ 2 L(A)=\frac{1}{2}||Y-U\cdot A|| ^ 2 L(A)=21YUA2

⽬標函式是關於A的凸函式,其對A求偏導為:

∂ L ( A ) ∂ A = 1 2 ∂ ∣ ∣ Y − u ⋅ A ∣ ∣ 2 ∂ A = − U T ( Y − U ⋅ A ) \frac{\partial L(A)}{\partial A}= \frac{1}{2} \frac { \partial ||Y-u \cdot A|| ^ 2}{\partial A} = -U^T(Y-U \cdot A) AL(A)=21AYuA2=UT(YUA)

∂ L ( A ) ∂ A = 0 \frac{\partial L(A)}{\partial A} = 0 AL(A)=0,得到最優引數為:

A = ( U T ⋅ U ) − 1 ⋅ ( U T ⋅ T ) A= (U ^ T \cdot U)^{-1} \cdot (U ^ T \cdot T) A=(UTU)1(UTT)

這種求解線性迴歸引數的⽅法也叫最小⼆乘法
最小⼆乘法要求矩陣 U T ⋅ U U ^ T \cdot U UTU可逆,即 U T ⋅ U U ^ T \cdot U UTU是滿秩的。當 U T ⋅ U U ^ T \cdot U UTU不可逆時可以通過兩種⽅法進⾏引數估計,⼀種先使⽤主成分分析等⽅法來預處理資料,消除不同特徵之間的相關性,然後再使⽤最小⼆乘法。第⼆種⽅法是使⽤梯度下降法

梯度下降法

監督學習⼀般靠資料驅動。我們通常收集⼀系列的真實資料,例如多棟房屋的真實售出價格和它們對應的⾯積和房齡。我們希望在這個資料上⾯尋找模型引數來使模型的預測價格與真實價格的誤差最小。在機器學習術語⾥,該資料集被稱為訓練資料集(training data set)或訓練集(training set),通常還應該有⼀個⽤於防⽌過擬合的交叉驗證集和⼀個⽤於評估模型效能的測試集(test set)。⼀棟房屋被稱為⼀個樣本(sample),其真實售出價格叫作標籤(label),⽤來預測標籤的兩個因素叫作特徵(feature)。
損失函式
如果把線性迴歸看作是⼀個優化問題,那麼我們要優化的⽬標就是損失函式。損失函式是⽤來衡量樣本誤差的函式,我們的優化⽬標是要求得在誤差最小的情況下模型引數的值。這⾥強調⼀下損失函式和代價函式的區別:
注意:
Loss Function(損失函式):the error for single training example;
Cost Function(代價函式):the average of the loss functions of the entire training set;
線性迴歸常⽤的損失函式是均⽅誤差,表示式為:

優化演算法 - 隨機梯度下降
當模型和損失函式形式較為簡單時,上⾯的誤差最小化問題的解可以直接⽤公式表達出來。這類解叫作解析解(analytical solution)。本節使⽤的線性迴歸和平⽅誤差剛好屬於這個範疇。然而,⼤多數
深度學習模型並沒有解析解,只能通過優化演算法有限次迭代模型引數來儘可能降低損失函式的值。這類解叫作數值解(numerical solution)。
在求數值解的優化演算法中,小批量隨機梯度下降(mini-batch stochastic gradient descent)被⼴泛使⽤。它的演算法很簡單:先選取⼀組模型引數的初始值,如隨機選取;接下來對引數進⾏多次迭代,使每次迭代都可能降低損失函式的值。在每次迭代中,先隨機均勻取樣⼀個由固定數⽬訓練資料樣本所組成的小批量(mini-batch),然後求小批量中資料樣本的平均損失和有關模型引數的導數(梯度),最後⽤此結果與預先設定的學習率的乘積作為模型引數在本次迭代的減小量。如下式所⽰:
在這裡插入圖片描述
學習率( η \eta η): 代表在每次優化中,能夠學習的步⻓的⼤小
批量⼤小( B B B): 是小批量計算中的批量⼤小batch size

基於異常檢測的線性迴歸

前⼀節討論了這樣⼀種情況:即⼀個特定的變數被認為是特殊的,最優平⾯是通過最小化該特殊變數的均⽅誤差而確定的。而我們通常所說的異常檢測中並不會對任何變數給與特殊對待,異常值的定義是基於基礎資料點的整體分佈,因此需要採⽤⼀種更⼀般的迴歸建模:即以相似的⽅式對待所有變數,通過最小化資料對該平⾯的投影誤差確定最佳迴歸平⾯。在這種情況下,假設我們有⼀組變數 X i . . . X d X_i...X_d Xi...Xd, 對應的迴歸平⾯如下:
a 1 ⋅ X 1 + . . . + a d ⋅ X d + a d + 1 = 0 a_1 \cdot X_1 + ...+ a_d \cdot X_d + a_{d+1} = 0 a1X1+...+adXd+ad+1=0
為了後續計算的⽅便,對引數進⾏如下約束:
∑ i = 1 d a i 2 = 1 \sum_{i=1}^da_i^2 = 1 i=1dai2=1
L 2 L_2 L2範數作為目標函式:
L = ∣ ∣ U ⋅ A ∣ ∣ 2 L=||U \cdot A ||_2 L=UA2
這樣的⼀個問題可以通過主成分分析⽅法得到有效解決,我們會單獨⽤⼀個部分進⾏討論。

主成分分析

上⼀節的最小⼆乘法試圖找到⼀個與資料具有最佳匹配 ( d − 1 ) (d-1) (d1)維超平⾯。主成分分析⽅法可⽤於解決這⼀問題的⼴義版本。具體來說,它可以找到任意 k ( k < d ) k(k<d) k(k<d)維的最優表⽰超平⾯,從而使平⽅投影誤差最小化。

原理推導

對於 d d d維,包含 N N N個樣本的資料,⽤ R i R_i Ri表⽰其中第 i i i⾏為: [ s i 1 . . . x i d ] [s_{i1}...x_{id}] [si1...xid] 。由此可以得到 d × d d \times d d×d的協⽅差矩陣(標準的PCA應當計算相關係數矩陣,即對資料進⾏均值為0⽅差為1的標準化處理,而協⽅差矩陣只需要減去均值即可)
在這裡插入圖片描述
易知協⽅差矩陣 Σ \Sigma Σ是對稱並且半正定的,因此可以進⾏相似對⻆化:
Σ = P ⋅ D ⋅ P T \Sigma = P \cdot D \cdot P^T Σ=PDPT
這⾥的 為對⻆矩陣,對⻆元素為特徵值; 為標準正交矩陣,每⼀⾏為對應的特徵向量;這些標準正交向量提供了資料應該投影的軸線⽅向。與異常檢測相關的主成分分析的主要性質如下:

  • 如果前 k k k的特徵向量選定之後(根據最⼤的 個特徵值),由這些特徵向量定義的 維超平⾯是在所有維度為 k k k的超平⾯中,所有資料點到它的均⽅距離儘可能小的平⾯。
  • 如果將資料轉換為與正交特徵向量對應的軸系,則轉換後的資料沿每個特徵向量維的⽅差等於相應的特徵值。在這種新表⽰中,轉換後的資料的協⽅差為0。
  • 由於沿特徵值小的特徵向量的轉換資料的⽅差很低,因此沿這些⽅向的變換資料與平均值的顯著偏差可能表⽰離群值。

需要注意的是,相⽐2.2節的內容,這⾥提供了⼀個更加普遍的解決⽅法。2.2中的內容可以歸為主
成分分析中只保留最⼤特徵值對應的特徵向量的情況。
在得到這些特徵值和特徵向量之後,可以將資料轉換到新的座標系中。以 Y 1 . . . Y N Y_1...Y_N Y1...YN表⽰新座標系中的資料,這些資料可以通過原始向量 R i R_i Ri與包含新軸系的標準正交特徵向量矩陣P的乘積來實現。
Y i = R i ⋅ P Y_i = R_i \cdot P Yi=RiP
在許多涉及⾼維資料集的真實場景中,很⼤⼀部分特徵值往往⾮常接近於零。這意味著⼤多數資料都沿著⼀個低維的⼦空間排列。從異常檢測的⻆度來看,這是⾮常⽅便的,因為離這些投影⽅向⾮常遠的觀測值可以被假定為離群值。例如,對於特徵值較小(⽅差較小)的特徵向量 j j j,第 i i i條記錄的 y i j y_{ij} yij y k j y_kj ykj的其他值的偏差較⼤,說明有離群⾏為。這是因為當 j j j固定而 k k k變化時, y k j y_kj ykj 的值應當變化不⼤。因此, y i j y_{ij} yij 值是不常⻅的。
在不選取任何特定的 k k k維集合的情況下,⼀種更精確的異常檢測建模⽅法是使⽤特徵值來計算資料點沿每個主分量⽅向到質⼼的歸⼀化距離。設 e j e_j ej為第 j j j個特徵向量, λ j \lambda_j λj為沿該⽅向的⽅差(特徵值)。資料點 X ˉ \bar{X} Xˉ相對於對資料質⼼ μ ˉ \bar{\mu} μˉ的總體歸⼀化異常得分可以由下式給出:
在這裡插入圖片描述
值得注意的是,對異常得分的⼤部分貢獻是由 值較小的主成分的偏差提供的,這⼀點上⽂中有提及過。主成分分析⽐因變量回歸能更穩定地處理少數異常值的存在。這是因為主成分分析是根據最優超平⾯來計算誤差的,而不是⼀個特定的變數。當資料中加⼊更多的離群點時,最優超平⾯的變化通常不會⼤到影響離群點的選擇。因此,這種⽅法更有可能選擇正確的異常值,因為迴歸模型⼀開始就更準確。

歸一化問題

當不同維度的尺度差別較⼤時,使⽤ 有時並不能得到直觀有效的結果。例如,考慮⼀個包含年齡和⼯資等屬性的⼈口統計資料集。⼯資屬性的範圍可能是⼏萬,而年齡屬性⼏乎總是小於100,使⽤主成分分析會導致主成分被⾼⽅差屬性所控制。對於⼀個只包含年齡和⼯資的⼆維資料集,最⼤的特徵向量⼏乎與⼯資軸平⾏,這會降低異常點檢測過程的有效性。因此,⼀個⾃然的解決⽅案是對資料進⾏均值為0⽅差為1的標準化處理。這隱含地導致在主成分分析中使⽤相關矩陣而不是協⽅差矩陣。當然,這個問題並不是線性建模所獨有的,對於⼤多數異常檢測演算法,都需要使⽤這樣的預處理。

迴歸分析的侷限性

迴歸分析作為檢測離群值的⼯具有⼀些侷限性。這些缺點中最重要的是在本章的⼀開始就討論了,其中探討了迴歸分析的資料特定性質。特別是,為了使迴歸分析技術有效,資料需要⾼度相關,並沿著低維⼦空間對⻬。當資料不相關,但在某些區域⾼度聚集時,這種⽅法可能不會有效。
另⼀個相關的問題是,資料中的相關性在本質上可能不是全域性性的。最近的⼀些分析觀察表明,⼦空間相關性是特定於資料的特定位置的。在這種情況下,由主成分分析發現的全域性⼦空間對於異常檢測是次優的。因此,為了建立更⼀般的區域性⼦空間模型,有時將線性模型與鄰近模型(在後續章節中討論)結合起來是有⽤的。這將是⾼維和⼦空間異常檢測的主題,將在後續章節詳細討論。

總結

真實資料中,資料不同屬性之間往往具有顯著的相關性。在這種情況下,線性建模可以提供⼀種有效的⼯具來從底層資料中移除異常值或者進⾏異常檢測。對於其他基於因變量回歸的應⽤,線性建模是⼀種⼯具,去除異常值對於提⾼此類應⽤的效能是⾮常重要的。在⼤多數情況下,主成分分析提供了去除異常值和進⾏異常檢測最有效的⽅法,因為它對存在少數異常值的資料更有魯棒性。