如何处理带有异常值的数据以进行机器学习

当数值输入变量被缩放到标准范围时,许多机器学习算法表现更好。

这包括使用输入加权和的算法,如线性回归,以及使用距离度量的算法,如 k 近邻。

标准化是一种流行的缩放技术,它通过从值中减去均值并除以标准差来完成,将输入变量的概率分布转换为标准高斯分布(均值为零,方差为一)。如果输入变量包含异常值,标准化可能会变得偏差过大或有偏。

为了克服这个问题,在标准化数值输入变量时可以使用中位数和四分位距,这通常被称为稳健缩放。

在本教程中,您将了解如何使用稳健缩放器变换来标准化分类和回归的数值输入变量。

完成本教程后,您将了解:

  • 许多机器学习算法在数值输入变量被缩放时会表现得更好,或者更喜欢被缩放。
  • 可以使用基于百分位数的稳健缩放技术来缩放包含异常值的数值输入变量。
  • 如何使用 RobustScaler 通过中位数和四分位距缩放数值输入变量。

快速开始您的项目,阅读我的新书 机器学习数据准备,其中包含分步教程和所有示例的Python源代码文件。

让我们开始吧。

How to Use Robust Scaler Transforms for Machine Learning

如何为机器学习使用稳健缩放器变换
照片作者:Ray in Manila,保留部分权利。

教程概述

本教程分为五个部分;它们是:

  1. 数据缩放
  2. 稳健缩放器变换
  3. 声纳数据集
  4. IQR 稳健缩放器变换
  5. 探索稳健缩放器范围

稳健缩放数据

在拟合机器学习模型之前,通常需要对数据进行缩放。

这是因为数据通常包含许多不同的输入变量或特征(列),并且每一列可能有不同的值范围或测量单位,例如英尺、英里、公斤、美元等。

如果存在一些输入变量的值相对于其他输入变量非常大,这些大值可能会主导或扭曲某些机器学习算法。结果是算法将大部分注意力放在大值上,而忽略了值较小的变量。

这包括使用加权输入和的算法,如线性回归、逻辑回归和人工神经网络,以及使用示例之间距离度量的算法,如 K 近邻和支持向量机。

因此,将输入变量缩放到通用范围作为数据准备技术,在拟合模型之前是正常的。

一种数据缩放方法包括计算每个变量的均值和标准差,并使用这些值将值缩放到均值为零、标准差为一,即所谓的“标准正态”概率分布。此过程称为标准化,当输入变量具有高斯概率分布时最有用。

标准化是通过减去均值并除以标准差来计算的。

  • 值 = (值 – 均值) / 标准差

有时输入变量可能包含异常值。这些是分布边缘的值,其发生概率可能很低,但由于某种原因却被过度表示。异常值会扭曲概率分布,并使使用标准化的数据缩放变得困难,因为计算出的均值和标准差会因异常值的存在而发生偏差。

在存在异常值的情况下标准化输入变量的一种方法是从均值和标准差的计算中忽略异常值,然后使用计算出的值来缩放变量。

这称为稳健标准化或稳健数据缩放

这可以通过计算中位数(第 50 百分位数)以及第 25 和第 75 百分位数来实现。然后,每个变量的值减去其各自的中位数,并除以四分位距(IQR),即第 75 和第 25 百分位数之间的差值。

  • 值 = (值 – 中位数) / (p75 – p25)

生成的变量的均值和中位数为零,标准差为 1,但不受异常值影响,异常值仍然保留与其他值的相对关系。

想开始学习数据准备吗?

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

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

稳健缩放器变换

通过 scikit-learn Python 机器学习库中的 RobustScaler 类 可用稳健缩放器变换。

with_centering” 参数控制值是否居中到零(减去中位数),默认为 True

with_scaling” 参数控制值是否缩放到 IQR(标准差设为一)或不缩放,默认为 True

有趣的是,缩放范围的定义可以通过“quantile_range”参数指定。它接受一个介于 0 和 100 之间的整数元组,默认值为 IQR 的百分位数,具体为 (25, 75)。更改此值将改变异常值的定义和缩放的范围。

我们将更详细地了解如何在真实数据集上使用稳健缩放器变换。

首先,让我们介绍一个真实数据集。

声纳数据集

声纳数据集是用于二元分类的标准机器学习数据集。

它涉及 60 个实值输入和一个二类目标变量。数据集中有 208 个示例,并且类别相当平衡。

基线分类算法在使用重复分层 10 折交叉验证时,分类准确率约为 53.4%。在此数据集上的最佳性能(使用重复分层 10 折交叉验证)约为 88%。

数据集描述了岩石或模拟地雷的雷达回波。

您可以从这里了解更多关于数据集的信息

无需下载数据集;我们将从我们的示例中自动下载它。

首先,让我们加载并总结数据集。完整的示例列在下面。

运行示例首先总结加载数据集的形状。

这证实了 60 个输入变量、一个输出变量和 208 行数据。

提供了输入变量的统计摘要,显示值是数值,大约在 0 到 1 之间。

最后,为每个输入变量创建了一个直方图。

如果我们忽略图表的杂乱,只关注直方图本身,我们可以看到许多变量具有偏斜分布。

该数据集为使用稳健缩放器变换来标准化数据(在存在偏斜分布和异常值的情况下)提供了一个很好的候选。

Histogram Plots of Input Variables for the Sonar Binary Classification Dataset

声纳二元分类数据集输入变量的直方图图

接下来,让我们在原始数据集上拟合和评估一个机器学习模型。

我们将使用具有默认超参数的 K 近邻算法,并使用重复分层 K 折交叉验证对其进行评估。完整的示例列示如下。

运行示例评估 KNN 模型在原始声纳数据集上的性能。

我们可以看到,该模型实现了大约 79.7% 的平均分类准确率,这表明它具有技能(优于 53.4%),并且接近良好性能(88%)。

接下来,让我们探索一下对数据集进行稳健缩放变换。

IQR 稳健缩放器变换

我们可以直接将稳健缩放器应用于 Sonar 数据集。

我们将使用默认配置并按 IQR 缩放值。首先,使用默认超参数定义一个 RobustScaler 实例。定义后,我们可以调用 fit_transform() 函数并将其应用于我们的数据集,以创建数据集的量化变换版本。

让我们在声纳数据集上尝试一下。

Sonar 数据集的稳健缩放变换的完整示例以及结果直方图如下所示。

运行示例首先报告每个输入变量的摘要。

我们可以看到分布已被调整。中位数现在为零,标准差现在接近 1.0。

变量的直方图被绘制出来,尽管分布看起来与前一节中看到的原始分布差别不大。

Histogram Plots of Robust Scaler Transformed Input Variables for the Sonar Dataset

Sonar 数据集稳健缩放变换后的输入变量直方图

接下来,让我们评估与上一节相同的 KNN 模型,但在本例中是针对数据集的稳健缩放变换。

完整的示例如下所示。

注意:您的结果可能因算法或评估程序的随机性,或数值精度的差异而异。请考虑运行示例几次并比较平均结果。

运行该示例,我们可以看到稳健缩放变换使性能从没有变换时的 79.7% 准确率提升到有变换时的约 81.9%。

接下来,让我们探讨不同缩放范围的影响。

探索稳健缩放器范围

用于缩放每个变量的范围默认选择为 IQR,它由第 25 和第 75 百分位数界定。

这通过“quantile_range”参数指定为一个元组。

可以指定其他值,并且可能会提高模型的性能,例如更宽的范围,允许更少的值被视为异常值,或者更窄的范围,允许更多值被视为异常值。

下面的示例探索了从第 1 个到第 99 个百分位数到第 30 个到第 70 个百分位数的不同范围定义的效果。

完整的示例如下所示。

运行示例报告了每个值定义的 IQR 范围的平均分类准确率。

注意:您的结果可能因算法或评估程序的随机性,或数值精度的差异而异。请考虑运行示例几次并比较平均结果。

我们可以看到,默认的第 25 至第 75 百分位数达到了最佳结果,尽管 20-80 和 30-70 的值也取得了非常相似的结果。

创建箱线图来总结每个 IQR 范围的分类准确率得分。

我们可以看到,在第 25-75 和第 30-70 百分位数的较大范围内,分布和平均准确率有显著差异。

Histogram Plots of Robust Scaler Transformed Input Variables for the Sonar Dataset

Sonar 数据集上 KNN 分类准确率与稳健缩放器 IQR 范围的箱线图

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

教程

API

文章

总结

在本教程中,您了解了如何使用稳健缩放器变换来标准化分类和回归的数值输入变量。

具体来说,你学到了:

  • 许多机器学习算法在数值输入变量被缩放时会表现得更好,或者更喜欢被缩放。
  • 可以使用基于百分位数的稳健缩放技术来缩放包含异常值的数值输入变量。
  • 如何使用 RobustScaler 通过中位数和四分位距缩放数值输入变量。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

掌握现代数据准备!

Data Preparation for Machine Learning

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

...只需几行python代码

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

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

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


查看内容

27 条对《如何对带有异常值的数据进行缩放以用于机器学习》的回复

  1. Faisal Alsrheed 2020年5月27日 上午7:33 #

    嗨 Jason

    在分割数据之前和之后进行转换,这两者之间有什么区别吗?

    谢谢*

    *顺便说一句,到目前为止,我买了您 18 本电子书,而且我是月度赞助者,我鼓励大家这样做。您做得非常出色,值得充分认可和支持。

    • Jason Brownlee 2020年5月27日 上午8:07 #

      是的。

      我们必须仅在训练数据集上准备数据转换,否则我们会冒险数据泄露,从而导致我们无法信任的结果。
      https://machinelearning.org.cn/data-leakage-machine-learning/

      这有帮助吗?

      再次感谢您的支持。非常感激!

      • Faisal Alsrheed 2020年5月28日 上午1:53 #

        我很乐意帮忙。

        好的,那么假设我已经这样进行了分割:

        60% – 训练
        20% – 验证
        20% – 测试/留存

        所以在我进行 model.fit() 时,我将使用训练和验证数据。

        现在,我应该只在训练数据集上准备数据转换 .fit_transform() 吗?还是将训练和验证数据一起进行?

        顺便说一句,我开始使用一个浏览器扩展来阻止干扰,以便专注于您的网站。所以请期待我提出更多问题 🙂

        再次感谢您的支持。非常感激!

        • Jason Brownlee 2020年5月28日 上午6:19 #

          只训练。

          • Jenny Q 2022年4月13日 上午12:22 #

            你好 Jason,

            我也有同样的问题。如何在不使用验证集的情况下仅转换训练集?您的意思是执行完 K 折交叉验证后再进行转换吗?

            我的第二个问题是,您是否只转换输入变量,而将目标变量保持不变(编码后)?

            另外,如果我想同时使用稳健缩放器和标准化器,我应该先使用稳健缩放器吗?

            我的最后一个问题是关于本教程中的最终结果和箱线图。您的意思是,我们应该选择产生最高均值和最低标准差的那个(即在这种情况下,25-75 和 20-80 模型是最好的)?

          • James Carmichael 2022年4月14日 上午2:38 #

            Jenny 你好…你可以在转换之前简单地分离训练集和验证集。

        • Michele 2022年10月21日 上午9:54 #

          我想如果使用 pipeline 对象,它会自动完成工作。

      • Jon 2020年10月23日 晚上10:21 #

        你好,Jason。
        感谢精彩的文章。
        我在这里感到困惑,你在这里将数据集拆分成训练集和测试集。
        谢谢
        Jon

  2. Mike Kelly 2020年5月29日 上午5:27 #

    当您使用已缩放、转换等的数据训练模型时,当模型投入生产时,您是否必须在将生产数据输入模型进行预测之前应用相同的准备工作?

  3. SSS 2020年5月29日上午11:41 #

    当我们考虑50%百分位数,即均值……
    使用25%和75%百分位数以及四分位距的目的是提高准确性吗?

    • Jason Brownlee 2020年5月29日下午1:24 #

      抱歉,我没明白。您能详细说明或重新表述一下您的问题吗?

  4. Carlos 2020年6月4日凌晨3:27 #

    你好 Jason,

    感谢这篇精彩的文章。您知道R的任何库中有类似的功能吗?

    谢谢你。

    • Jason Brownlee 2020年6月4日凌晨6:27 #

      我可能会,您需要搜索一下博客,抱歉。我很多年没用过R了。

  5. Adam 2020年6月24日凌晨1:07 #

    精彩的文章!

    您提到线性回归就是一个受特征尺度影响的例子。但是,如果一个特征的尺度比其他特征大几个数量级,那么与其关联的参数会不会因为补偿而变得很小?

    • Jason Brownlee 2020年6月24日凌晨6:35 #

      是的,它会起作用,尽管输入具有相同尺度时,优化问题会更稳定/更快。

  6. Enes 2020年8月20日凌晨9:18 #

    你好 Jason,

    我认为鲁棒缩放的公式不是

    value = (value – median) / (p75 – p25),而是
    value = (value – p25) / (p75 – p25)

    因为它类似于最小-最大归一化 (value = (value – min) / (max – min))。

    您同意吗?如果您不同意,能否提供参考资料?

  7. Saad 2021年4月9日凌晨9:27 #

    Jason,感谢您的教程。我只是想知道您的意思是
    “value = (value – median) / (p75 – p25)
    生成的变量具有零均值和中位数,标准差为1,尽管不受离群值影响,并且离群值仍以与其他值的相同相对关系存在。”
    一旦经过鲁棒缩放 (x-x.median())/x.iqr()?这假定 (x.mean()-x.median())/x.iqr() = 0 => x.mean() = x.median(),这不一定是真的。还是您指的是在标准化 (x-x.mean())/x.std() 之后?

  8. Giuseppe 2022年3月27日凌晨6:56 #

    谢谢Jason,您的博客文章和见解是无价的!

    只有一个问题:一旦应用了鲁棒缩放器,数据集的中位数将为0。

    但是,数据集不会在 [0 1] 或 [-1 1] 的范围内。

    对吗?

    这是否可以接受,还是在应用鲁棒缩放器之后,我们需要将数据集的范围重新调整到 [0 1] 或 [-1 1] 的范围内?

    提前感谢您的回复。
    祝您有美好的一天。
    Giuseppe

Leave a Reply

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