最常用的异常检测方法

简介: 最常用的异常检测方法

1.什么是异常/异常值


2dfc6cd081824faaaf2969616db55722.png

在统计学中,离群值是不属于某个总体的数据点,它是一种与其他值相差甚远的异常观察,是一种与其他结构良好的数据不同的观察值。


例如,您可以清楚地看到列表中的异常值:[20,24,22,19,29,184300,30,18]当观察值只是一组数字并且是一维时,很容易识别它,但是当你有数千个观察值或多维值时,你需要更聪明的方法来检测这些值。


2.异常值的作用


离群点的检测是数据挖掘的核心问题之一。数据的不断扩展和持续增长以及物联网设备的普及,使我们重新思考我们处理异常的方式,以及通过观察这些异常情况可以构建的用例。


我们现在有智能手表和腕带,可以每隔几分钟检测我们的心跳。检测心跳数据中的异常有助于预测心脏病。交通模式的异常有助于预测事故。它还可以用来识别网络基础设施和服务器之间的通信瓶颈。因此,建立在检测异常之上的用例和解决方案是无限的。


我们需要检测异常的另一个原因是,在为机器学习模型准备数据集时,检测所有异常值非常重要,要么去掉它们,要么分析它们,以了解为什么会有异常。

现在,让我们从最简单的方法开始探索5种常见的异常检测方法。


3.异常值检测方法


3.1 标准差


在统计学中,如果一个数据分布近似正态分布,那么大约68%的数据值在平均值的一个标准差内,约95%在两个标准差内,约99.7%在三个标准差内。


因此,如果有任何数据点超过标准偏差的3倍,那么这些点很可能是异常或异常值。


import numpy as np
import matplotlib.pyplot as plt
seed(1)
anomalies=[]
#multiply and add by random numbers to get some real values
data=np.random.randn(50000)*20+20
#Function to Detection Outlier on one-dimentional datasets
def find_anomalies(random_data):
    #set upper and lower limit to 3 standard deviation
    random_data_std=std(random_data)
    random_data_mean=mean(random_data)
    anomaly_cut_off=random_data_std*3
    lower_limit=random_data_mean-anomaly_cut_off
    upper_limit=random_data_mean+anomaly_cut_off
    print(lower_limit)
    #Generate outliers
    for outlier in random_data:
        if outlier > upper_limit or outlier <lower_limit:
    return anomalies


3.2 箱体图


箱体图是通过分位数对数值数据的图形化描述。这是一种非常简单但有效的方法来可视化异常值。把上下胡须(whisker)看作是数据分布的边界。任何显示在胡须上方或下方的数据点都可以被视为异常值或异常值。下面是绘制箱体图的代码:


import seaborn as sns    
import matplotlib.pyplot as plt   
sns.boxplot(data=random_data)


上面的代码显示下面的图。如您所见,它认为高于75或低于-35的所有数据都是异常值。结果与上述方法1非常接近。

箱体图解析


四分位间距(IQR)的概念用于构建箱线图。IQR是统计学中的一个概念,通过将数据集分成四分位数来衡量统计离散度和数据可变性。


简单地说,根据数据的值以及它们与整个数据集的比较,任何数据集或任何一组观测值被划分为四个定义的区间。四分位数将数据分为三个点和四个区间。


90c0b092dda04c5483188be931d571cc.png

四分位间距(IQR)很重要,因为它用于定义异常值。它是第三个四分位数和第一个四分位数之间的差值(IQR=Q3-Q1)。这种情况下的异常值定义为低于(Q1−1.5x IQR)或boxplot下须或以上(Q3+1.5x IQR)或boxplot上须的观测值。

609980db719f49d4b498538a23e2b075.png


3.3 DBScan聚类


DBScan是一种将数据分组的聚类算法。它也可以作为一种基于密度的异常检测方法,无论是单维数据还是多维数据。其他的聚类算法,如k-means 和hierarchal聚类也可以用来检测异常值。在本例中,我将向您展示一个使用DBScan的示例,但是在开始之前,让我们先介绍一些重要的概念。DBScan有三个重要概念:


核心点:为了理解核心点的概念,我们需要关注一些用于定义DBScan作业的超参数。第一个超参数(HP)是min_samples。这只是组成集群所需的最小核心点数量。第二重要的超参数HP是eps。eps是两个样本被视为在同一个聚类之间的最大距离。

边界点与核心点在同一个集群中,但距离集群中心远得多。


dfbc01443d6447ab80f86cd6e0174ccd.png

其他的一切都被称为噪声点,那些是不属于任何簇的数据点。它们可以是异常的或非异常的,需要进一步的研究。现在,让我们看看代码。


from sklearn.cluster import DBSCAN
seed(1)
random_data=np.random.randn(50000,2)*20+20
outlier_detection=DBSCAN(min_samples=2,eps=3)
clusters=outlier_detection.fit_predict(random_data)
list(clusters).count(-1)


以上代码的输出是94。这是噪声点的总数。SKLearn将噪波点标记为(-1)。这种方法的缺点是维数越高,精度就越低。你还需要做一些假设,比如估计eps的确切值,这可能很有挑战性。


3.4 孤立森林


孤立森林是一种无监督学习算法,属于集成决策树家族。这种方法不同于以往的所有方法。之前所有的方法都是试图找到数据的正常区域,然后识别出这个定义区域之外的任何异常值或异常值。


这种方法的效果不同。它显式地隔离异常值,而不是通过为每个数据点分配分数来分析和构造正常点和区域。它利用了一个事实,即异常是少数数据点,并且它们的属性值与正常实例的属性值大不相同。该算法适用于高维数据集,是一种非常有效的异常检测方法。由于本文关注的是实现,而不是技术诀窍,因此我将不再进一步讨论算法的工作原理。此文将详细介绍它的工作原理。

现在,让我们探索一下代码:


from sklearn.ensemble import IsolationForest
import numpy as np
np.random.seed(1)
random_data=np.random.randn(50000,2)*20+20
clf=IsolationForest(behaviour='new',max_samples=100,random_state=1,contamination='auto')
preds=clf.fit_predict(random_data)


此代码将输出数组中每个数据点的预测。如果结果为-1,则表示此特定数据点为异常值。如果结果为1,则表示数据点不是异常值。


3.5 随机森林


随机森林(RCF)算法是亚马逊用于检测异常的无监督算法。它也通过关联异常分数来工作。低分值表示数据点被视为“正常”。高值表示数据中存在异常。“低”和“高”的定义取决于应用,但通常的做法是,分数超过平均分的三个标准差被视为异常。

相关文章
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch基础之网络模块torch.nn中函数和模板类的使用详解(附源码)
PyTorch基础之网络模块torch.nn中函数和模板类的使用详解(附源码)
1357 0
|
12月前
|
机器学习/深度学习 运维 监控
基于特征子空间的高维异常检测:一种高效且可解释的方法
本文探讨了一种替代传统单一检测器的方法,通过构建多个专注于特征子集(子空间)的检测器系统,来提高异常检测的准确性和效率。文章详细介绍了子空间方法在处理高维数据时的优势,包括缓解维度灾难、提高异常检测的可解释性和计算效率。同时,文中还讨论了子空间的选择策略,如基于领域知识、相关性、随机选择等,并介绍了PyOD工具包中实现子空间异常检测的具体方法。通过这些技术,异常检测系统能够更有效地识别数据中的异常记录,尤其是在特征数量众多的情况下。
372 9
基于特征子空间的高维异常检测:一种高效且可解释的方法
|
机器学习/深度学习 算法 数据挖掘
介绍一下如何处理数据不平衡的问题
介绍一下如何处理数据不平衡的问题
818 1
|
机器学习/深度学习 算法 数据可视化
如何在机器学习中检测异常值
如何在机器学习中检测异常值
385 2
|
自然语言处理 API Python
一文告诉你如何用 Python 操作 ChatGPT
一文告诉你如何用 Python 操作 ChatGPT
376 2
|
算法 大数据 Python
局部异常因子(LOF)
局部异常因子(LOF)
成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
|
机器学习/深度学习 运维 算法
【视频】检测异常值的4种方法和R语言时间序列分解异常检测
【视频】检测异常值的4种方法和R语言时间序列分解异常检测
|
数据可视化
如何使用四分位距方法来识别数据中的异常值?
如何使用四分位距方法来识别数据中的异常值?
|
关系型数据库 定位技术 Python
geopandas中拓扑错误的发现诊断与修复
geopandas中拓扑错误的发现诊断与修复
399 6