学习笔记~
引言
真实数据集中不同维度的数据通常具有高度的相关性,这是因为不同的属性往往是由相同的基础过程以密切相关的方式产生的。在古典统计学中,这被称为——回归建模,一种参数化的相关性分析。一类相关性分析试图通过其他变量预测单独的属性值,另一类方法用一些潜在变量来代表整个数据。前者的代表是 线性回归,后者一个典型的例子是 主成分分析。本文将会用这两种典型的线性相关分析方法进行异常检测。
需要明确的是,这里有两个重要的假设:
假设一:近似线性相关假设。线性相关假设是使用两种模型进行异常检测的重要理论基础。
假设二:子空间假设。子空间假设认为数据是镶嵌在低维子空间中的,线性方法的目的是找到合适的低维子空间使得异常点(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=1dai⋅Xi+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=1dai⋅Xji+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)=U⋅A
定义目标函数为:
L ( A ) = 1 2 ∣ ∣ Y − U ⋅ A ∣ ∣ 2 L(A)=\frac{1}{2}||Y-U\cdot A|| ^ 2 L(A)=21∣∣Y−U⋅A∣∣2
⽬标函数是关于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) ∂A∂L(A)=21∂A∂∣∣Y−u⋅A∣∣2=−UT(Y−U⋅A)
令 ∂ L ( A ) ∂ A = 0 \frac{\partial L(A)}{\partial A} = 0 ∂A∂L(A)=0,得到最优参数为:
A = ( U T ⋅ U ) − 1 ⋅ ( U T ⋅ T ) A= (U ^ T \cdot U)^{-1} \cdot (U ^ T \cdot T) A=(UT⋅U)−1⋅(UT⋅T)
这种求解线性回归参数的⽅法也叫最小⼆乘法。
最小⼆乘法要求矩阵
U
T
⋅
U
U ^ T \cdot U
UT⋅U可逆,即
U
T
⋅
U
U ^ T \cdot U
UT⋅U是满秩的。当
U
T
⋅
U
U ^ T \cdot U
UT⋅U不可逆时可以通过两种⽅法进⾏参数估计,⼀种先使⽤主成分分析等⽅法来预处理数据,消除不同特征之间的相关性,然后再使⽤最小⼆乘法。第⼆种⽅法是使⽤梯度下降法。
梯度下降法
监督学习⼀般靠数据驱动。我们通常收集⼀系列的真实数据,例如多栋房屋的真实售出价格和它们对应的⾯积和房龄。我们希望在这个数据上⾯寻找模型参数来使模型的预测价格与真实价格的误差最小。在机器学习术语⾥,该数据集被称为训练数据集(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
a1⋅X1+...+ad⋅Xd+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=∣∣U⋅A∣∣2
这样的⼀个问题可以通过主成分分析⽅法得到有效解决,我们会单独⽤⼀个部分进⾏讨论。
主成分分析
上⼀节的最小⼆乘法试图找到⼀个与数据具有最佳匹配 ( d − 1 ) (d-1) (d−1)维超平⾯。主成分分析⽅法可⽤于解决这⼀问题的⼴义版本。具体来说,它可以找到任意 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
Σ=P⋅D⋅PT
这⾥的 为对⻆矩阵,对⻆元素为特征值; 为标准正交矩阵,每⼀⾏为对应的特征向量;这些标准正交向量提供了数据应该投影的轴线⽅向。与异常检测相关的主成分分析的主要性质如下:
- 如果前 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=Ri⋅P
在许多涉及⾼维数据集的真实场景中,很⼤⼀部分特征值往往⾮常接近于零。这意味着⼤多数数据都沿着⼀个低维的⼦空间排列。从异常检测的⻆度来看,这是⾮常⽅便的,因为离这些投影⽅向⾮常远的观测值可以被假定为离群值。例如,对于特征值较小(⽅差较小)的特征向量
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的标准化处理。这隐含地导致在主成分分析中使⽤相关矩阵而不是协⽅差矩阵。当然,这个问题并不是线性建模所独有的,对于⼤多数异常检测算法,都需要使⽤这样的预处理。
回归分析的局限性
回归分析作为检测离群值的⼯具有⼀些局限性。这些缺点中最重要的是在本章的⼀开始就讨论了,其中探讨了回归分析的数据特定性质。特别是,为了使回归分析技术有效,数据需要⾼度相关,并沿着低维⼦空间对⻬。当数据不相关,但在某些区域⾼度聚集时,这种⽅法可能不会有效。
另⼀个相关的问题是,数据中的相关性在本质上可能不是全局性的。最近的⼀些分析观察表明,⼦空间相关性是特定于数据的特定位置的。在这种情况下,由主成分分析发现的全局⼦空间对于异常检测是次优的。因此,为了创建更⼀般的局部⼦空间模型,有时将线性模型与邻近模型(在后续章节中讨论)结合起来是有⽤的。这将是⾼维和⼦空间异常检测的主题,将在后续章节详细讨论。
总结
真实数据中,数据不同属性之间往往具有显著的相关性。在这种情况下,线性建模可以提供⼀种有效的⼯具来从底层数据中移除异常值或者进⾏异常检测。对于其他基于因变量回归的应⽤,线性建模是⼀种⼯具,去除异常值对于提⾼此类应⽤的性能是⾮常重要的。在⼤多数情况下,主成分分析提供了去除异常值和进⾏异常检测最有效的⽅法,因为它对存在少数异常值的数据更有鲁棒性。