异常检测(Anomaly Detection)

使用高斯分布探测异常值

假设异常特征之间相互独立且\(x_i \sim N(\mu_i,\sigma_i^2)\),则\(p(x)=\prod{p(x_j;\mu_j,\sigma_j^2)}\)

  1. 选择标识异常的特征\(x_i\);
  2. 学习参数\(\mu_1,…,\mu_n, \sigma_1^2,…,\sigma_n^2\)
  3. 对于测试点\(x\),计算\(p(x)\),若\(p(x)<\epsilon\)则报异常

可使用混淆矩阵评估效果,并使用交叉验证集来选择\(\epsilon\)。

特征选择

一般在选定特征之前会使用直方图描绘一下数据特征,看其是否符合高斯分布。
对于非高斯分布的特征而言,按照经验来说,可以尝试\(log(x+b)\)或者\(x^{1/b}\)是否满足要求。

在理想情况下,我们希望对于正常点来说\(p(x)\)足够大,而对于异常点来说\(p(x)\)足够小;
但是更普遍的情况是\(p(x)\)在正常点和异常点上都很大。在这些情况下我们就要考虑添加更加恰当的特征。
例如在机器状态监控中,选用的异常特征有:

  1. \(x_1=\) 内存占用
  2. \(x_2=\) 磁盘访问
  3. \(x_3=\) CPU负载
  4. \(x_4=\) 网络流量

但\(x_3, x_4\)在异常情况和非异常情况下都有可能极大或者极小,因此可以考虑添加特征:
$$x_5=\frac{CPU负载}{网络流量},\quad x_6=\frac{(CPU负载)^2}{网络流量}$$

异常检测与监督学习

异常检测 监督学习
正例数量非常少(一般0-20) 非常多的正例和负例
负例数量非常多
异常值很“多样”,很难根据现有正例数据学习异常特征 有足够的正例以供学习其特征,将来出现的正例很可能与训练集中已有的某些相似
将来出现的异常可能和现有的异常值完全不同
举例:
诈骗检测 垃圾邮件分类
制造业 (比如飞机引擎) 天气预报 (晴/雨/其它)
数据中心的机器监控 癌症检测