目录
一、异常事件
1、异常检测
异常检测是指在大量数据中检测出与其他数据不同的数据点或样本,通常被称为“异常值”或“离群值”。异常值可能是因为数据记录错误,或者是由于真实世界中的异常事件或问题导致的。
异常检测是数据挖掘领域中的重要任务之一,它可以应用在许多领域,例如金融、医疗、电力、交通等。在金融领域,异常检测可以用来检测信用卡欺诈、洗钱等;在医疗领域,异常检测可以用来识别病人的异常病情,以及早期预警疾病的发生等。
异常检测算法会查看未标记的正常数据集,从而学会检测异常事件或发出危险信号。
举例说明:
假设使用异常检测来检测正在制造的飞机发动机是否存在问题。在发动机下线之后,可以计算发动机的许多不同特征,假设是测量发动机产生的热量,是测量发动机运行的振动强度。
现在飞机发动机的出故障率是比较低的,因此,如果收集了m个样本示例,得到m个示例的特征,并且其中的大部分是质量完好的发动机。异常检测问题就是,在学习算法看到这m个例子之后,得到飞机发动机一般的特征数据,如产生热量和振动强度的值。此时一个全新的发动机要下线,给出了新的关于和的特征向量。
如果在靠近集群中心的绿色十字处,那么异常检测算法看起来与其他质量完好的发动机示例比较相似。如果在离集群中心较远的右下方绿色十字处,那么看起来与其他质量完好的发动机示例非常不同。
2、密度估计(Density estimation)
密度估计是一种常见的异常检测方法,它是基于密度的离群点检测方法的基础。密度估计的目的是估计数据集中每个数据点或样本的密度值,即一个点附近有多少个点。
基于密度的离群点检测方法的核心思想是,将密度值较低的点定义为异常点。因为密度值较低的点通常意味着该点周围的数据点较少,不符合正常数据的分布规律。因此,密度估计可以用来计算每个数据点或样本的密度值,然后根据密度值来判断数据点是否为异常点。
常见的密度估计算法包括:
-
基于直方图的密度估计:将数据集分成多个区间,计算每个区间中数据点的数量,并将数量除以区间长度作为密度估计值。
-
基于核函数的密度估计:选择一个核函数,例如高斯核函数,然后使用该核函数对每个数据点进行加权,从而得到每个数据点的密度估计值。
-
基于K近邻的密度估计:选择K个最近邻的数据点,计算这些数据点的平均距离作为该数据点的密度估计值。
密度估计可以作为异常检测的基础算法,但在实际应用中可能需要结合其他算法,例如聚类、统计学方法等,来提高异常检测的准确率和效率。
举例说明:
执行异常检测常用的方法是密度估计,当得到m个例子的训练集时,首先为x的概率建立一个模型,也就是,学习算法将尝试找出具有高概率的特征和的值是什么,以及在数据集中出现的可能性较小或概率较低的值是什么。
如上图所表示的,数据越密集的地方概率也就越大,通过建立好的概率模型,当获得新的测试示例时,然后计算的概率,如果的概率小于(我们设置的某个阈值),我们就可以将标记为异常anomaly; 如果的概率大于(我们设置的某个阈值),我们就可以将标记为正常。
二、高斯正态分布
1、定义
高斯正态分布,又称为高斯分布、正态分布,是概率统计学中常见的一种连续概率分布。在自然界和社会科学中,很多现象都可以近似地用正态分布来描述。正态分布的概率密度函数是:
其中,为分布的期望,为分布的标准差。正态分布的特点是呈钟形曲线,关于对称。分布的均值、中位数和众数均相等。
当增大时,曲线会变得越来越平坦;当 减小时,曲线会变得越来越陡峭。正态分布的标准差可以用来衡量数据的离散程度,68% 的数据在均值 加减一个标准差 的范围内,95% 的数据在 加减两个 的范围内。
2、高斯正态分布特性
假设x是一个数字,如果x是一个随机数,也称为随机变量,则x可以取随机值。如果x的概率由具有均值参数 和方差的高斯正态分布给出,这意味着x的概率曲线由上图所示。曲线的中心位置由均值给出,该曲线的高度和宽度由标准差给出,此处的曲线显示了x的概率。
如果从这个概率分布中抽取100个数字,然后按照这100个数字的值绘制直方图,可能会得到如右图所示的直方图。对于任何给定的和的值,如果将此函数绘制成x的函数,则会得到以为中心的钟形曲线,并且该钟形曲线的宽度由参数表示。
高斯分布的特性可以从以下几个方面来描述:
-
对称性:高斯分布相对于其均值 对称。
-
单峰性:高斯分布仅有一个峰值。
-
中心极限定理:在某些情况下,将多个随机变量的和或平均值进行计算所得到的结果,其分布趋近于高斯分布。
-
标准差决定峰度:高斯分布的峰度取决于其标准差 ,当 增大时,曲线变得更加平坦,峰度降低。
-
范围规律:在正态分布中,68% 的数据在均值 加减一个标准差 的范围内,95% 的数据在 加减两个 的范围内,99.7% 的数据在 加减三个 的范围内。由于概率之和为1,所以越小,曲线会变高,保持面积不变。
-
均值和标准差的统计意义:均值 表示分布的中心位置,标准差 可以衡量分布的离散程度,越小表示分布越集中,越大表示分布越分散。
3、高斯正态分布在异常检测中的应用
给定一个包含m个示例的数据集,x只是一个数字。上图是包含11个示例的训练集的图,尝试估计平均参数 以及方差的合适的值。
参数平均值的计算公式
参数方差的计算公式
notes:
关于方差公式中,分母部分图中是除以m,而计算公式是除以m-1,有如下原因。
这是因为样本方差中分母使用 而不是 ,是为了校正样本方差的偏差,并使用样本方差作为总体方差的无偏估计。
在计算样本方差时,使用样本的平均值来代替总体均值是会产生偏差的,因为样本的平均值是从样本中计算得到的,而不是从总体中计算得到的。由于样本平均值通常会比总体均值略微偏低,因此将样本均值用于计算方差将会低估样本方差。为了解决这个问题,我们将分母中的 改为 ,这被称为 Bessel 校正,它可以使样本方差的无偏估计。即使样本数量较大时,使用 作为分母而不是 ,也不会严重影响样本方差,因为样本数量的增加可以缓和偏差问题。
三、异常检测算法
1、定义
异常检测(Anomaly Detection),又称为离群点检测(Outlier Detection)、异常值检测(Abnormality Detection)、异常行为检测(Novelty Detection)等,是指在数据集中,发现与主体(正常)行为显著不同的样本或事件的过程。通常,这些样本或事件被称为异常值、离群点、奇异点等。异常检测算法是一种基于“检查规则”或“学习模型”的技术,旨在识别和分类那些不符合预期的行为模式,并且能够区分这些行为模式与其他正常行为之间的差异,从而检测出异常值。
在异常检测算法中,通常将正常值视为已知的模式,而异常值则与已知的模式显著不同。因此,异常检测主要基于以下两个假设:
-
正常数据的大部分与少数异常数据之间的特征差异显著。
-
异常数据的数量非常少,无法被正常模式所描述。
根据不同的数据类型和应用场景,异常检测算法可以采用不同的技术和方法,包括基于统计学的方法、基于机器学习的方法、基于聚类的方法、基于时间序列的方法等。这些方法中,包括了很多经典算法,例如箱线图、Z-score、K-means算法、局部异常因子(LOF)算法、支持向量机(SVM)等等。不同的算法对于不同的数据分布和特征描述方式有不同的适应性,需要根据具体情况进行选择和调整。
2、举例
假设有一个训练集,其中每个示例x都具有n个特征,即每个示例x都是一个数字向量。对于许多实际的应用程序,n的值可能是数十个甚至数百个。
给定这个训练集,需要做的是进行密度估计,建立一个模型,即估计的概率。x是一个特征向量,其值为,对于特征向量中的第n个特征,将 建模为的概率乘上的概率,直到乘上的概率。意味着特征在统计意义上是相互独立的,事实证明,即使特征实际上不是统计独立的,算法也能正常工作。为了对每个特征的概率建模,使用参数样本均值和方差。
为什么乘以概率,因为计算特征同时发生的状况,需要将每一个特征发生的概率都计算在内,同时发生即同时相乘概率。
选出要使用的n个特征后,为数据集中的n个特征拟合参数均值和方差。参数表示训练集中所有示例的第个特征的均值,参数则是训练集中所有示例的第个特征与均值之间的方差。
当得到一个新示例时,计算,查看大小。如上方提到的,是从到的单个特征概率的乘积。
最后一步是查看是否小于阈值,如果小于阈值,就标记为异常情况。
在这个过程中,每一个特征xj 都在拟合高斯分布,只要有一个特征的概率非常小,那么一乘,它对应的概率P(xj) 也会非常小。
异常检测在算法中所做的是一种系统化的方法来量化这个新示例x具有任何异常大或异常小的特征。
四、开发与评估异常检测系统
1、异常检测系统开发与评估步骤
异常检测系统开发和评估一般分为以下几个步骤:
-
定义异常:首先需要明确系统要检测的异常的类型。例如,对于网络安全领域,异常可能包括非法登录、流量攻击等。
-
收集数据:系统需要收集相应的数据作为训练集和测试集。这些数据可以来自各种来源,例如系统日志、监控数据等。
-
特征工程:根据收集到的数据,需要进行特征工程,提取与异常检测相关的特征。这些特征可以是数值型、类别型、文本型等。
-
选择算法:根据特征的类型和数据量的大小,选择合适的算法进行建模。常用的算法包括基于统计的方法、机器学习、深度学习等。
-
训练模型:使用训练集进行模型训练,调整参数,使其达到最佳状态。训练完成后,需要验证模型的精度和性能。
-
评估模型:使用测试集对模型进行评估,计算模型的精度、召回率、F1值等指标。
-
上线应用:模型训练和评估完成后,需要将其部署到实际应用中。对于大规模系统,需要进行优化和调整,以保证系统的高效性和稳定性。
在开发和评估异常检测系统时,需要注意模型的可解释性和可迁移性问题,以便后续对模型进行调整和优化。
2、构建过程
关键想法,如果你有一种方法来评估一个系统,即使该系统正在开发中,也能够做出决定迅速改进系统。
在开发学习算法时,比如选择不同的特征或尝试不同的参数值(例如 epsilon),决定是否以某种方式更改特征或增加减少 或其他参数,如果有一种评估学习算法的方式,就会容易许多。
这有时被称为实数评估,意思是如果能以某种方式快速更改算法,比如改变一个特征或改变一个参数,并且有一种计算数字的方法可以得知改变后的算法提升了还是下降了,那么该方法可以使关于更改算法的决策是否进行变得容易许多。
也就是说,尽管讨论的是未标记的数据,但是稍微改变一下这个假设,假设有一些标记的数据,通常包括少量以前观察到的异常。比如对经验已知的异常示例,关联一个标签来表示这种异常,对经验已知的正常示例,关联标签。异常检测算法从中学习的训练集仍然是的未标记训练集,将所有这些示例假设为正常的而不是异常的,则。
在实践中,有一些异常的例子可以放入这个训练集中,算法通常可以正常工作。为了评估这个算法,如果有少量的异常示例,那么对于该算法进行实数评估会非常有用。可以创建一个交叉验证集,同样,有一些示例的测试集,其中交叉验证和测试集都希望包含一些异常示例。换句话说,交叉验证集将会有一些的例子,但是也有很多的例子。同样,在实践中,如果有一些示例实际上是异常的,但意外地标记为,则异常检测算法将正常工作。
假设有10000个正常的发动机中提取到了数据,但是还有20个有异常的发动机中提取到了数据。通常异常示例的数量,即 的数量会少很多。
采用此数据集,将其分解为训练集、交叉验证集和测试集。将6000个正常发动机放入训练集(如果有几个异常的示例被塞进集合实际上没问题),然后将2000个正常发动机和10个异常发动机放入交叉验证集,并将2000个正常发动机和10个异常发动机放入测试集。之后在训练集上训练算法,将高斯分布拟合到6000个示例中,然后在交叉验证集上,可以测试算法正确标记出了多少异常示例。可以利用交叉验证集来调整参数阈值 epsilon或添加减去特征,具体取决于算法是否能够可靠地检测到这10个异常示例,而无需从这2000个正常实例中选错太多。在调整参数阈值 epsilon并且可能还添加减去特征之后,可以采用该算法在测试集上进行评估,查看算法检测出了10个异常示例中的多少,以及有多少挑选错误。
notes:
这仍然是一种无监督学习算法,因为训练集实际上并没有标签,或者训练集中示例都假设为标签,因此在训练集中通过拟合高斯分布学习。
事实证明,如果构建一个实用的异常检测系统,使用少量异常来评估交叉验证和测试集对调整算法非常有帮助。由于有缺陷的示例很少,所以还有另一种方法进行异常检测,即不用测试集,只用训练集和交叉验证集。
在这种方法中,在6000个正常示例上进行训练,将剩余的4000个正常示例以及所有异常值放入交叉验证集中。然后调整参数阈值 epsilon或添加减去特征,尽可能地使算法在交叉验证集上表现良好,更极端的是只有两个异常值示例,那么将所有这些都放入交叉验证集将非常有必要。这种代替方法的缺点就是,调整算法之后,没有公平的方法来判断算法在其他真实实例中的表现效果如何,因为没有测试集来验证。但是当数据集很小的时候,特别是有异常的数量很少,这可能是比较好的选择。如果是这种情况,注意存在的更高风险,就是围绕阈值 epsilon做出的一些决策和特征更改会过度拟合交叉训练集。
首先在训练集上拟合模型,然后在交叉验证集和测试集上进行预测。设置阈值 epsilon,如果小于则输出1,表示异常;如果大于 则输出0,表示正常。基于此,可以查看该算法对交叉验证集和测试集上的预测和标签值得匹配准确程度。使用精度验证值来评估模型。
五、异常检测与监督学习对比
1、使用情况
异常检测和监督学习两种方法通常应用于不同的场景。
异常检测通常用于那些有标签数据极少甚至没有标签数据的情况下,目的是检测样本中的异常点或异常行为。这种情况下,我们需要训练算法来识别异常值,并将其分类为正常或异常。
监督学习则适用于已有足够的标签数据以训练模型的情况。在监督学习中,我们假设已经知道了大部分数据的标签,并且我们的目标是使用这些标签来训练模型,以便在未来对新数据进行分类。
因此,当我们有足够的标签数据时,应该优先考虑使用监督学习方法。当数据集缺乏标签数据时,就需要考虑使用异常检测方法。
2、实际分析
当正例数量非常少的时候(0-20个是很常见的),异常检测算法通常更合适,还有尝试为建立模型的相对大量的反例。
的参数是仅从反例中学习到的,并且正例数量十分小,仅在交叉验证集和测试集中用于参数调整和评估。相反的,如果有更多的正例和反例,那么监督学习可能更适用。
但是,虽然只有20个正例,当然也可以应用于监督学习,但事实证明,异常检测看待数据集的方式和监督学习看待数据集的方式截然不同。
主要区别在于,如果有许多不同类型的异常示例那么当飞机发动机有多种不同的故障方式时,异常检测可能更合适。因为只有20个异常发动机无法涵盖所有出故障的方式种类,新的异常示例或许就是从未见过的故障类型。异常检测所做的就是查看正常实例,并且对其特征进行建模,任何偏离其正常特征的都会被标记为异常,其中就包括之前从来没有见到过的错误类型。
相比之下,监督学习有不同看待问题的方式。当理想化的应用监督学习时,有足够多的正例和反例,能够让算法学习到正面例子和反面例子是什么样子的。通过监督学习,通常倾向于假设未来的正例很可能与训练集中的正例类似。
举例说明:
对于识别金融诈骗时,骗子总是尝试不同的方式进行诈骗,意味着不断出现新的诈骗方式。金融诈骗异常检测通常用于检测不同于正常交易的东西。
相比之下,对于查看垃圾邮件检测问题,那么垃圾邮件形式比较雷同,这就是监督学习对垃圾邮件有效的原因,因为系统尝试检测过去可能在训练集中看到的更多类型的垃圾邮件。
通俗理解:
异常检测是学习一种类型的特征,将不同于该类型的所有都排除出来。
监督学习是从所有类型中学习特征之间的区别,将示例分到各种类型族群中。
六、异常检测中的特征选择
在构建异常检测算法的时候,选择合适的特征十分重要。在监督学习中,如果没有完全正确的特征,或者是一些于问题无关的额外特征,通常结果是没问题的,因为该算法必须监督信号,该信号足以标记为什么算法可以挑选和忽略哪些特征,或者如何重新缩放特征并充分利用提供的特征。
但是对于异常检测,只从未标记的数据中学习,算法很难找出要忽略的特征,仔细选择特征对异常检测更重要。
确保所选的特征或多或少是符合高斯分布的,如果特征并不是高斯分布,可以尝试调整一下使其更符合高斯分布。
可以使用Python中的plt.hist命令画出该特征的分布直方图,直观的看到该特征的分布是否大概符合高斯分布,但通常特征的直方图并不是标准的高斯分布样式,像如图左下角所示的样子。如果这种情况,可以考虑是否可以采用此特征x并将其转换成高斯分布的形式。对它进行运算log(x) 可以得到右边的特征,看起来符合高斯分布了,此时用替换x,使用更改后的模型,更有可能很好地拟合数据。
对于并不符合高斯分布的特征,可以尝试对该特征进行适当的数学计算,使其大致符合高斯分布,就可以更好的使用该特征。
注意的是,无论在训练集中对特征进行何种转换,在交叉验证集和测试集上也应该使用相同的转换。
除了确保特征数据近似为高斯分布之外,在训练异常检测算法后,如果在测试集上表现效果不佳,还可以执行异常检测的错误分析过程。换句话说,就是可以在出错的时候尝试查看算法在哪些方面做的不好,然后尝试提出改进。
训练算法的目的是使在正常实例x中大于或等于阈值 epsilon,对于异常示例x,小于阈值 epsilon。当在未标记的数据中训练x的模型时,可能遇到的最常见的问题就是,的值在正常和异常例子上都很大,这就会导致,就是知道一个示例是异常情况,但是它的概率比较大,最后判定还是正常。
通常情况下,尝试查看这个示例,研究是什么特征让算法判断其为正常的,如果可以识别出一些新的特征,新特征有助于将这个例子于正常例子中区分开来,然后添加该新特征,可以帮助提高算法的性能。
总结就是,开发过程中,训练模型然后查看算法未能检测到的交叉验证集中的哪些异常例子,然后查看这些例子,尝试寻找新特征的创建,使算法可以识别这些例子。