1、问题动机
下图的是直升机的QA测试中的一些指标,x1为热量,x2为震动频率,图中的点都是正常的点,也就是质量合格的,现在给定一个测试数据,如何去判断它是否能够通过质量检验?具体的判定方式是什么?
根据给定的质量合格的数据及集,要想知道 x_test 是不是异常的,相当于计算这个测试数据不属于该组数据的概率大小。我们想要构建的模型,应该能根据该测试数据告诉我们,该测试样本属于这组正常数据的可能性 p(x)。
这种方法称为密度估计,表达如下:
应用举例:
- 通过记录用户的工作信息、访问网页频率、发言频率、打字速度等特征,判断用户是否处于异常区域,如果某个用户被盗号,或者是通过某种程序进行恶意访问,那么系统将会判定为异常行为,然后中止服务或者提醒用户,并且要求用户进行身份认证。许多购物网站都有此功能。
- 工业制造后的QA检验
- 计算机群的监管(大数据中心),为每一个计算机建立特征(CPU是用率,内存消耗,硬盘温度等),实时监控异常的计算机并排查故障。
2、高斯分布
高斯分布表达式
高斯分布概率密度函数:
利用已有的数据来预测总体中的μ和σ^2的计算方法如下:
在大样本条件下,任何分布可以被估计成正态分布(大数定律),根据极大似然估计,估计方差的m应该为 m - 1,这是为了满足无偏估计,但是当样本足够多的时候,m 可被认为等于 m - 1.
3、异常检测的算法实现
- 选择特征,假设有m个样本,特征式n维度的,则X -> (m, n)
- 在列上,求平均值,得到每个维度的平均值u,然后再算出每列,也就是一个维度的方差,sigma^2。
- 对测试样本进行密度估计,算出结果后和阈值 epsilon 进行比较,判断是否小于阈值,如果是则判定为异常点
**下面是一个二维特征 (n = 2) 的例子:**计算出的 p(x) 就是3D图中的高度。
4、评估异常检测
理论:
假设我们有一些带标签的数据,用0表示无异常,1表示异常。
然后用样本中的无异常点,在去除标签后,将其当做训练集,去训练异常检测程序;
接着用有标签的交叉验证集和测试集去验证和测试训练结果的性能(每个集合里面有1也有0)
具体实例:
算法评估过程:
和之前的监督学习评估方式一致,以及评判指标查准率、召回率、F1_sore都保持一致。
在用交叉验证集选取 epsilon 的时候,可以用不同的 epsilon 候选值去计算验证集的F1_score。选取最大的即可。
5、异常检测与监督学习
我们在评估异常检测的时候,使用的也是带有标签的数据,那么为什么不使用逻辑回归或者神经网络等监督学习的方式,使用带有标签的训练集去训练,然后进行验证和测试,而是使用异常检测呢?
它们的使用场景选择如下:
异常检测:
- 非常少量的正向类(异常数据 y = 1,2 ~ 50), 大量的负向类(y = 0,10000)。或者说某一类样本少,因为0,1可以自己标记。
- 存在许多不同种类的异常,根据非常少量的正向类数据来训练算法去学习预测异常是非常难得。
- 未来遇到的异常可能与已掌握的异常、非常的不同。
- 具体例子:欺诈行为检测、生产(例如飞机引擎)、检测数据中心的计算机运行状况等。出现异常的情况可能从来没遇到过,或者说之前的正样本中没有相似的。
监督学习:
- 有大量的正样本和负样本。
- 有足够多的正向类实例,足够用于训练 算法,未来遇到的正向类实例可能与训练集中的非常近似。
- 具体例子:邮件过滤器、天气预报、肿瘤分类。可能有非常相似的样本存在于训练集中。
总结:
通常来说,正样本的数量很少,甚至有时候是0,也就是说,出现了太多没见过的不同的异常类型,那么对于这些问题,通常应该使用的算法就是异常检测算法。
6、特征对数转换处理和构造特征
选择什么特征去实现异常检测算法?如何设计和选择异常检测算法的特征?
对数转换:
当使用的数据X,它的所有样本的同一个特征 x_i ,也就是(m,n)矩阵中列的分布,是非高斯特征分布的时候可以通过对数转化变成近似于高斯的分布
使用注意事项:
- 使用对数函数:x=log(x+c),其中 c 为非负常数;
- 或者 x = x^c,c为 0-1 之间的一个分数,等方法。
- 在python中,通常用np.log1p()函数,log1p就是 log(x+1),可以避免出现负数结果,反向函数就是np.expm1()
异常检测算法的误差分析:
当在一维正态分布下判断不出来是否正确的情况下,如左图,可以构建新的特征,将特征变为2维的,那么就可以判断出来,但是第二个特征的选取一定要有区别性。
具体实例:如何创建新的特征
通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小),例如,在检测数据中心的计算机状况的例子中,我们可以用CPU负载与网络通信量的比例作为一个新的特征,如果该值异常地大,便有可能意味着该服务器是陷入了一些问题中,比如陷入了死循环。
7、多变量高斯分布
参考链接:https://www.cnblogs.com/bingjianing/p/9117330.html
以下是独立不相关的关键部分的截图:
独立不相关的具体的例子:
方差越大,越胖,方差越小,越瘦。
高度相关的具体例子:
从第三个投影看出来,x2随着x1近似于 y = x的线性变化。
改变均值的具体例子:
总结:
描述两个特征变量之间可能存在的正相关,或者负相关的情况,
8、使用多变量高斯分布进行异常检测
**第一步:**计算均值和协方差
**第二步:**计算测试样本的概率值,并判断给出结论
注意: 之前的连乘形式的高斯模型只是多变量高斯模型的一种特殊形式。对应的是协方差只有主对角线元素不为0的情况,此时两者的图像都是一样的,都为轴对称的圆或者椭圆(如第二个图)。如果协方差不仅仅是主对角线有值,那么,多变量高斯分布将是有相关特性的斜着的椭圆(如图一),而原来的累积形式的模型将是轴对称的椭圆!
两个模型的选择使用:
原始连乘模型:
- 使用的较多。对待有相关性的特征的时候需要手动创建新的模型。例如之前的网络流量和计算机内存的使用比例。
- 计算规模较小,适合于n比较大(1000, 100000)的情况。
- 训练集样本个数m可以小一些。
多变量高斯模型:
- 使用较少。可以自动捕获特征之间的相关性。
- 计算成本大,因为要计算协方差的逆矩阵(n,n),代价很大。
- 训练集样本个数m必须大于n,否则协方差矩阵就是不可逆的了,因为它的秩就会小于n。实际使用中,要求m >> n,而n不是很大,就会使用多变量高斯。
注意:如果在拟合模型的时候发现协方差矩阵是不可逆的:检查矩阵的秩和线性相关性
- 注意m >> n
- 存在冗余特征,比如x1 = x2,或者,x3 = x4+x5