利用数值来评价一个异常检测算法的重要性
使用实数评价法很重要,当你用某个算法来开发一个具体的机器学习应用时,你常常需要做出很多决定,如选择什么样的特征等等,如果你能找到如何来评价算法,直接返回一个实数来告诉你算法的好坏,那样你做决定就会更容易一些。如现在有一个特征,要不要将这个特征考虑进来?如果你带上这个特征运行你的算法,再去掉这个特征运行你的算法,得到返回的实数,这个实数直接告诉你加上这个特征算法是变好了还是变坏了,这样你就有一种更简单的算法来确定是否要加上这个特征。
为了更快地开发出一个异常检测系统,那么最好能找到某种评价异常检测系统的方法。
为了能评价一个异常检测系统,假定已有一些带标签的数据,其中有正常的样本也有异常的样本(正常的样本y=0,异常的样本y=1)
对于训练集,我们还是看成无标签的样本,将它们都看成无异常的样本(其中可能有一些有异常的样本被分到训练集中)
定义交叉验证集与测试集,通过这两个集合得到异常检测算法。我们假设交叉验证集与测试集中的样本都是异常的,即测试集里面的样本y=1(表示异常样本)。
具体的例子
有10000个正常的飞机引擎,有20个有问题的飞机引擎,从以往经验来看,无论是制造了多少年的飞机引擎工厂,都会得到大概20个有问题的引擎。对于异常检测典型的应用来说,异常样本的个数通常都是20-50个这样的个数,并且通常我们的正常样本数量要大得多。
我们将数据分成训练集,交叉验证集和测试集,典型的分法是:将10000个好的引擎样本中的6000个放入trainning set中做为无标签的数据(实际都为正常的样本),将剩下的正常的样本中的2000个样本放入交叉验证集中,另2000个样本放入测试集中(正常样本的分配比例是6:2:2);将有异常的20个样本,其中10个放入CV中,另外10个放入Test中。
另一种常见的分配方法(不推荐这样做)是将CV与Test的样本混合起来使用,将剩下的4000个好的样本即做为CV也做Test使用(不推荐这样做)
异常检测算法的推导与评估算法如下:首先我们使用训练样本(虽然都是是无标签的样本但其实都是正常的样本)来拟合模拟p(x)(即参数估计出u,σ的值)
对于CV与Test里面的数据,我们利用算法对y进行预测,然后来评价预测的准确率。如何来度量呢?
因为数据是非常偏斜的(正常的数据多,异常的数据少),因此分类准确率不是一个好的度量方法,算出查准率、召回率以及F1值,通过这些方法来评价我的异常检测算法在CV以及Test中的表现。
怎么决定ε的值呢?在交叉验证集上来决定取什么ε的值,在交叉验证集上尝试多个不同的ε的取值,然后选出一个使得F1值最大的那个ε的值,即在交叉验证集上表现最好的那个ε的值。当我们需要做出决定时(如选哪个特征,选哪个ε的值),我们可以不断地使用交叉验证来评价这个算法的好坏,然后决定我们要选取哪个特征,选哪个ε的值。
当找到ε的值后,我们的异常检测算法就确定了,然后使用Test集来评价算法的表现
总结