Python 中用于机器学习的稳健回归

回归是一项建模任务,涉及根据输入预测数值。

用于回归任务的算法也称为“回归”算法,其中最广为人知且也许最成功的是线性回归。

线性回归拟合一条直线或超平面,以最佳地描述输入和目标数值之间的线性关系。如果数据包含异常值,则直线可能会产生偏差,从而导致预测性能下降。鲁棒回归是指在一组算法,它们在训练数据中存在异常值的情况下具有鲁棒性。

在本教程中,您将了解机器学习的鲁棒回归算法。

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

  • 鲁棒回归算法可用于输入或目标值包含异常值的数据。
  • 如何评估回归预测建模任务的鲁棒回归算法。
  • 如何通过在数据集上拟合最佳拟合线来比较鲁棒回归算法。

让我们开始吧。

Robust Regression for Machine Learning in Python

Python 中用于机器学习的稳健回归
照片作者:Lenny K Photography,部分权利保留。

教程概述

本教程分为四个部分;它们是

  1. 带异常值的回归
  2. 带异常值的回归数据集
  3. 鲁棒回归算法
  4. 比较鲁棒回归算法

带异常值的回归

回归预测建模涉及根据某些输入(通常是数值输入)预测数值变量。

用于回归预测建模任务的机器学习算法也称为“回归”或“回归算法”。最常见的方法是线性回归

许多回归算法是线性的,因为它们假定输入变量或变量与目标变量之间的关系是线性的,例如二维空间中的直线、三维空间中的平面以及高维空间中的超平面。对于许多预测任务来说,这是一个合理的假设。

线性回归假定每个变量的概率分布都表现良好,例如服从高斯分布。数据集中特征的概率分布表现越差,线性回归找到良好拟合的可能性就越小。

使用线性回归时,概率分布的一个特定问题是异常值。这些是超出预期分布的观测值。例如,如果一个变量具有高斯分布,那么与均值相差 3 或 4(或更多)个标准差的观测值就被认为是异常值。

数据集可能在输入变量或目标变量上存在异常值,这两种情况都会给线性回归算法带来问题。

数据集中的异常值会扭曲为变量计算的摘要统计量,例如均值和标准差,这反过来又可能使模型偏向异常值,偏离观测值的中心质量。这会导致模型试图在异常值和正常数据之间取得平衡,但总体上在两者上的表现都会更差。

替代的解决方案是使用线性回归的修改版本,这些版本专门处理数据集中异常值的预期。这些方法被称为鲁棒回归算法

带异常值的回归数据集

我们可以使用 make_regression() 函数定义一个合成回归数据集。

在这种情况下,我们希望有一个易于绘制和理解的数据集。这可以通过使用单个输入变量和单个输出变量来实现。我们不希望任务过于简单,因此我们将添加大量的统计噪声。

获得数据集后,我们可以通过添加异常值来增强它。具体来说,我们将向输入变量添加异常值。

这可以通过将一些输入变量的值更改为距离均值标准差的倍数(例如 2 到 4)来实现。我们将向数据集中添加 10 个异常值。

我们可以将这些内容整合到一个函数中来准备数据集。然后可以调用此函数,并绘制数据集,将输入值作为 x 轴,将目标或结果作为 y 轴。

下面列出了准备和绘制数据集的完整示例。

运行示例会创建合成回归数据集并添加异常值。

然后绘制数据集,我们可以清楚地看到数据中的线性关系、统计噪声以及远离数据主体的大量异常点。

Scatter Plot of Regression Dataset With Outliers

带异常值的回归数据集的散点图

现在我们有了数据集,让我们在上面拟合不同的回归模型。

鲁棒回归算法

在本节中,我们将考虑数据集的不同鲁棒回归算法。

线性回归(非鲁棒)

在深入研究鲁棒回归算法之前,让我们先从线性回归开始。

我们可以使用重复 k 折交叉验证在带异常值的回归数据集上评估线性回归。我们将测量平均绝对误差,这将为我们期望某些鲁棒回归算法能够超越的模型性能提供一个下限。

我们还可以绘制模型的最佳拟合线。为此,我们首先在整个训练数据集上拟合模型,然后创建一个跨越整个输入域的网格输入数据集,为每个数据点进行预测,然后绘制输入和预测输出的线。

此图显示了模型如何“看待”问题,特别是输入变量和输出变量之间的关系。其思想是,在使用线性回归时,这条线会被异常值扭曲。

将这些内容结合起来,下面列出了线性回归的完整示例。

运行示例首先报告模型在该数据集上的平均 MAE。

我们可以看到线性回归在该数据集上实现了约 5.2 的 MAE,这提供了误差的上限。

接下来,数据集以散点图的形式绘制,显示异常值,并叠加了线性回归算法的最佳拟合线。

在这种情况下,我们可以看到最佳拟合线与数据不符,并且已被异常值扭曲。反过来,我们预计这会导致模型在该数据集上的性能比预期差。

Line of Best Fit for Linear Regression on a Dataset with Outliers

带异常值的回归数据集的线性回归最佳拟合线

Huber 回归

Huber 回归是一种鲁棒回归,它能意识到数据集中可能存在异常值,并为它们分配比数据集中其他样本更小的权重。

我们可以通过 scikit-learn 中的 HuberRegressor 类来使用 Huber 回归。“epsilon”参数控制什么被视为异常值,其中较小的值考虑更多的异常值,从而使模型对异常值更加鲁棒。默认值为 1.35。

下面的示例在带异常值的回归数据集上评估 Huber 回归,首先使用重复交叉验证评估模型,然后绘制最佳拟合线。

运行示例首先报告模型在该数据集上的平均 MAE。

我们可以看到 Huber 回归在该数据集上实现了约 4.435 的 MAE,性能优于上一节的线性回归模型。

接下来,数据集以散点图的形式绘制,显示异常值,并叠加了算法的最佳拟合线。

在这种情况下,我们可以看到最佳拟合线与数据的主体更好地对齐,并且似乎没有明显受到存在的异常值的影响。

Line of Best Fit for Huber Regression on a Dataset with Outliers

带异常值的回归数据集的 Huber 回归最佳拟合线

RANSAC 回归

随机样本一致性,简称 RANSAC,是另一种鲁棒回归算法。

RANSAC 尝试将数据分为异常值和内点,并在内点上拟合模型。

scikit-learn 库通过 RANSACRegressor 类提供了实现。

下面的示例在带异常值的回归数据集上评估 RANSAC 回归,首先使用重复交叉验证评估模型,然后绘制最佳拟合线。

运行示例首先报告模型在该数据集上的平均 MAE。

我们可以看到 RANSAC 回归在该数据集上实现了约 4.454 的 MAE,性能优于线性回归模型,但可能不如 Huber 回归。

接下来,数据集以散点图的形式绘制,显示异常值,并叠加了算法的最佳拟合线。

在这种情况下,我们可以看到最佳拟合线与数据主体对齐,甚至可能比 Huber 回归的图更好。

Line of Best Fit for RANSAC Regression on a Dataset with Outliers

带异常值的回归的 RANSAC 回归最佳拟合线

Theil Sen 回归

Theil Sen 回归涉及在训练数据的子集上拟合多个回归模型,并在最后组合系数。

scikit-learn 通过 TheilSenRegressor 类提供实现。

下面的示例在带异常值的回归数据集上评估 Theil Sen 回归,首先使用重复交叉验证评估模型,然后绘制最佳拟合线。

运行示例首先报告模型在该数据集上的平均 MAE。

我们可以看到 Theil Sen 回归在该数据集上实现了约 4.371 的 MAE,性能优于线性回归模型以及 RANSAC 和 Huber 回归。

接下来,数据集以散点图的形式绘制,显示异常值,并叠加了算法的最佳拟合线。

在这种情况下,我们可以看到最佳拟合线与数据的主体对齐。

Line of Best Fit for Theil Sen Regression on a Dataset with Outliers

Theil Sen 回归最佳拟合线

比较鲁棒回归算法

现在我们熟悉了一些流行的鲁棒回归算法以及如何使用它们,我们可以看看如何直接比较它们。

在同一数据集上直接比较鲁棒回归算法进行实验会很有用。我们可以比较每种方法的平均性能,更重要的是,可以使用箱须图等工具来比较重复交叉验证折叠的分数分布。

完整的示例如下所示。

运行示例会依次评估每个模型,报告每个模型的平均和标准差 MAE 分数。

注意:由于学习算法和评估程序的随机性,您的具体结果会有所不同。尝试运行示例几次。

我们可以看到这些分数与上一节报告的分数之间存在一些细微差别,尽管这些差别可能在统计学上显著,也可能不显著。鲁棒回归方法比线性回归表现更好的总体模式仍然成立,TheilSen 的性能优于其他方法。

创建了一个图,显示了总结每个评估算法结果分布的箱须图。

我们可以清楚地看到,鲁棒回归算法的分布位于并且延伸到比线性回归算法更低的位置。

Box and Whisker Plot of MAE Scores for Robust Regression Algorithms

鲁棒回归算法 MAE 分数的箱须图

基于它们最佳拟合线的图来比较鲁棒回归算法也可能很有趣。

下面的示例在同一张图中拟合每个鲁棒回归算法,并将其最佳拟合线绘制在整个训练数据集的散点图的上下文中。

运行此示例将生成一个图,其中将数据集显示为散点图,并显示每种算法的最佳拟合线。

我们可以清楚地看到线性回归算法的离轴线,以及稳健回归算法更好地遵循数据主体部分的线。

Comparison of Robust Regression Algorithms Line of Best Fit

稳健回归算法最佳拟合线比较

进一步阅读

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

API

文章

总结

在本教程中,您了解了机器学习的稳健回归算法。

具体来说,你学到了:

  • 鲁棒回归算法可用于输入或目标值包含异常值的数据。
  • 如何评估回归预测建模任务的鲁棒回归算法。
  • 如何通过在数据集上拟合最佳拟合线来比较鲁棒回归算法。

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

发现 Python 中的快速机器学习!

Master Machine Learning With Python

在几分钟内开发您自己的模型

...只需几行 scikit-learn 代码

在我的新电子书中学习如何操作
精通 Python 机器学习

涵盖自学教程端到端项目,例如
加载数据可视化建模调优等等...

最终将机器学习带入
您自己的项目

跳过学术理论。只看结果。

查看内容

53 条对“Python 机器学习稳健回归”的回复

  1. JohnLeM 2020年10月5日 下午6:54 #

    这是一个相当不错且有趣的线性回归工具教程。但是,它与机器学习有什么联系吗?

  2. Anandteerth Ramesh Parvatikar 2020年10月6日 上午5:25 #

    感谢介绍最后两个稳健模型

  3. Ricardo Cernic 2020年10月9日 上午5:35 #

    Jason,这篇帖子很棒!我学到了很多。谢谢。

  4. Anthony The Koala 2020年10月9日 上午11:43 #

    尊敬的Jason博士,
    感谢这些教程。
    在倒数第三个示例中

    为什么您更喜欢 TheiSen 模型 4.371 (1.961),它大于 Huber 4.435 (1.868)?

    谢谢你,
    悉尼的Anthony

    • Jason Brownlee 2020年10月9日 下午1:47 #

      TheilSen 的误差较低,为 4.371 对 4.435。

      • Anthony The Koala 2020年10月9日 下午6:50 #

        尊敬的Jason博士,
        谢谢,也很抱歉。
        悉尼的Anthony

  5. Bhaskaran 2020年10月9日 下午4:02 #

    尊敬的Jason博士,
    感谢这些教程。写得很清楚,解释也很到位。

  6. Ignacio Cabrero 2020年10月9日 下午6:34 #

    我从你这里学习永远不会厌倦。感谢你的帖子。

  7. Alex Koren 2020年10月9日 下午7:39 #

    很棒的文章,我学到了很多!我想问一下——如果我们也想为观测值分配不同的权重,应该怎么做?例如,在 3-4 年的时间序列中,我们想为更近的观测值分配更多权重。你能指导我进一步阅读吗?谢谢!!

    • Jason Brownlee 2020年10月10日 上午7:03 #

      模型将以最小化误差的方式为您学习这些权重。这就是机器学习的全部意义。

  8. Alex Koren 2020年10月10日 下午7:04 #

    我的意思是,如果你想比较本月和上个月的 12 个月斜率。在这种情况下,你希望斜率受早期观测值的影响较小。

    • Jason Brownlee 2020年10月11日 上午6:46 #

      线性模型将为每个滞后观测值学习一个单独的权重——如果你描述的权重是最佳的,模型就会找到它。

  9. Stefano Cardia 2020年10月13日 下午8:14 #

    首先,感谢您发布这些有趣的方法。我想知道:是否可以将稳健回归插入聚类算法?也就是说,设置一个条件,使一组点属于一个回归估计量,或者基于一个回归量计算一个聚类,然后继续处理其他聚类(这些聚类会有其他回归量)。这或许可以通过为每个聚类设置一个容差角度来实现。拥有这样的功能将非常有趣。

    • Jason Brownlee 2020年10月14日 上午6:16 #

      不客气。

      我不知道如何实现。但如果你有一些想法,也许可以尝试用原型来验证它们。

      • Stefano Cardia 2020年10月15日 上午12:59 #

        我也无法弄清楚如何做到。我猜也许可以通过迭代线性估计操作 N 次在 2D/3D 数组上来实现,其中 N 等于聚类的数量,例如,在 k-means 类型聚类中。但我不太明白在聚类算法代码的哪个位置需要更改什么来放置回归条件。

        • Jason Brownlee 2020年10月15日 上午6:13 #

          也许可以通过小型代码原型来探索你的想法,看看它是否可行。

  10. Ansyl Pinto 2020年10月25日 上午5:56 #

    很棒的教程

  11. Gustavo Lamace 2020年10月27日 上午2:34 #

    很棒的教程,感谢您和您在本网站上发表的其他教程。我想知道是否可以使用这些方法对 3D 数据集进行线性回归估计。非常感谢任何建议。谢谢

    • Jason Brownlee 2020年10月27日 上午6:45 #

      我看不出有什么理由不能。试试看。

      • Gustavo Lamace 2020年10月28日 上午1:32 #

        关于如何绘制 3D 结果有什么建议吗?如何绘制最佳拟合平面?谢谢

        • Jason Brownlee 2020年10月28日 上午6:46 #

          是的,matplotlib 支持 3D 曲面图。请查看 API 文档。

  12. TLM 2020年12月2日 下午5:54 #

    好文!

    我唯一的观察是,HuberRegressor 的速度似乎明显快于 TheilSenRegressor。

    • Jason Brownlee 2020年12月3日 上午8:14 #

      谢谢!

      确实如此。

      • Justin 2021年5月20日 下午1:29 #

        绝佳的教程。因为您的知识和善良,世界变得更美好了一点。🙂

        你知道是否有任何 Python 库可以做到带 Huber 损失函数的 Lasso 回归吗?谢谢!

  13. Ashish Lal 2021年5月23日 上午11:13 #

    Jason,这篇帖子很棒。我有一个相关的问题。如何处理数据不嘈杂但目标变量嘈杂的回归问题?我可以使用哪些回归算法?如何为回归去除嘈杂的目标变量?

    • Jason Brownlee 2021年5月24日 上午5:41 #

      我建议测试一套不同的算法,并找出最适合您数据集的算法。

  14. Joshua Laferriere 2021年7月24日 上午7:58 #

    如何从模型中获取系数?

  15. Hardik Desai 2021年8月21日 下午11:56 #

    您是否可以将 Ransac/Thiel sen 等稳健算法应用于具有异常值且非平稳的时间序列数据?

    • Adrian Tam
      Adrian Tam 2021年8月23日 上午5:01 #

      理论上应该有效,但我没有看到任何现有库实现了这一点。

  16. Rama J 2021年12月2日 上午5:14 #

    你好,

    这是一篇精彩的读物。很棒的教程,对稳健回归和所有不同算法的解释都非常清晰。

    我想知道稳健回归是否存在任何局限性?为什么不一直使用稳健回归,而是使用 OLS 回归模型?

    谢谢!

    • Adrian Tam
      Adrian Tam 2021年12月8日 上午5:50 #

      (1) 算法更复杂 (2) 引入随机元素,例如 RANSAC,可能不是您想要的 (3) 模型具有与 OLS 不同的假设

  17. Maria 2022年2月28日 上午7:40 #

    嗨,Jason,

    感谢您创建此摘要!我是一名心理学专业的学生,刚开始接触 Python 和统计分析,我想了解是否可以在 Python 中进行稳健的多重线性回归。您对此有什么想法吗?

    谢谢!

  18. Maria 2022年3月7日 上午5:31 #

    非常感谢 James。我认为这可能超出了我(我的需求)目前的理解范围,但我真的很感激 🙂

  19. Juji 2022年3月13日 下午6:16 #

    我在 ValueError Traceback (most recent call last) 中遇到了错误
    ~\AppData\Local\Temp/ipykernel_18720/1163480024.py in
    45 X, y = get_dataset()
    46 # define a uniform grid across the input domain
    —> 47 xaxis = arange(X.min(), X.max(), 0.01)
    48 for model in get_models()
    49 # plot the line of best fit

    ~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
    1535 @final
    1536 def __nonzero__(self)
    -> 1537 raise ValueError(
    1538 f”The truth value of a {type(self).__name__} is ambiguous. ”
    1539 “Use a.empty, a.bool(), a.item(), a.any() or a.all().”

    ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

    ValueError 回溯 (最近一次调用)
    ~\AppData\Local\Temp/ipykernel_18720/1163480024.py in
    45 X, y = get_dataset()
    46 # define a uniform grid across the input domain
    —> 47 xaxis = arange(X.min(), X.max(), 0.01)
    48 for model in get_models()
    49 # plot the line of best fit

    ~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
    1535 @final
    1536 def __nonzero__(self)
    -> 1537 raise ValueError(
    1538 f”The truth value of a {type(self).__name__} is ambiguous. ”
    1539 “Use a.empty, a.bool(), a.item(), a.any() or a.all().”

    ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

    • James Carmichael 2022年3月14日 上午12:00 #

      你好 Juji…我很乐意帮忙,但我没有能力帮助你设置或调试你的工作站。

      而且,我不是调试工作站和开发环境的专家。

      我的材料通常面向那些了解自己工作站并知道如何安装软件的人。

      请查看这些教程以设置你的环境

      如何使用 Anaconda 设置用于机器学习和深度学习的 Python 环境
      如何在 Mac OS X 上为机器学习和深度学习安装 Python 3 环境
      如何使用 Python 3 创建用于机器学习开发的 Linux 虚拟机
      如果问题持续存在,请考虑将你的问题和情况发布到 StackOverflow。

  20. Thb 2022年4月6日 上午8:40 #

    很棒的帖子,谢谢!请问在逻辑回归中是否存在这些稳健性技术的等效方法或使用方法?

    谢谢!

  21. FabianB 2022年4月6日 下午6:54 #

    这个话题非常有趣,就像你的所有帖子一样。这些 RobReg 模型在现实世界的 ML 用例中是什么样的?我们如何在数据集上利用它们?这些 RobReg 中的任何一个能否用于神经网络?谢谢!

    • James Carmichael 2022年4月7日 上午9:45 #

      你好 FabianB…请描述你正在考虑的“现实世界 ML 用例”,以便我们能更好地帮助你。

  22. Stu 2022年11月23日 上午4:22 #

    亲爱的 James,
    感谢这篇出色的教程。OLS 回归给出了一个 R 平方值,我认为它是一个广义的“准确度估计”。你能为稳健模型获得 R 平方值吗,或者这是不可能的/概念上有缺陷的?
    如果 R 平方值不是稳健模型的正确度量,是否有有用的等效项?
    谢谢,
    Stu

  23. A Singh 2023年2月17日 上午2:56 #

    感谢这篇帖子!
    对于自变量或特征,推荐的缩放方法是什么?
    使用均值和标准差进行缩放是否合理?还是使用中位数和四分位距更有意义?

留下回复

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