异常检测(Anomaly Detection)
使用高斯分布探测异常值
假设异常特征之间相互独立且\(x_i \sim N(\mu_i,\sigma_i^2)\),则\(p(x)=\prod{p(x_j;\mu_j,\sigma_j^2)}\)
- 选择标识异常的特征\(x_i\);
- 学习参数\(\mu_1,…,\mu_n, \sigma_1^2,…,\sigma_n^2\)
- 对于测试点\(x\),计算\(p(x)\),若\(p(x)<\epsilon\)则报异常
可使用混淆矩阵评估效果,并使用交叉验证集来选择\(\epsilon\)。
特征选择
一般在选定特征之前会使用直方图描绘一下数据特征,看其是否符合高斯分布。
对于非高斯分布的特征而言,按照经验来说,可以尝试\(log(x+b)\)或者\(x^{1/b}\)是否满足要求。
在理想情况下,我们希望对于正常点来说\(p(x)\)足够大,而对于异常点来说\(p(x)\)足够小;
但是更普遍的情况是\(p(x)\)在正常点和异常点上都很大。在这些情况下我们就要考虑添加更加恰当的特征。
例如在机器状态监控中,选用的异常特征有:
- \(x_1=\) 内存占用
- \(x_2=\) 磁盘访问
- \(x_3=\) CPU负载
- \(x_4=\) 网络流量
但\(x_3, x_4\)在异常情况和非异常情况下都有可能极大或者极小,因此可以考虑添加特征:
$$x_5=\frac{CPU负载}{网络流量},\quad x_6=\frac{(CPU负载)^2}{网络流量}$$
异常检测与监督学习
异常检测 | 监督学习 |
---|---|
正例数量非常少(一般0-20) | 非常多的正例和负例 |
负例数量非常多 | |
异常值很“多样”,很难根据现有正例数据学习异常特征 | 有足够的正例以供学习其特征,将来出现的正例很可能与训练集中已有的某些相似 |
将来出现的异常可能和现有的异常值完全不同 | |
举例: | |
诈骗检测 | 垃圾邮件分类 |
制造业 (比如飞机引擎) | 天气预报 (晴/雨/其它) |
数据中心的机器监控 | 癌症检测 |