如何在数据中识别异常值

Bojan Miletic 提出了一个关于在处理机器学习算法时数据集中异常值检测的问题。

此帖旨在回答他的问题。

如果您对机器学习有疑问,请订阅新闻通讯并通过电子邮件回复或使用联系表格提问,我将回答您的问题,甚至可能会将其变成一篇博客文章。

通过我的新书《机器学习数据准备》**启动您的项目**,其中包括**分步教程**和所有示例的**Python源代码**文件。

让我们开始吧。

异常值

许多机器学习算法对输入数据中属性值的范围和分布很敏感。

输入数据中的异常值可能会使机器学习算法的训练过程产生偏差和误导,从而导致更长的训练时间、更不准确的模型以及最终更差的结果。

Outlier

异常值
图片来自Robert S. Donovan,保留部分权利

即使在训练数据上准备预测模型之前,异常值也可能导致对收集到的数据产生误导性表示和误导性解释。异常值会使描述性统计(如均值和标准差)以及直方图和散点图等图表中的属性值汇总分布产生偏差,从而压缩数据主体。

最后,异常值可以表示与问题相关的数据实例示例,例如欺诈检测和计算机安全案例中的异常。

想开始学习数据准备吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

异常值建模

异常值是远远超出其他观测值的极端值。例如,在正态分布中,异常值可能是分布尾部的值。

识别异常值的过程在数据挖掘和机器学习中有很多名称,例如异常值挖掘、异常值建模、新颖性检测和异常检测。

在他的著作《异常值分析》中,Aggarwal 提供了一个有用的异常值检测方法分类,如下所示:

  • **极端值分析**:确定数据基础分布的统计尾部。例如,对单变量数据使用z分数等统计方法。
  • **概率和统计模型**:根据数据的概率模型确定不太可能的实例。例如,使用期望最大化优化的高斯混合模型。
  • **线性模型**:使用线性相关性将数据建模为低维度的投影方法。例如,主成分分析和具有大残差误差的数据可能是异常值。
  • **基于邻近度的模型**:通过聚类、密度或最近邻分析确定的与数据主体隔离的数据实例。
  • **信息论模型**:异常值被检测为增加数据集复杂性(最小代码长度)的数据实例。
  • **高维异常值检测**:鉴于距离度量在高维度(维度诅咒)中的失效,搜索子空间以查找异常值的方法。

Aggarwal 评论说,异常值模型的可解释性至关重要。需要围绕为什么特定数据实例是或不是异常值的决策提供背景或基本原理。

Irad Ben-Gal 在其为《数据挖掘与知识发现手册》撰写的章节中,提出了单变量或多变量以及参数和非参数的异常值模型分类。这是根据对数据的了解来构造方法的有用方式。例如:

  • 您是否关注一个或多个属性中的异常值(单变量或多变量方法)?
  • 您是否可以假设观察值是从统计分布中抽样的(参数或非参数)?

开始学习

异常值检测有许多方法和大量研究。首先做出一些假设并设计实验,以便您可以清楚地观察这些假设对某些性能或准确性度量的影响。

我建议按照从极端值分析、邻近度方法和投影方法的分步过程进行。

极端值分析

您不需要了解高级统计方法即可从数据中查找、分析和过滤掉异常值。从简单的极端值分析开始。

  • 专注于单变量方法
  • 使用散点图、直方图和箱线图可视化数据,并寻找极端值
  • 假设一个分布(高斯分布),并寻找距离均值超过2或3个标准差或距离第一或第三四分位数1.5倍的值
  • 从训练数据集中过滤掉异常值候选者,并评估模型的性能

邻近度方法

一旦您探索了更简单的极端值方法,请考虑转向基于邻近度的方法。

  • 使用聚类方法识别数据中的自然聚类(例如k-means算法)
  • 识别并标记聚类中心
  • 识别与聚类中心保持固定距离或百分比距离的数据实例
  • 从训练数据集中过滤掉异常值候选者,并评估模型的性能

投影方法

投影方法相对简单,可以快速突出显示无关值。

  • 使用投影方法将数据总结为二维(例如PCA、SOM或Sammon映射)
  • 手动可视化映射并识别异常值
  • 使用投影值或码本向量的邻近度度量来识别异常值
  • 从训练数据集中过滤掉异常值候选者,并评估模型的性能

对异常值鲁棒的方法

另一种策略是转向对异常值鲁棒的模型。存在鲁棒形式的回归,它最小化中位数最小二乘误差而不是均值(所谓的鲁棒回归),但计算量更大。还有像决策树这样的方法,它们对异常值鲁棒。

您可以抽查一些对异常值鲁棒的方法。如果模型准确性有显著提高,那么可能有机会从训练数据中建模和过滤掉异常值。

资源

有许多网页讨论异常值检测,但我建议阅读一本关于该主题的优秀书籍,更权威的书籍。即使查阅机器学习和数据挖掘的入门书籍对您来说也不会那么有用。对于统计学家对异常值的经典处理,请查看:

对于数据挖掘社区对异常值的现代处理,请参阅:

掌握现代数据准备!

Data Preparation for Machine Learning

在几分钟内准备好您的机器学习数据

...只需几行python代码

在我的新电子书中探索如何实现
机器学习数据准备

它提供**自学教程**,并附有关于以下内容的**完整工作代码**:
*特征选择*、*RFE*、*数据清洗*、*数据转换*、*缩放*、*降维*,以及更多...

将现代数据准备技术引入
您的机器学习项目


查看内容

对《如何在数据中识别异常值》的56条回复

  1. Sandeep Karkhanis 2015年2月7日凌晨12:44 #

    很棒的博客,我有几本你的迷你指南,真的很喜欢。
    对于ML和python的新手来说,你的书直接切入正题,帮助我入门……

    几个问题,

    问题1
    您会考虑写一本迷你书,实际展示下面描述的任何或所有方法的实现吗?

    问题2
    假设您有“n”个数值预测变量、数值目标,并且每个预测变量在40-60%的值范围内都有Na/Nan,并且有很多异常值
    那么您会采取什么方法,
    2.1。首先估算Nan
    2.2。然后使用您的异常值函数移除异常值
    还是反过来?

    我尝试在上面的步骤2.1中使用scikit imputer,但没有成功……有什么建议吗?

    https://scikit-learn.cn/stable/modules/generated/sklearn.preprocessing.Imputer.html#sklearn.preprocessing.Imputer

    • Jason Brownlee 2015年2月7日早上6:33 #

      问题1:当然。
      问题2:数据量不大,可能很难了解数据的结构。“许多”和“异常值”不应混为一谈。但是的,你的方法听起来合理。

      可以先尝试手动使用均值、中位数或knn进行估算。

  2. atul 2015年8月20日晚上7:34 #

    嗨,Jason,

    我有一个按月统计的数据,其中相同的月份可以有多个条目。问题是只有某些月份存在异常值,而不是所有月份,但数据量有数百万。此外,无法选择性地移除异常值。
    您建议哪种方法?

    例如,一个出生于1984年的用户在2015年6月购买了10件不同累积价格的商品,这些商品又在下个月,例如2015年7月再次添加。因此他将在6月有10个条目,其中最近的条目应该有最大金额。问题是数据是手动输入的,所以值非常随意。我想为该订阅者选择一个月中最合乎逻辑的值。我们可以直接删除异常值以获得正确的趋势。

  3. Tobi Adeyemi 2017年12月17日凌晨3:50 #

    嗨,Jason,我仍在等待关于异常值检测方法实现的教程。此外,您能否考虑全面讨论时间序列数据中的异常检测。

    谢谢你

  4. Ayush Mandloi 2018年1月4日凌晨12:55 #

    我正在尝试解决Udacity的安然数据集问题,请问我该如何开始。

  5. Toni 2018年1月29日凌晨4:17 #

    你好,
    输出异常值检测是否能提高预测结果?是否需要它,还是只需要输入异常值检测?

    • Jason Brownlee 2018年1月29日早上8:17 #

      这是一个你可以尝试的方法,看看它是否能提升你的特定数据集上的模型技能。

      某些算法可能会表现更好,例如线性方法。

  6. Jesús Martínez 2018年2月11日凌晨3:01 #

    感谢您对异常值检测的见解。它们总是很难处理!

    卷积神经网络和循环神经网络等深度学习算法对异常值是否鲁棒?鉴于深度神经网络最大的优点之一是它们在后台执行自己的特征选择,我很好奇它们是否也能够自己处理异常值。

    提前感谢您的时间!

    • Jason Brownlee 2018年2月11日早上7:57 #

      差不多吧。如果可能的话,干净的数据通常更好。

  7. ratiratana 2018年2月15日上午11:15 #

    感谢您的文章,它让我更清楚地了解了如何在训练数据集中管理异常值的问题。我关注了您博客中的许多主题。您的语言通俗易懂。非常感谢您的贡献。

  8. Ajay verma 2018年3月6日下午1:15 #

    解释得非常好

  9. Alex 2018年3月15日晚上8:04 #

    感谢如此详尽的程序。

    关于异常值问题,根据我在风力涡轮机等真实数据集中的实际经验,被识别为异常值的行往往表示故障,这意味着如果您删除它们,您将删除您想要建模的故障模式(或目标标签)。

    这很奇怪,因为我测试了使用单变量、PCA、去噪自编码器来移除异常值,所有这些实际上都移除了很大一部分故障,这不是我们想要的行为。

    也许这源于风力涡轮机故障预测是一个非常不平衡的问题(通常是98%到1%的故障)。

    现在我正在使用领域专家的方法进行过滤,即专家为每个变量手动定义范围,以排除不可能的值。

    真实的SCADA数据非常嘈杂,因为技术人员会断开传感器,并且他们每年多次在涡轮机上工作,产生许多异常值。此外,还有一些信息压缩和许多缺失数据。

    对于此类问题中的异常值过滤,您有什么建议吗?

  10. sangeetha sivakumar 2018年3月22日晚上6:48 #

    如何查看由于使用异常值函数而被删除的数据

    • Jason Brownlee 2018年3月23日早上6:04 #

      也许您可以在过滤过程中将删除的数据保存起来?

  11. Mohammad 2018年5月24日晚上6:45 #

    感谢您精彩的教程。

    我想知道这些工具是否适用于图像类型数据。假设我有大约10万张用于训练卷积神经网络的图片,这些图片是我自己抓取的。我打算删除一些与我的特定任务无关的图片(异常值)。这些方法是否适用于我的问题?您对从数据集中删除异常值有什么想法吗?

    “使用预训练CNN+聚类进行特征提取”是否适用于我的问题?

    • Jason Brownlee 2018年5月25日早上9:22 #

      非常好的问题。

      我不能确定。也许聚类和距离中心点是一个好的开始。

      查阅文献!

  12. James 2018年6月29日下午3:40 #

    嗨,Jason,

    谢谢分享。我理解异常值实际上是“相对的”。我很少遇到它相对于全局总体的问题,但我是否需要建模异常检测,其中它相对于个人的过去行为?如果我通过聚类来检测异常,我应该如何聚类每个个体,并迭代优化每个个体的正确聚类数量?那需要多少模型?

    被难住了,
    James

    • Jason Brownlee 2018年6月30日早上6:02 #

      詹姆斯,没有最好的方法,我鼓励你集思广益一套方法,并对每种方法进行测试。

      这将帮助你更多地了解问题,并帮助你找到最适合你具体情况的方法和手段。

      此外,请浏览文献以获取更多想法,例如 scholar.google.com。

  13. Ram 2018年7月7日晚上11:19 #

    嗨,Jason,

    感谢分享这篇文章。我一直在处理一个有点不同的数据集,它既不是二元的(0,1)也不是连续的。换句话说,我的CSV文件看起来像这样:
    P1 P2 P3 P4 H
    550 200 35.5 2.5 1.6
    553 195 30.5 2.5 1.6
    552 201 35.5 2.5 -2.6
    array=dataset.values
    X = array[:,0:3]
    Y = array[:,3]
    我正在尝试训练数据集,但遇到了这个错误:raise ValueError(“Unknown label type: %r” % y_type)
    ValueError: 未知标签类型:'continuous'
    我尝试重新缩放数据,但问题仍然存在。您的任何帮助都将不胜感激

    • Jason Brownlee 2018年7月8日早上6:22 #

      尝试从文件中删除标题行?或者在加载时或加载后立即排除它。

  14. Vignesh 2018年11月21日晚上7:18 #

    嗨,Json,

    谢谢你的好文章。我有一个数据集(4万行),其中包含4个分类列(其中两列有超过100个级别,另两列约有20个级别)和1个数值列。如果只有数值列,使用这些建议的方法检测异常会非常容易,但由于有分类变量,我不知道如何选择正确的方法。我尝试过使用Scikit-learn中的Isolation Forest和Local Outlier Factor方法来检测异常,但我不知道它们是如何检测出这些观测值是异常的。(手动查看异常数据点似乎并不异常。)请建议如何解决这个问题。

    • Jason Brownlee 2018年11月22日早上6:22 #

      我没有关于这个主题的材料,我希望将来能涵盖异常检测。

  15. Ajay 2019年1月31日下午4:43 #

    先生,
    异常值是一种独立的机器学习技术吗?

  16. Jaya 2019年7月16日晚上6:19 #

    你好,Jason

    你能告诉我异常值排序的任何应用吗?

  17. Lokesh_jeykar 2019年11月15日晚上5:29 #

    嗨,杰森,

    我有一个关于如何检测具有20个特征的多元数据中的异常值的疑问?
    在不使用PCA的情况下,并且对于数据集相关的领域没有专业知识的人。

    • Jason Brownlee 2019年11月16日早上7:21 #

      也许可以尝试一些异常值检测算法,例如单类别预测?

  18. Omar 2020年1月1日晚上7:01 #

    亲爱的 Jason,

    如果我在使用scikit-learn的Robust Scaler进行缩放后保留数据中的异常值,我注意到异常值的值将大于1。假设我不想删除异常值,因为它是一个重要的数据点。

    神经网络是否可以接受偶尔输入值大于1的情况?

    谢谢你

  19. Abhi 2020年1月16日早上8:40 #

    我有一个每分钟数据和该分钟的用户总数,如何实时检测速率变化,目前我正在使用z分数并与历史数据进行比较,但我收到了很多误报警报。我还想在多元时间序列中实现相同的功能。我的数据如下所示:-

    时间 用户数
    2020-10-11 19:01:00 176,000
    2020-10-11 19:02:00 178,252

    目前我们只在一个数据点上进行此操作,但我们正在考虑添加更多值并进行关联。

    时间 用户数 总登录数 总令牌请求数
    2020-10-11 19:01:00 176,000 5000 52000
    2020-10-11 19:02:00 178,252 5638 53949

    任何链接或指导都会有所帮助。

    祝好

    • Jason Brownlee 2020年1月16日下午1:32 #

      抱歉,我没有时间序列中异常检测的示例。我希望将来能涵盖它。

  20. gayathri 2020年6月27日晚上7:15 #

    嗨,Jason,我正在分享我对识别异常值的看法。如果我有任何错误,请随时纠正我并分享您的想法

    我们需要为所有类型的问题/问题识别异常值吗?不

    1.回归(多少/多少)用例——是
    —–数值输入 – 数值输出 -> 单变量 – 使用极端值分析(散点图、直方图、箱线图)
    —–数值输入 – 数值输出 -> 多变量 – 使用PCA ??

    2.分类用例——否
    —–1.在预测心脏病的情况下,每个患者的病例都很重要,所以我不会致力于识别异常值。我将评估模型的准确性
    —–2.有些算法本身对异常值具有鲁棒性,例如决策树

    3.聚类用例——是
    —–可视化原始数据 – 极端值分析 -散点图矩阵(变量数量较少),热力图?
    —–评估模型,可视化结果并识别异常值 – 基于邻近度的模型
    —–高维聚类 – 高维异常值检测

    4.推荐用例——否(算法是否应该已经对异常值具有鲁棒性?)

    5.文本分析、图像处理——否?

    6.异常检测——显然是,问题陈述本身就要求识别异常/异常值

    注意:我不确定的地方都打了问号

    • Jason Brownlee 2020年6月28日早上5:47 #

      我认为所有数据类型中都可能存在异常值,并且我认为它们是否会影响模型性能并非直观可见。

  21. Lucy 2020年7月2日晚上9:35 #

    嗨,Jason,非常感谢您的文章。

    如果我有80个特征和150万个值的数据,哪种方法(我猜是多变量方法)适合检测异常值?

    • Jason Brownlee 2020年7月3日早上6:15 #

      我建议测试一系列方法,并通过仔细的实验发现最适合您数据集的方法。

      • Lucy 2020年7月3日下午4:32 #

        数据中也有分类变量。我应该将它们包含在多变量异常值检测过程中吗?

  22. Kenneth 2020年7月4日早上8:16 #

    异常值检测和插补,我应该先做哪一个?

    • Jason Brownlee 2020年7月5日早上6:48 #

      很好的问题!

      尝试两种方法,看看哪种能带来最佳性能。

      我可能会先插补,然后再处理异常值。

  23. Tanmay Deshpande 2020年8月14日凌晨4:17 #

    嘿,杰森!

    对于回归问题,如果我有50个输入特征和1个目标变量。
    那么,为了获得良好的回归性能,
    问题1] 我们是否只应考虑消除目标变量的异常值,或者如果它们将用于预测目的,我们是否也应消除其他特征中的异常值?
    问题2] 我们是否应考虑已编码的分类特征的偏度和峰度距离?

    • Jason Brownlee 2020年8月14日早上6:12 #

      这取决于数据和选择的模型。尝试一系列转换,并发现哪个最适合您的项目。

      • Tanmay Deshpande 2020年8月16日凌晨3:07 #

        好的,谢谢!注意安全!

  24. zulaa 2020年12月13日下午4:10 #

    描述识别异常模式的详细过程?

  25. Chandan 2021年3月12日早上5:37 #

    亲爱的 Jason,

    我需要您的建议。我是机器学习领域的新手。

    如何在时间序列数据中找到异常值,其中输入变量为x,输出变量为y。

    假设
    X, Y
    5, 10
    10, 15
    15, 20
    20, 45

    在这种情况下,它必须将第4个案例检测为异常值。

引用/反向链接

  1. 如何在机器学习中找到异常值:手册 - 博客 - 2022年7月26日

    […] 参考:机器学习精通 […]

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。