Machine Learning第九讲[异常检测] --(二)创建一个异常检测系统
内容来自Andrew老师课程Machine Learning的第九章内容的Building an Anomaly Detection System部分。
一、Developing and Evaluating an Anomaly Detection System(异常检测系统的衡量指标)
- 训练集:使用6000个正常的引擎(y=0)
- 交叉验证集:使用2000个正常的引擎(y=0),10个异常的引擎(y=1)
- 测试集:使用2000个正常的引擎(y=0),10个异常的引擎(y=1)
- 训练集:使用6000个正常的引擎(y=0)
- 交叉验证集:使用4000个正常的引擎(y=0),10个异常的引擎(y=1)
- 测试集:使用4000个正常的引擎(y=0),10个异常的引擎(y=1)
- True Positive, False Positive, False Negative, True Negative
- Precision/Recall
- F1-score
二、Anomaly Detection vs. Supervised Learning(异常检测 vs. 监督学习)
我们应该什么时候使用异常检测,什么使用监督学习呢?
异常检测 | 监督学习 |
(1)正样本(y=1)(正样本的数量一般是0-20,也可能是50)的数量比较少(very small)--可以将这些正样本存为交叉验证集和测试集 负样本(y=0)的数量有很多(large)--用大部分的负样本训练模型,因此只要有足够的负样本,便可以很好地拟合数据 (2)异常检测有很多种类型,我们很难从数目较多的正样本中学习出模型来预测未知的样本,因为未知的样本异常的原因可能多种多样,而且可能是之前没有见过的类型。(以飞机引擎为例,异常可能有很多种原因,可能是一个零件的损坏,也可能是全部零件的损坏) |
(1)正样本和负样本的数目都很多。 (2)有足够数目的正样本用来训练模型,而且未来需要预测的样本和模型中训练样本较为相似,这种情况需要使用监督学习算法。(可能我们会觉得垃圾邮件的例子也很很多分类,那为什么不适用异常检测而使用监督学习呢?因为虽然垃圾邮件的类型有很多,但是我们垃圾邮件的训练样本也有很多,因此使用监督学习算法) |
实践中,异常检测和监督学习的例子有哪些?
异常检测 | 监督学习 |
|
|
三、Choosing What Features to Use(如何选择特征?)
首先,如果根据特征画出来的图形和高斯分布的图形相差比较大,则我们需要对特征做一些处理,使得图形与高斯分布的图形相似,这样能够提高预测准确率,具体如下图:
上面的图形与高斯分布的图形很类似,所以我们不需要处理,而对于下面的图形,因其与高斯分布图形相差太大,所以我们需要处理,可以使用log,或者开平方等函数。
将图形变成高斯分布之后,有利用我们进行预测,那我们应该怎么进行异常检测中的错误分析呢?
- 我们期望对于normal的样本,p(x)的值大一些,对于anomalous的样本,p(x)的值小一些
- 但是,大多数的情况是:无论是对于normal的样本还是anomalous的样本,p(x)都很大或者都很小
面对这种情况,我们需要找出那些预测错误的样本(无论是normal还是anomalous),找出其共有特征,看看是否可以提取出一些新特征来提高预测准确率,来看下面的例子:
左图是原始的图形,它只包含一个特征x1,其中A点是一个异常点,但是A点对应的p(x)还是比较大的,因此在预测的时候它是被错误预测的,即预测值y=0,将其预测为normal,但是其是anomalous的。我们分析之后发现其有一个特征x2,因为我们加入特征x2,加入x2之后,所有样本的分布图如右图,这时候,可能红圈之内的样本被预测为normal,红圈之外的样本被预测为anomalous,因此在含有2个特征的情况下,这个异常样本是可以被检测出来的,这样也就提高了预测的准确率。
再举一个数据中心检测的例子:
我们在选择特征时,需要会选择那些取值不是很大也不是很小的特征,比如:
- x1 = memory use of computer
- x2 = number of disk accesses/sec
- x3 = CPU load
- x4 = network traffic
我们将下来想知道哪些地方出现问题了,我认为CPU load和network traffic应该互为线性关系,在程序运行的过程中,发现有一组数据CPU load和network traffic都很大,但是怀疑一种情形:在执行的过程中,计算机进入了死循环,因此被卡住了,因此CPU load升高,但是network traffic没有变化,在这种情况下,要检测出异常,我可以新增新的特征:x5 = (CPU load)/(network traffic)或者x6 = (CPU load)^2/(network traffic),这样,若network traffic不变,而CPU load变大,x5或者x6就会出现异常,以便检测。