Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >学会五种常用异常值检测方法,亡羊补牢不如积谷防饥

学会五种常用异常值检测方法,亡羊补牢不如积谷防饥

作者头像
Ai学习的老章
发布于 2019-07-15 09:30:41
发布于 2019-07-15 09:30:41
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

作者:Will Badr 机器之心编译 参与:韩放、shooting

统计学最全思维导图,值得收藏!

14 幅思维导图 | Python 编程核心知识体系

4 幅思维导图:学会 Python 爬虫

资源|《Python数据分析与数据化运营》PDF高清+数据+代码

什么是异常/离群点?

在统计学中,是并不属于特定族群的数据点,是与其它值相距甚远的异常观测。离群点是一种与其它结构良好的数据不同的观测值。

例如,你可以很清楚地看到这个列表中的离群点:[20,24,22,19,29,18,*4300*,30,18]

当观测值是一堆数字且都是一维时,辨别离群点很容易,但如果有数以千计的观测值或数据是多维的,你可能会需要更机智的方法来检测这些离群点。

我们为什么要关注异常值?

检测离群点或异常值是数据挖掘的核心问题之一。数据的爆发和持续增长以及物联网设备的传播,使我们重新思考处理异常的方式以及通过观察这些异常来构建的应用场景。

我们现在可以通过智能手表和手环每几分钟检测一次心率。检测心率数据中的异常可以帮助预测心脏疾病。交通模式中的异常检测可以帮助预测事故。异常检测还可用于识别网络基础设施和服务器间通信的瓶颈。因此,基于构建的使用场景和解决方案是无限的。

我们需要检测异常的另一个原因是,当为机器学习模型准备数据集时,这一点很重要:检测所有的离群点并解决它们或者第一时间弄清楚为什么会存在这些离群点。

下面,作者将从最简单的方法开始,带领我们探索五种检测异常的常用方法。

方法 1—均方差

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

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

下面看一些代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:
            anomalies.append(outlier)
    return anomalies

find_anomalies(data)

这段代码的输出是一组大于 80 或小于-40 的值。注意,输入的数据集是一维的。接下来,我们探索一些用于多维数据集的更先进方法。

方法 2—箱形图

箱形图是数字数据通过其四分位数形成的图形化描述。这是一种非常简单但有效的可视化离群点的方法。考虑把上下触须作为数据分布的边界。任何高于上触须或低于下触须的数据点都可以认为是离群点或异常值。这里是绘制箱形图的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import seaborn as sns
import matplotlib.pyplot as plt

sns.boxplot(data=random_data)

上述代码绘制了下图。正如你所看到的,任何高于 75 或低于-35 的点都被认为是离群点。结果和上面方法 1 非常接近。

箱形图剖析:

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

简单来说,任何数据集或任意一组观测值都可以根据数据的值以及它们与整个数据集的比较情况被划分为四个确定的间隔。四分位数会将数据分为三个点和四个区间。

四分位间距对定义离群点非常重要。它是第三个四分位数和第一个四分位数的差 (IQR = Q3 -Q1)。在这种情况下,离群点被定义为低于箱形图下触须(或 Q1 − 1.5x IQR)或高于箱形图上触须(或 Q3 + 1.5x IQR)的观测值。

来源:维基百科

方法 3—DBScan 聚类

DBScan 是一种用于把数据聚成组的聚类算法。它同样也被用于单维或多维数据的基于密度的异常检测。其它聚类算法比如 k 均值和层次聚类也可用于检测离群点。在本例中,作者将展示一个使用 DBScan 的示例。在开始之前,需要先了解一些重要的概念:

核心点:为了理解核心点的概念,我们需要访问一些用于定义 DBScan 任务的超参数。第一个超参数是 min_samples。这只是形成簇所需的最小核心点数量。第二个重要的超参数是 eps。eps 可以视为同一个簇中两个样本之间的最大距离。

边界点与核心点位于同一个簇中,但前者距离簇的中心要远得多。

图源:https://stackoverflow.com/questions/34394641/dbscan-clustering-what-happens-when-border-point-of-one-cluster-is-considered

其它任何点都被称作噪声点,它们是不属于任何簇的数据点。它们可能是异常的或非异常的,需要进一步研究。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

方法 4—孤立森林

孤立森林是一种无监督学习算法,属于组合决策树家族。这种方法和以上所有方法都不同。之前的所有方法都在试图寻找数据的常规区域,然后将任何在此定义区域之外的点都视为离群点或异常值。

这种方法的工作方式不同。它明确地隔离异常值, 而不是通过给每个数据点分配一个分数来分析和构造正常的点和区域。它利用了这样一个事实:异常值只是少数,并且它们具有与正常实例非常不同的属性值。

该算法适用于高维数据集,并且被证明是一种非常有效的异常检测方法。由于本文关注的是实现,而不是理论,因此作者不打算进一步讨论算法的工作原理。但是,周志华合著的论文《Isolation Forest》涵盖了其工作方式的全部细节。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
predsfrom 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)
preds

这段代码会输出序列中每个数据点的预测结果。如果结果是-1,说明这个特定数据点是离群点。如果是 1,就说明该数据点不是离群点。

方法 5—Robust Random Cut Forest

Random Cut Forest (RCF) 算法是亚马逊用于异常检测的无监督算法。它也通过关联异常分数来工作。较低的分数值表示数据点点是正常的,较高的分数值则表示数据中存在异常。

「低」和「高」的定义取决于应用,但一般实践表明,超过平均分三个标准差的分数被认为是异常的。算法的细节可以在论文《Robust Random Cut Forest Based Anomaly Detection On Streams》里找到。

这个算法的优点在于它可以处理非常高维的数据。它还可以处理实时流数据(内置 AWS Kinesis Analytics)和离线数据。

作者在下面的视频中更详细地解释了这个概念:

https://youtu.be/yx1vf3uapX8

本文给出了与孤立森林相比的一些性能基准。本文的研究结果表明,RCF 比孤立森林更准确、更快速。

完整的代码可以在这里找到:

https://github.com/awslabs/amazon-sagemaker-examples/tree/master/introduction_to_amazon_algorithms/random_cut_forest

结论

我们生活的世界里数据每秒钟都在增长。如果使用不当,数据会随着时间而贬值。在在线数据流或离线数据集中发现异常对于识别业务中的问题,主动构建解决方案以在问题发生之前发现问题,甚至在探索性数据分析(EDA)阶段为 ML 准备数据集都至关重要。

原文链接:https://towardsdatascience.com/5-ways-to-detect-outliers-that-every-data-scientist-should-know-python-code-70a54335a623

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
学会五种常用异常值检测方法,亡羊补牢不如积谷防饥
在统计学中,离群点是并不属于特定族群的数据点,是与其它值相距甚远的异常观测。离群点是一种与其它结构良好的数据不同的观测值。
机器之心
2019/07/12
8760
学会五种常用异常值检测方法,亡羊补牢不如积谷防饥
14种异常检测方法汇总(附代码)!
今天给大家分享一篇关于异常检测的文章,重点介绍了14种公开网络上一些常见的异常检测方法(附资料来源和代码)。
小白学视觉
2022/12/27
2.9K0
14种异常检测方法汇总(附代码)!
一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵
异常值是偏离数据集中大多数样本点的数据点。出现异常值的原因有很多,例如自然偏差、欺诈活动、人为或系统错误。不过,在我们进行任何统计分析或训练机器学习模型之前,对数据检测和识别异常值都是必不可少的,这个预处理的过程会影响最后的效果。
ShowMeAI
2022/11/29
4.1K0
一文读懂!异常检测全攻略!从统计方法到机器学习 ⛵
时序预测竞赛之异常检测算法综述
本文将介绍在时间序列预测相关问题中常见的异常检测算法,可以很大程度上帮助改善最终预测效果。
Coggle数据科学
2022/05/05
1.3K0
时序预测竞赛之异常检测算法综述
【异常检测】孤立森林(Isolation Forest)算法简介
  工作的过程中经常会遇到这样一个问题,在构建模型训练数据时,我们很难保证训练数据的纯净度,数据中往往会参杂很多被错误标记的脏数据,而数据的质量决定了最终模型性能的好坏。如果进行人工二次标记,成本会很高,我们希望能使用一种无监督算法帮我们做这件事,异常检测算法可以在一定程度上解决这个问题。
10JQKA
2020/05/21
12.9K0
独家 | 每个数据科学家应该知道的五种检测异常值的方法(附Python代码)
作者:Will Badr 翻译:顾伟嵩校对:欧阳锦 本文约1600字,建议阅读5分钟本文介绍了数据科学家必备的五种检测异常值的方法。
数据派THU
2021/07/16
7.3K0
收藏!14 种异常检测方法总结
来源:宅码本文约7800字,建议阅读10分钟本文收集整理了公开网络上一些常见的异常检测方法(附资料来源和代码)。 本文收集整理了公开网络上一些常见的异常检测方法(附资料来源和代码)。不足之处,还望批评指正。 一、基于分布的方法 1. 3sigma 基于正态分布,3sigma准则认为超过3sigma的数据为异常点。 图1: 3sigma def three_sigma(s):     mu, std = np.mean(s), np.std(s)     lower, upper = mu-3*std
数据派THU
2022/06/29
1.2K0
收藏!14 种异常检测方法总结
总结了14种数据异常值检验的方法!
来源:宅码本文约7100字,建议阅读10+分钟本文收集整理了公开网络上一些常见的异常检测方法(附资料来源和代码)。 一、基于分布的方法 1. 3sigma 基于正态分布,3sigma准则认为超过3sigma的数据为异常点。 图1: 3sigma def three_sigma(s): mu, std = np.mean(s), np.std(s) lower, upper = mu-3*std, mu+3*std return lower, upper ‍ 2. Z-sco
数据派THU
2022/09/19
1.1K0
总结了14种数据异常值检验的方法!
四种检测异常值的常用技术简述
在训练机器学习算法或应用统计技术时,错误值或异常值可能是一个严重的问题,它们通常会造成测量误差或异常系统条件的结果,因此不具有描述底层系统的特征。实际上,最佳做法是在进行下一步分析之前,就应该进行异常值去除处理。 在某些情况下,异常值可以提供有关整个系统中局部异常的信息;因此,检测异常值是一个有价值的过程,因为在这个工程中,可以提供有关数据集的附加信息。 目前有许多技术可以检测异常值,并且可以自主选择是否从数据集中删除。在这篇博文中,将展示KNIME分析平台中四种最常用的异常值检测的技术。
用户3578099
2019/08/15
1.6K0
使用孤立森林进行异常检测
异常检测是对罕见的观测数据进行识别,这些观测数据具有与其他数据点截然不同的极值。这类的数据被称为异常值,需要被试别和区分。造成这些异常现象的原因有很多:数据的可变性、数据收集过程中获得的错误,或者发生了一些新的、罕见的情况。
deephub
2021/04/16
2.7K0
异常点检测算法
在进行机器学习建模之前,首先要对数据中存在的异常点样本进行过滤,异常点,也叫做离群点,对数据的归一化,以及后续建模的准确性都会造成影响。因此,必须先去除异常点,常用的有以下3种策略
生信修炼手册
2021/04/29
9420
异常点检测算法
五种常用异常检测方法
在统计学中,异常值是指不属于某一特定群体的数据点。它是一个与其他数值大不相同的异常观测值,与良好构成的数据组相背离。
为为为什么
2023/07/20
1.8K0
五种常用异常检测方法
时间序列异常检测的方法总结
时间序列数据是按一定时间间隔记录的一系列观测结果。它经常在金融、天气预报、股票市场分析等各个领域遇到。分析时间序列数据可以提供有价值的见解,并有助于做出明智的决策。
算法进阶
2023/08/28
1.8K0
时间序列异常检测的方法总结
异常检测怎么做,试试孤立随机森林算法(附代码)
从银行欺诈到预防性的机器维护,异常检测是机器学习中非常有效且普遍的应用。在该任务中,孤立森林算法是简单而有效的选择。
用户8949263
2022/05/25
1.2K0
异常检测怎么做,试试孤立随机森林算法(附代码)
Pandas数据应用:异常检测
在数据分析中,异常检测是一项重要的任务。异常值(也称为离群点)是指与大多数观测值显著不同的数据点。这些异常值可能会影响分析结果的准确性,甚至导致错误结论。Pandas 是 Python 中用于数据分析的强大库,提供了多种方法来检测和处理异常值。本文将由浅入深地介绍常见的异常检测问题、常见报错及如何避免或解决这些问题,并通过代码案例进行解释。
Jimaks
2025/01/06
3100
14种数据异常值检验的方法!
来源:宅码 作者:AI 本文收集整理了公开网络上一些常见的异常检测方法(附资料来源和代码)。不足之处,还望批评指正。 一、基于分布的方法 1. 3sigma 基于正态分布,3sigma准则认为超过3sigma的数据为异常点。 图1: 3sigma def three_sigma(s):    mu, std = np.mean(s), np.std(s)    lower, upper = mu-3*std, mu+3*std    return lower, upper 2. Z-score
张俊红
2022/05/30
1.7K0
14种数据异常值检验的方法!
【Python数据分析基础】: 异常值检测和处理
在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些在这些性质上表现完全与整体样本不一致的点,我们就称其为异常点,通常异常点在预测问题中是不受开发者欢迎的,因为预测问题通产关注的是整体样本的性质,而异常点的生成机制与整体样本完全不一致,如果算法对异常点敏感,那么生成的模型并不能对整体样本有一个较好的表达,从而预测也会不准确。
Python数据科学
2018/08/14
3.5K0
【Python数据分析基础】: 异常值检测和处理
异常值检测!最佳统计方法实践(代码实现)!⛵
异常值是距离其他数据值太远的数据点,也被称为离群点。它可能是自然发生的,也可能是由于测量不准确、拼写错误或系统故障造成的。异常值也可能出现在倾斜数据中,这些类型的异常值被认为是自然异常值。
ShowMeAI
2022/11/23
2K4
异常值检测!最佳统计方法实践(代码实现)!⛵
深入探索:使用Scikit-learn进行新颖性与异常值检测技术
在数据分析和机器学习中,区分数据中的正常观察值和异常观察值是一项重要任务。这种区分通常用于数据清洗和异常检测,以提高模型的准确性和鲁棒性。
用户3578099
2024/08/27
4330
深入探索:使用Scikit-learn进行新颖性与异常值检测技术
【Scikit-Learn 中文文档】新异类和异常值检测 - 无监督学习 - 用户指南 | ApacheCN
中文文档: http://sklearn.apachecn.org/cn/stable/modules/outlier_detection.html 英文文档: http://sklearn.apachecn.org/en/stable/modules/outlier_detection.html 官方文档: http://scikit-learn.org/stable/ GitHub: https://github.com/apachecn/scikit-learn-doc-zh(觉得不错麻烦给个
片刻
2018/03/12
2.6K0
【Scikit-Learn 中文文档】新异类和异常值检测 - 无监督学习 - 用户指南 | ApacheCN
推荐阅读
相关推荐
学会五种常用异常值检测方法,亡羊补牢不如积谷防饥
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验