天池学习第一阶段–异常检测概述
异常检测(Outlier Detection),顾名思义,是识别与正常数据不同的数据,与预期行为差异大的数据。
识别如信用卡欺诈,工业生产异常,网络流里的异常(网络侵入)等问题,针对的是少数的事件。
异常的类别
点类别
指的是少数个体实例是异常的,大多数个体实例是正常的,例如正常人与病人的健康指标;
上下文异常
又称上下文异常,指的是在特定情境下个体实例是异常的,在其他情境下都是正常的,例如在特定时间下的温度突然上升或下降,在特定场景中的快速信用卡交易
群体异常
指的是在群体集合中的个体实例出现异常的情况,而该个体实例自身可能不是异常,例如社交网络中虚假账号形成的集合作为群体异常子集,但子集中的个体节点可能与真实账号一样正常。
异常检测任务分类
同机器学习 分为 有监督无监督半监督
常用检测方法
基于统计学的方法
异常检测的统计学方法的一般思想是:学习一个拟合给定数据集的生成模型,然后识别该模型低概率区域中的对象,把它们作为异常点。
假定输入数据集为
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
m
)
{x^{(1)}, x^{(2)}, ..., x^{(m)}}
x(1),x(2),...,x(m)数据集中的样本服从正态分布,即
x
(
i
)
∼
N
(
μ
,
σ
2
)
x^{(i)}\sim N(\mu, \sigma^2)
x(i)∼N(μ,σ2),我们可以根据样本求出参数
μ
\mu
μ和
σ
\sigma
σ。
μ = 1 m ∑ i = 1 m x ( i ) \mu=\frac 1m\sum_{i=1}^m x^{(i)} μ=m1∑i=1mx(i)
σ 2 = 1 m ∑ i = 1 m ( x ( i ) − μ ) 2 \sigma^2=\frac 1m\sum_{i=1}^m (x^{(i)}-\mu)^2 σ2=m1∑i=1m(x(i)−μ)2
线性模型
典型的如PCA方法,Principle Component Analysis是主成分分析,简称PCA。它的应用场景是对数据集进行降维。降维后的数据能够最大程度地保留原始数据的特征(以数据协方差为衡量标准)。 PCA的原理是通过构造一个新的特征空间,把原数据映射到这个新的低维空间里。PCA可以提高数据的计算性能,并且缓解"高维灾难"。
基于相似度的方法
这类算法适用于数据点的聚集程度高、离群点较少的情况。同时,因为相似度算法通常需要对每一个数据分别进行相应计算,所以这类算法通常计算量大,不太适用于数据量大、维度高的数据。
基于相似度的检测方法大致可以分为三类:
基于集群(簇)的检测,如DBSCAN等聚类算法。
聚类算法是将数据点划分为一个个相对密集的“簇”,而那些不能被归为某个簇的点,则被视作离群点。这类算法对簇个数的选择高度敏感,数量选择不当可能造成较多正常值被划为离群点或成小簇的离群点被归为正常。因此对于每一个数据集需要设置特定的参数,才可以保证聚类的效果,在数据集之间的通用性较差。聚类的主要目的通常是为了寻找成簇的数据,而将异常值和噪声一同作为无价值的数据而忽略或丢弃,在专门的异常点检测中使用较少。
聚类算法的优缺点:
(1)能够较好发现小簇的异常;
(2)通常用于簇的发现,而对异常值采取丢弃处理,对异常值的处理不够友好;
(3)产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性;
(4)聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大。
基于距离的度量,如k近邻算法。
k近邻算法的基本思路是对每一个点,计算其与最近k个相邻点的距离,通过距离的大小来判断它是否为离群点。在这里,离群距离大小对k的取值高度敏感。如果k太小(例如1),则少量的邻近离群点可能导致较低的离群点得分;如果k太大,则点数少于k的簇中所有的对象可能都成了离群点。为了使模型更加稳定,距离值的计算通常使用k个最近邻的平均距离。
k近邻算法的优缺点:
(1)简单;
(2)基于邻近度的方法需要O(m2)时间,大数据集不适用;
(3)对参数的选择敏感;
(4)不能处理具有不同密度区域的数据集,因为它使用全局阈值,不能考虑这种密度的变化。
基于密度的度量,如LOF(局部离群因子)算法。
局部离群因子(LOF)算法与k近邻类似,不同的是它以相对于其邻居的局部密度偏差而不是距离来进行度量。它将相邻点之间的距离进一步转化为“邻域”,从而得到邻域中点的数量(即密度),认为密度远低于其邻居的样本为异常值。
LOF(局部离群因子)算法的优缺点:
(1)给出了对离群度的定量度量;
(2)能够很好地处理不同密度区域的数据;
(3)对参数的选择敏感。
练习
学习pyod库基本操作
通过文档对pyodf库进行安装并进行实例操作
上图表示安装成功
执行实例结果如下图 环境是 jupyter notebook
通过此次学习 ,初步了解了异常检测的内容,也对pyod库的使用有了较好的认识。