【机器学习】无监督学习中的异常检测算法及其原理

系列文章目录


第十五章 Python 机器学习入门之无监督学习算法

目录

系列文章目录

文章目录

一、 什么是异常检测

1 发生异常事件

2 我们怎么可以使用算法来处理这个问题呢?

二、什么是高斯(正态)分布

三、 异常检测算法

四、 开发和评估异常检测系统

五、 异常检测与监督学习对比

六、 选择使用什么特征

总结


一、 什么是异常检测

1 发生异常事件

异常检测算法 finding unusual events 也是比较常用的 无监督算法

异常检测算法查看为标记的正常事件数据集,从而学会检测,如果发现异常事件会发出危险信号。

以检测飞机发动机质量为例,

我们可以计算飞机发动机的许多不同的特征,

假设特征x1 测量发动机产生的热量,特征x2 测量发动机震动强度等…

我们这里就以这两个特征为例,

【机器学习】无监督学习中的异常检测算法及其原理

异常检测问题是,在学习算法学习了足够多的示例后,当新生产的一个发动机后,可以提供异常检测来检测它是否合格。

如图,如果新生产的发动机在两个特征图上数据比较密集的地方,我们通常会觉得它没有问题,如果它在比较偏的位置,如图中下边的点,我们会觉得这个可能会有问题,从而再检查一下这个发动机。

2 我们怎么可以使用算法来处理这个问题呢?

执行异常检测最常见的方法是通过一种称为密度估计的技术,

这也就意味着,当我们得到 一个含有m 个样本的训练集时,我们要做的第一件事就是为x 的概率建立一个模型 P(x)。换句话说,也就是学习算法将尝试找出具有高概率和哪些值在数据集中出现的可能性较小(概率较低)的数据。【机器学习】无监督学习中的异常检测算法及其原理

如图,数据越密集的地方概率也就越大。

我们已经建立了一个概率模型P(X) ,当获得新的测试示例 Xtest时,我们要做的就是计算Xtest 的概率,如果Xtest的概率小于 ε epsilon(我们设置的某个阈值),我们就可以将 Xtest  标记为异常anomaly; 如果Xtest的概率大于 ε epsilon(我们设置的某个阈值),我们就可以将 Xtest  标记为正常。

 

二、什么是高斯(正态)分布

Gaussian normal distribution

在应用异常检测时,我们需要使用高斯分布 Gaussian distribution,也称为正态分布 normal distribution.  也叫做钟形分布 bell-shaped distribution 。

下面来看看什么是正态分布【机器学习】无监督学习中的异常检测算法及其原理

如果x 是一个随机数,有时称为随机变量,使用正态分布来表示x,如图曲线的最高点由x的均值 μ决定,该曲线的标准偏差或宽度由该方差参数σ 决定( sigma)。σ被称为标准差和平方差,这条曲线就显示了P(x) , 因为看起来像钟,所以也叫钟形分布。

如果取100个x ,在图中绘制出概率,可能就会和右边的图一样,连线看起来和左边的很相近。

下面,就是正态分布的公式:【机器学习】无监督学习中的异常检测算法及其原理

来看看改变μ 和σ会对正态分布有什么影响。【机器学习】无监督学习中的异常检测算法及其原理

可以看见,正态分布的图是由μ和σ着两个参数决定的,μ表示中间点,σ表示曲线的宽度,由于概率之和为1,所以σ越小,曲线会变高,保持面积不变。

当我们将正态分布应用在异常检测时,我们要做的也就是计算平均参数 μ和 方差参数σ平方,【机器学习】无监督学习中的异常检测算法及其原理

计算 σ平方 时,除以m 或 m-1 结果都不会有太大的区别,所以我们用的时候,直接除以m 也是可以的。 

三、 异常检测算法

我们知道了可以将正态分布应用在异常检测中,但是只是单个特征,如果我们有多个特征呢,怎么将正态分布应用在异常检测中。

如果我们有 m 个训练示例,如果我们有多个特征,那么每个示例都是一个向量。

在飞机发动机的例子中,我们有两个特征,因此每个示例都是一个二维向量。但实际上使用的使用的时候可能是多个特征,如果有n 个特征,那么示例就是n 维向量。【机器学习】无监督学习中的异常检测算法及其原理

有了数据集,我们想做的是密度估计,这意味着我们将建立一个模型来估计P(x) 概率。

我们需要知道的是 任何给定特征向量的概率是多少?

我们的P(x) 模型将如图所示,X 是一个 特征向量,那么它的概率P(x) 就等于每一个特征的概率相乘。

为什么要将每个特征的概率相乘,这是计算它们同时发生的概率,图中有个例子,如果飞机发动机发热的概率是1/10 , 震动的概率为1/20 ,那么这个发动机既发热又震动的概率就为1/200.

有了上面的基础,我们来看看什么是异常检测算法。【机器学习】无监督学习中的异常检测算法及其原理

第一步是选择,我们认为可能是异常示例的特征 x_i;

第二步, 在提出要使用的特征后,我们将计算参数μ1到μn,σ1平方到σn平方,用于数据集中的n 个特征。

第三步,当有一个新的例子的时候,计算P(x) 并查看它的大小。使用我们设置的阈值epsilon ε,进行比较。

如果小于阈值,则标记为异常。

在这个过程中,每一个特征xj 都在拟合高斯分布,只要有一个特征的概率非常小,那么一乘,它对应的概率P(xj) 也会非常小。

异常检测在算法中所作的是一种系统化的方法来衡量这个新示例 x。

具有任何差异大或差异小的特征。

让我们来看一下这在1个示例中的实际意义。【机器学习】无监督学习中的异常检测算法及其原理

如图,x1 的取值范围比 x2 要大得多,如果我们要计算特征x1 的两个参数,我们最终会得到如图所示的参数。

会计算出两个特征的概率,相乘后会得到一个3维的图,其中高度就是两者的乘积。

如果给了两个测试数据,ε设置为0.02,那么结果如图,很明显第一个测试数据正常,第二个异常。

四、 开发和评估异常检测系统

任何评估算法呢?【机器学习】无监督学习中的异常检测算法及其原理

我们将首先在训练集上拟合P(x) 模型 ,然后在交叉验证数据集上和测试数据集上进行预测。

设置阈值epsilon,如果小于ε 则输出1,表示异常;如果大于ε 则输出0,表示正常。

然后来评估算法的精确性,评估的方法也是统计预测的准确性,使用精确率、召回率、F1-score 等之前学过的方法。八、 倾斜数据集的误差指标(精确率和召回率)

注意:1 这里评估的数据集没有标签,所以还是无监督学习。

2 交叉验证集和测试集中应该都含有异常值,正常情况下交叉验证集和测试集都需要的,但是如果数据较少时,异常值很少,那么我们会只要应该交叉验证集来进行测试。

五、 异常检测与监督学习对比

什么时候使用异常检测 什么时候使用监督学习呢?

当我们的正例数量非常少时异常检测算法通常是更合适的选择。

如只有0-20个正例,相对大量的负样本,来尝试建立P(x) 模型。P(x) 中的参数仅从负样本中学习,正例仅用于交叉验证集和测试集,用于参数调整和评估。

相反,如果我们有大量的正例和负样本监督学习算法通常是更合适的选择。

异常检测与监督学习查看数据集的方式完全不同。【机器学习】无监督学习中的异常检测算法及其原理

主要区别在于,如果我们认为有许多不同类型的明显或许多不同类型的正面例子,像飞机发动机有许多不同的方式发生错误时,异常检测可能更合适。未来的异常可能看起来与我们迄今为止看到的然后异常示例都不一样。

如果我们认为这对我们的问题是正确的,我们使用异常检测算法更好,因为异常检测所做的是查看正常示例,即y = 0 负示例,并尝试对它们的外观进行建模,任何与正常情况有很大差异的东西都会标记为异常,这其中包括是否有一种全新的方式导致飞机发动机出现故障,就算这种方式之前出来没有见过,异常检测也能识别出来。

使用监督学习时,有足够多的正面例子,平均了解正面例子是什么样的。对于监督学习,我们倾向于假设为正例的例子可能与训练集中的正例相似。

如诈骗检测通常使用异常检测算法,因为会出现新的诈骗手段,之前从来没有的;

而检测垃圾邮件问题通常使用监督分类,因为垃圾邮件大多都是类似的。

 

六、 选择使用什么特征

在构建异常检测算法时,选择一个好的特征非常重要。

在监督学习中,如果我们没有一个完全正确的特征也是可以的。

但是在没有标记的数据中学习异常检测,异常检测算法将会更难找出想要忽略的特征。

所以仔细选择特征对异常检测非常重要。

可以帮助异常检测算法的一个步骤是,尝试确保您为其提供的特征尽可能多的是高斯特征,或者说接近高斯分布

如果特征不是高斯特征,我们有时也可以更改它使其变的像高斯特征。

下面来具体看看。【机器学习】无监督学习中的异常检测算法及其原理

如果我们有一个特征X ,我们需要的是像高斯分布的特征,如果它不是这样时,首先考虑是否需要使用它,如果要使用,我们可以对其进行运算,如图左下角的特征,对它进行运算log(x) 可以得到右边的特征,它看起来符合高斯分布了,使用更改后的模型,更有可能很好地拟合数据。

除了使用log(x) , 也可以对其做一些其他变化,例如log(x + 1) 等,让变化后的特征符合高斯分布。

总结一下,如果我们构建异常检测系统时,可以提前看一下特征,如果通过绘制plot( plt.hist() ) 图,如果看起来不像高斯分布,我们可以对其进行转换,尽量的让它更像高斯分布。

除了确保我们的数据近似高斯之外,如果我们训练了异常检测算法后,在验证数据集上效果不佳,我们还可以执行错误分析过程以进行异常检测,换句话说,就是可以在出错的时候尝试查看算法在哪些方面做的不好,然后尝试提出改进。

在异常检测中,我们想要P(x) 很大,对于正常示例X ,概率大于阈值ε;对于异常示例X ,概率小于阈值ε。

当我们从未标记的数据中学习了模型P(x) 时,可能遇到的最常见的问题就是P(x) 的值对于正常或异常的例子来说都是很大,这就会导致,就是知道一个示例是异常情况,但是它的概率比较大,最后判定还是正常。【机器学习】无监督学习中的异常检测算法及其原理

在这种情况下,我们通常可以查看一下这个特例,试着找出是什么特征让我们认为这是一个异常的例子,如果我们可以找到一些新特征,比如x2,这有助于将这个示例和普通示例区分开来。 然后添加这个特征,可以帮助提高算法的性能。

总结

本文主要讲解了一个比较常用的无监督学习算法 异常检测算法 。首先介绍了什么是异常检测;使用高斯分布去处理误差;然后讲解了异常检测的算法以及如何去评估我们建立的异常检测模型的好坏。后面将异常检测和监督学习进行对比,说明了何时使用监督学习何时使用异常检测。最后说了一下异常检测应该使用什么样的特征,以及如何去改变特征等。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年3月4日 下午12:13
下一篇 2023年3月4日 下午12:14

相关推荐