如何在机器学习中使用多项式特征变换

通常,预测建模任务的输入特征会以意想不到的、通常是非线性方式相互作用。

这些交互作用可以被学习算法识别和建模。另一种方法是工程化新特征,以揭示这些交互作用,并查看它们是否能提高模型性能。此外,像将输入变量提高到某个幂次这样的变换,有助于更好地揭示输入变量与目标变量之间重要关系。

这些特征称为交互特征和多项式特征,它们允许使用更简单的建模算法,因为解释输入变量及其关系的复杂性的一部分被推回到了数据准备阶段。有时这些特征可以提高建模性能,尽管代价是增加了数千甚至数百万个额外的输入变量。

在本教程中,您将了解如何使用多项式特征转换来对数值输入变量进行特征工程。

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

  • 某些机器学习算法更喜欢或在多项式输入特征上表现更好。
  • 如何使用多项式特征转换来为预测建模创建输入变量的新版本。
  • 多项式次数对转换创建的输入特征数量的影响。

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

让我们开始吧。

How to Use Polynomial Features Transforms for Machine Learning

如何在机器学习中使用多项式特征变换
照片由D Coetzee拍摄,保留部分权利。

教程概述

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

  1. 多项式特征
  2. 多项式特征转换
  3. 声纳数据集
  4. 多项式特征转换示例
  5. 多项式次数的影响

多项式特征

多项式特征是通过将现有特征提高到指数而创建的特征。

例如,如果一个数据集只有一个输入特征 X,那么多项式特征将是添加一个新特征(列),其值通过对 X 中的值进行平方计算,例如 X^2。这个过程可以对数据集中的每个输入变量重复进行,从而创建每个变量的转换版本。

因此,多项式特征是一种特征工程,例如基于现有特征创建新输入特征。

多项式的“次数”用于控制添加的特征数量,例如,次数为 3 将为每个输入变量添加两个新变量。通常使用较小的次数,例如 2 或 3。

总的来说,使用大于 3 或 4 的 d 是不寻常的,因为对于较大的 d 值,多项式曲线会变得非常灵活,并可能呈现出一些非常奇怪的形状。

— 第 266 页,《统计学习导论(附R应用)》,2014年。

添加表示特征之间交互作用的新变量也很常见,例如,一个表示一个变量乘以另一个变量的新列。这也可以为每个输入变量重复进行,为每对输入变量创建新的“交互”变量。

输入变量的平方或立方版本会改变概率分布,分离小值和大值,随着指数的增大,这种分离会增加。

这种分离可以帮助一些机器学习算法做出更好的预测,并且对于回归预测建模任务,以及通常具有数值输入变量的任务来说很常见。

通常,线性算法,如线性回归和逻辑回归,对使用多项式输入变量响应良好。

线性回归在模型参数上是线性的,并且向模型添加多项式项是让模型识别非线性模式的有效方法。

— 第 11 页,《特征工程与选择》,2019年。

例如,当用作线性回归算法的输入时,该方法更广泛地称为多项式回归

多项式回归通过添加额外的预测变量来扩展线性模型,这些预测变量是通过将每个原始预测变量提高到某个幂次而获得的。例如,三次回归使用三个变量 X、X^2 和 X^3 作为预测变量。这种方法提供了一种对数据进行非线性拟合的简单方法。

— 第 265 页,《统计学习导论(附R应用)》,2014年。

想开始学习数据准备吗?

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

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

多项式特征转换

scikit-learn Python机器学习库通过PolynomialFeatures类提供了多项式特征转换。

创建的特征包括

  • 偏差(值为1.0)
  • 每个次数的幂值(例如 x^1、x^2、x^3、…)
  • 所有特征对的交互作用(例如 x1 * x2、x1 * x3、…)

例如,对于值为 2 和 3、次数为 2 的两个输入变量,创建的特征将是

  • 1(偏差)
  • 2^1 = 2
  • 3^1 = 3
  • 2^2 = 4
  • 3^2 = 9
  • 2 * 3 = 6

我们可以用一个例子来演示这一点

运行示例首先报告原始数据,其中有两个特征(列),每个特征具有相同的值,即 2 或 3。

然后创建多项式特征,生成六个特征,与上面描述的一致。

degree”参数控制创建的特征数量,默认为 2。

interaction_only”参数意味着只包括原始值(次数 1)和交互作用(值对相乘),默认为*False*。

include_bias”参数默认为*True*,表示包含偏差特征。

我们将更深入地研究如何在实际数据集中使用多项式特征转换。

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

声纳数据集

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

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

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

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

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

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

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

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

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

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

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

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

Histogram Plots of Input Variables for the Sonar Binary Classification Dataset

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

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

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

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

注意:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能有所不同。考虑多次运行示例并比较平均结果。

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

接下来,让我们探讨对数据集进行多项式特征转换。

多项式特征转换示例

我们可以直接将多项式特征转换应用于 Sonar 数据集。

在这种情况下,我们将使用次数 3。

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

创建 Sonar 数据集的特征转换并总结创建的特征的完整示例如下。

运行示例会对 Sonar 数据集执行多项式特征转换。

我们可以看到,对于原始数据集,我们的特征从 61 个(60 个输入特征)增加到 39,711 个特征(39,710 个输入特征)。

接下来,让我们评估与上一节相同的 KNN 模型,但这次是在数据集的多项式特征转换上。

完整的示例如下所示。

注意:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能有所不同。考虑多次运行示例并比较平均结果。

运行示例,我们可以看到多项式特征转换将性能从无转换时的 79.7% 准确率提升到有转换时的约 80.0% 准确率。

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

多项式次数的影响

多项式的次数会急剧增加输入特征的数量。

为了了解这对特征数量的影响有多大,我们可以使用一系列不同的次数进行转换,并比较数据集中特征的数量。

完整的示例如下所示。

运行示例首先报告了从 1 到 5 的次数以及数据中的特征数量。

我们可以看到,次数为 1 没有效果,并且特征数量从 2 到 5 急剧增加。

这表明,对于非常小的数据集以外的情况,应使用次数 2 或 3 来避免输入变量的急剧增加。

Line Plot of the Degree vs. the Number of Input Features for the Polynomial Feature Transform

多项式特征转换的次数与输入特征数量的关系图

更多的特征可能会导致过拟合,从而导致结果变差。

将多项式特征转换的次数视为超参数并为您的数据集测试不同的值可能是一个好主意。

下面的示例探讨了次数从 1 到 4 的值,并评估了它们对所选模型分类准确率的影响。

运行示例会为每个多项式次数报告平均分类准确率。

注意:由于算法或评估过程的随机性,或数值精度的差异,您的结果可能有所不同。考虑多次运行示例并比较平均结果。

在这种情况下,我们可以看到,除了次数为 3 的情况外,性能通常比没有转换(次数 1)的情况要差。

在进行转换之前或之后对数据进行缩放,以了解其对模型性能的影响,这可能很有趣。

创建箱线图以总结每个多项式次数的分类准确率得分。

我们可以看到性能基本保持平稳,在次数为 4 时可能出现过拟合的早期迹象。

Box Plots of Degree for the Polynomial Feature Transform vs. Classification Accuracy of KNN on the Sonar Dataset

KNN 在 Sonar 数据集上进行多项式特征转换的分类准确率的次数箱线图

进一步阅读

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

书籍

API

文章

总结

在本教程中,您了解了如何使用多项式特征转换来对数值输入变量进行特征工程。

具体来说,你学到了:

  • 某些机器学习算法更喜欢或在多项式输入特征上表现更好。
  • 如何使用多项式特征转换来为预测建模创建输入变量的新版本。
  • 多项式次数对转换创建的输入特征数量的影响。

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

掌握现代数据准备!

Data Preparation for Machine Learning

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

...只需几行python代码

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

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

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


查看内容

如何使用多项式特征转换进行机器学习的 42 条回复

  1. Faisal Alsrheed 2020年5月29日 上午7:12 #

    你好,又见面了:)

    我将使用前馈神经网络作为回归器,使用(5个输入特征/传感器读数)。

    我想为这个项目尝试多项式特征转换以创建更多输入特征

    我的问题是
    我可以在执行 PolynomialFeatures 后执行(RobustScaler)或(StandardScaler)吗?

    非常感谢

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

      是的。

      一种方法是将转换作为管道的一部分应用于您的数据集,然后将数据提供给模型。

    • J 2020年5月30日 晚上8:28 #

      这个案例研究对于多项式模型的优势并没有说服力。

      您最初有 200 个数据点和 60 个变量。添加 1000 多个变量后,您的模型准确率提高了 0.3%。

      1:这种程度的提高可能只是偶然发生的,即仅仅重新训练原始模型。

      2:没有保留集 cv。实际上,您将有 150 个观测值用于建模,并且大多数模型在没有特征选择的情况下都会过拟合。

      3:它很好地演示了 Python 模块的 OO 性质对于统计工作流程来说是多么麻烦。在 R 中,使用一半的代码量和两倍的可读性就可以做到同样的事情。

      • Jason Brownlee 2020年5月31日 上午6:23 #

        是的,我可以做得更好。感谢您的反馈。

  2. marco 2020年5月29日 晚上9:50 #

    你好 Jason,
    是否可以使用 Keras 进行多项式回归?
    您有简单的例子吗?
    谢谢
    Marco

    • Jason Brownlee 2020年5月30日 上午6:02 #

      是的,您可以生成特征,然后将它们传递给您的 keras 模型。

      没有,我没有例子,但它应该很简单。

  3. Gamze 2020年5月30日 上午1:34 #

    感谢您的分享,

    如果我们想做预测,是否也应该为测试数据实现多项式特征转换?

    再次感谢

    • Jason Brownlee 2020年5月30日 上午6:06 #

      是的,必须对训练集和测试集使用相同的转换对象。例如,它是在训练集上拟合的,然后应用于训练集和测试集。

  4. Tina 2020年6月11日 上午1:12 #

    你好 Jason,

    您的博客文章对像我这样的从业者来说非常有趣!这次我有一个问题:多项式特征转换是否不会引入多重共线性(例如 x 和 x^2 之间的相关性),从而可能导致模型性能下降?

    非常感谢

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

      谢谢。

      它可能会,这会影响一些线性模型。

  5. Anthony The Koala 2020年8月5日 上午5:11 #

    尊敬的Jason博士,
    我必须说,我没有理解 PolynomialFeatures 转换产生的模式。
    我使用交互项和多项式以及仅交互项,使用数组 [1,2,3,4] 进行了以下操作

    https://stackoverflow.com/questions/51906274/cannot-understand-with-sklearns-polynomialfeatures 的第二个答案的帮助下,您会得到以下模式。

    那么 fit_transform(data) 会生成形式

    如果您排除 a^2, b^2, c^2 和 d^2 的平方。

    其类型是

    度为 3 且值为 2 的情况,例如 data = [a,b]

    转换后的输出数量 = (n + d)!/(n! * d!) 其中 n = 数字的数量,d = 多项式的次数。

    例如,数字数量 = 3,多项式次数 = 2,
    转换后的输出数量 = (n + d)! / (n! * d!) = 5!/(3! * 2!) =10

    例如,数字数量 = 2,多项式次数 = 3
    转换后的输出数量 = 5!/(2!*3!) = 10

    谢谢你,
    悉尼的Anthony

    • Jason Brownlee 2020年8月5日上午6:21 #

      感谢分享您的发现。

      • Anthony The Koala 2020年8月5日上午6:45 #

        尊敬的Jason博士,
        我一直在尝试标题为“Polynomial Feature Transform Example”的代码,该代码也包含在您的书的第 310 页(第 327 页,共 398 页)的列表 23.10 中。

        特别相关的几行是

        我问这个问题“,,,作者为什么没有通过

        并将其输入到 cross_val_score 中?

        请注意,我没有使用管道,而是使用了转换后的多项式特征 X2。

        我仍然得到了相同的结果。

        问题是:在原始代码中,管道似乎执行了度为 3 的 PolynomialFeatures 函数,而没有将转换后的 (X) = X2 放入 cross_val_score 函数。

        换句话说,在原始代码中,该管道是如何在不使用转换后的特征的情况下计算转换后的特征,并且仍然得到相同的结果的?

        谢谢你,
        悉尼的Anthony

      • Bill 2021年2月6日下午9:14 #

        嗨,Jason,
        感谢您的文章,它非常翔实。我的问题是关于这项技术的应用。应该将特征转换为多项式用于回归问题,还是也可以用于分类问题?
        谢谢你,
        Bill

        • Jason Brownlee 2021年2月7日上午5:18 #

          多项式特征可以帮助回归和分类任务,可以尝试与没有多项式特征的相同模型进行比较。

  6. Erika 2021年2月22日凌晨2:21 #

    嗨,Jason,

    我有一个问题。在 Pipeline 中,StandardScale 和 Polynomial Features 的正确顺序是什么?还是 Polynomial Features 和 StandardScale?我对这个感到困惑。

    • Jason Brownlee 2021年2月22日上午5:04 #

      我的建议是测试一下它是否会产生影响。

      我的直觉是,在这种情况下,它可能无关紧要。

      • Erika 2021年2月22日凌晨6:52 #

        明白了!非常感谢!您的网站太棒了!

  7. Sanjeet 2021年4月12日上午6:14 #

    嗨,我只有一个自变量,它与目标变量之间存在非线性关系,我是否应该为基于树的模型从该自变量创建多项式特征?

    • Jason Brownlee 2021年4月13日上午6:00 #

      也许可以尝试一下,并与其他方法的结果进行比较。

  8. muhammad ali raza abid 2021年4月15日下午4:04 #

    我创建了高达 4 次的多项式特征,它们显着提高了我的线性回归模型的 R2 分数(经交叉验证验证)。但是我的问题是,新创建的多项式特征与它们生成的原始特征高度相关,皮尔逊相关系数高于 0.80。这是否会导致多重共线性问题?或者模型结果是可以接受的?

    • Jason Brownlee 2021年4月16日上午5:29 #

      有可能性。

      专注于模型性能。如果模型表现更好,则保留新特征。

      • muhammad ali raza abid 2021年4月16日上午10:21 #

        Jason 先生,非常感谢您的建议。我还有另一个问题。您提到过一本书的参考资料说“对于 d(次数)的大值,多项式曲线会变得过于灵活,并可能呈现非常奇怪的形状”。我的问题是,对于 d 的大值,例如 5,如果线性模型性能在提高,并且我看不到回归线有任何异常,我们可以保留这些特征来构建模型吗?

        实际上,在我的案例中,我有 13 个特征,我找到了最重要的特征,从那个最重要的特征创建了 5 次多项式特征,观察到模型性能在 d=5 时有显着提高,在 d=6 时开始下降。我希望您能理解我的问题。提前感谢。

        • Jason Brownlee 2021年4月17日上午6:04 #

          当然,使用最适合您数据和测试的方法。确保您的测试方法足够健壮,这样您就不会欺骗自己。

  9. muhammad ali raza abid 2021年4月28日下午4:59 #

    嗨 Jason,我有一个问题。如果我创建了一个 VIF=5.6、p 值=0.7 的多项式特征,它将 Adj. R2 提高了 2.5%。我该如何解释这样的特征?
    请谢谢。

    • Jason Brownlee 2021年4月29日上午6:23 #

      抱歉,我尽量避免为读者解释结果。

      可以尝试与使用其他方法的结果进行比较,并根据您的具体应用选择最有效或最可靠的方法。

  10. muhammad ali raza abid 2021年4月29日上午9:33 #

    感谢您的快速回复。我非常感激。您的评论对像我这样的学习者很有价值。

  11. shyam vaswani 2021年6月15日下午3:22 #

    您的文章非常精彩,内容翔实,解释和示例丰富。您是绝地大师!😀

  12. ángel 2021年10月13日晚上10:34 #

    输入变量为 2,3,4 且次数为 2 的情况下,输出变量的顺序是什么?

    可能是这个?
    1(偏差)
    2^1
    3^1
    4^1
    2^2
    3^2
    4^2
    2*3
    3*4

    • Adrian Tam
      Adrian Tam 2021年10月14日凌晨3:21 #

      尝试替换
      data = asarray([[2,3,4],[2,3,4]])
      您会看到它是
      1, 2^1, 3^1, 4^1, 2^2, 2*3, 2*4, 3^2, 3*4, 4^2

      • ángel 2021年10月15日晚上10:09 #

        但 Jason Brownlee 在上面写道
        “例如,有两个输入变量,值为 2 和 3,次数为 2,创建的特征将是
        1(偏差)
        2^1 = 2
        3^1 = 3
        2^2 = 4
        3^2 = 9
        2 * 3 = 6”

        所以,交互项似乎是最后的。

        • Adrian Tam
          Adrian Tam 2021年10月20日凌晨8:20 #

          您查看代码的输出,而不是要点,您会看到它是顺序为 [2,3,4,6,9] 而不是。

  13. Salaf 2022年1月12日凌晨12:32 #

    我通过多项式次数=2 生成了新特征,现在我应该替换/丢弃原始特征,还是保留所有特征及其多项式特征用于回归?

留下回复

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