为什么 LinearRegression 也能做多项式回归?

——从 PolynomialFeatures(degree=2) 说起

很多同学第一次学到这段代码时,都会有一个很自然的疑问:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)

model = LinearRegression()
model.fit(X_poly, y)

明明我们做的是多项式回归,为什么模型还是 LinearRegression()
不是应该有一个 PolynomialRegression() 吗?

这个问题非常典型,也非常重要。
如果这里没理解,后面学机器学习时会一直有点“似懂非懂”。

这篇小文就专门讲清楚这件事。


一、先说结论

结论一句话

多项式回归,本质上仍然是在做线性回归,只不过输入特征被扩展了。

也就是说:

  • 线性回归模型没变
  • 变的是输入数据的形式

二、先回顾:什么叫线性回归?

最简单的一元线性回归写成:

[
y = w_0 + w_1x
]

这里:

  • (x) 是输入
  • (y) 是输出
  • (w_0, w_1) 是模型要学的参数

这个公式表示:
输入和输出之间是直线关系

如果画图,就是一条直线。


三、那什么叫多项式回归?

如果数据明显不是直线,而是弯曲趋势,比如:

  • 前期增长快
  • 后期增长慢
  • 或者像抛物线那样弯曲

那么可以用二次函数:

[
y = w_0 + w_1x + w_2x^2
]

这就是二次多项式回归

如果再高一点,还可以写成:

[
y = w_0 + w_1x + w_2x^2 + w_3x^3
]

这就是三次多项式回归。


四、那为什么还是 LinearRegression

这正是关键。

很多同学把“线性”理解成“图像必须是直线”,其实不完全对。

在机器学习里,线性回归中的“线性”主要是指:模型对参数是线性的。

比如:

[
y = w_0 + w_1x + w_2x^2
]

虽然它对 (x) 来说已经是曲线了,
但对参数 (w_0, w_1, w_2) 来说,仍然是线性的:

  • 没有 (w_1^2)
  • 没有 (w_1w_2)
  • 没有 (\sin(w_1))

参数只是“乘上某个特征,再相加”。

所以它仍然可以用线性回归的方法来求解。


五、PolynomialFeatures(degree=2) 到底做了什么?

它不是训练模型,
它做的是:

把原来的特征变成多项式特征

例如原始输入:

X = [[1],
     [2],
     [3],
     [4]]

执行:

poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)

得到的结果大概是:

[[1, 1, 1],
 [1, 2, 4],
 [1, 3, 9],
 [1, 4, 16]]

每一列分别是:

  • 第1列:常数项 (1)
  • 第2列:(x)
  • 第3列:(x^2)

于是原来的一个特征 (x),变成了三个特征:

[
[1,\ x,\ x^2]
]

然后再把这个新的特征矩阵交给 LinearRegression() 去拟合。

所以模型实际学的是:

[
y = w_0\cdot 1 + w_1x + w_2x^2
]

这就是多项式回归。


六、换句话说:你并没有换模型,而是在“造新特征”

这是一个非常重要的思想:

机器学习中,很多“非线性效果”并不是靠换模型实现的,而是靠特征变换实现的。

这里的 PolynomialFeatures 就是在做特征工程

原来只有:

  • 学习时长

现在人为增加了:

  • 学习时长
  • 学习时长平方

以后还可以增加:

  • 学习时长立方
  • 多个变量之间的乘积项

这样模型就更有表达能力了。


七、为什么叫“线性回归”却能画曲线?

因为“线性”不是说它画出来一定是直线,
而是说:

模型是参数的线性组合

例如:

[
y = w_0 + w_1x + w_2x^2
]

这是参数 (w_0, w_1, w_2) 的线性组合。
所以仍然属于线性模型。

但由于特征里有 (x^2),
所以对输入 (x) 来看,图像可以是曲线。


八、一个最容易混淆的点

很多同学会问:

“既然有 (x^2),为什么还叫线性?”

因为“线性”看的不是 (x),
而是看的参数 (w)

我们比较一下:

形式1

[
y = w_0 + w_1x + w_2x^2
]

这是线性的,因为参数只是一阶出现。


形式2

[
y = w_0 + (w_1)^2x
]

这就不是参数线性了,因为 (w_1) 被平方了。


形式3

[
y = w_0 + \sin(w_1x)
]

这也不是参数线性的。


所以:

  • 特征 非线性,不一定不是线性模型
  • 参数 非线性,才是真的非线性模型

这个区分非常重要。


九、直接用原始 X 和用 X_poly 有什么区别?

1. 直接用原始 X

model.fit(X, y)

模型拟合的是:

[
y = w_0 + w_1x
]

这是一条直线。


2. 用 PolynomialFeatures(degree=2)

model.fit(X_poly, y)

模型拟合的是:

[
y = w_0 + w_1x + w_2x^2
]

这是一条二次曲线。


所以区别不是 LinearRegression 变了,
而是输入特征变了。


十、举一个通俗类比

你可以把 LinearRegression 想成一个“只会做加权求和的机器”。

它的本领只有:

[
y = w_0f_0 + w_1f_1 + w_2f_2 + \cdots
]

它不会主动想到平方、立方这些复杂关系。
所以你必须先把特征准备好给它:

  • 原始特征:(x)
  • 扩展特征:(x^2, x^3)

它拿到这些特征后,仍然只是做加权求和,
但由于输入丰富了,效果就能变复杂。


十一、degree=2 不仅仅是加一个平方项

如果 X 有多个特征,情况会更丰富。

例如:

X = [[x1, x2]]

当你写:

PolynomialFeatures(degree=2)

生成的特征通常包括:

[
1,\ x_1,\ x_2,\ x_12, x_1x_2, x_22
]

注意这里多了一个非常关键的交叉项:

[
x_1x_2
]

这表示:

两个特征的“共同作用”也能被模型学习到。

比如:

  • 学习时间
  • 睡眠时间

成绩可能不仅仅受它们各自影响,
还可能受“学习时间 × 睡眠时间”的联合作用影响。

这就是多项式特征的进一步价值。


十二、举一反三:degree=3 呢?

如果写:

PolynomialFeatures(degree=3)

那么一元输入 (x) 会变成:

[
[1,\ x,\ x2, x3]
]

模型就变成:

[
y = w_0 + w_1x + w_2x^2 + w_3x^3
]

可以拟合更复杂的曲线。

但是要注意:

次数越高,不一定越好。

因为次数太高时,模型可能会把训练数据“记得太死”,导致过拟合


十三、为什么多项式次数不能乱加?

假设数据本来只是一个平滑的弯曲趋势,
你却用了 8 次、10 次多项式,模型可能会出现:

  • 曲线扭来扭去
  • 训练集拟合得很好
  • 预测新数据却很差

这就是过拟合。

所以在实际使用中:

  • 次数太低:欠拟合
  • 次数太高:过拟合
  • 合适的次数:效果最好

常见做法是:

  • 先从 degree=2degree=3 开始
  • 再通过验证集或交叉验证选择合适次数

十四、代码中常见疑问汇总

1. 为什么 PolynomialFeatures 生成了第一列全是 1?

因为它默认会加上偏置项,也就是常数项:

[
1
]

对应回归公式中的截距项。


2. 既然有常数项,LinearRegression 里还要截距吗?

默认 LinearRegression() 会自动拟合截距。
PolynomialFeatures 也会生成一列常数 1。
这时有时会显得重复。

实际中常见两种处理方式:

方式1:保留默认设置

简单教学中这样写没问题。

方式2:去掉 PolynomialFeatures 的偏置项

poly = PolynomialFeatures(degree=2, include_bias=False)

这样生成的特征就是:

[
[x,\ x^2]
]

更清爽一些。


3. fit_transform(X) 为什么不是直接 transform(X)

因为第一次要先“学习怎么变换”,再进行变换。
虽然对 PolynomialFeatures 来说,这个“学习”几乎不涉及复杂参数,但接口统一采用了 fit_transform()


十五、教学中最值得强调的一句话

建议你在课堂上反复强调这句:

多项式回归不是换了一个新模型,而是把原始特征扩展后,再用线性回归去拟合。

学生一旦理解这句,很多困惑就会消失。


十六、可以这样给学生做板书总结

原始线性回归

[
y = w_0 + w_1x
]

输入特征:
[
[x]
]


二次多项式回归

[
y = w_0 + w_1x + w_2x^2
]

输入特征:
[
[x,\ x^2]
]


三次多项式回归

[
y = w_0 + w_1x + w_2x^2 + w_3x^3
]

输入特征:
[
[x,\ x2, x3]
]


十七、再进一步:这体现了机器学习的一个重要思想

这件事背后其实是一个更大的思想:

模型能力 = 模型本身 + 特征表达

很多时候,不是模型不行,
而是特征太简单。

PolynomialFeatures 就是在告诉我们:

  • 原始问题看起来是非线性的
  • 但如果把特征映射到更高维空间
  • 问题可能又变成线性的了

这和后面你们学到的:

  • 核方法
  • 支持向量机
  • 神经网络中的特征变换

其实都有相通之处。


十八、最后一句话总结

PolynomialFeatures(degree=2) 的作用,是把原始特征 (x) 扩展成 (1, x, x^2),这样 LinearRegression 虽然仍然是线性回归,但就能够拟合二次曲线了。

所以:

  • 线性回归:模型形式没变
  • 多项式回归:特征形式变了
  • 本质:仍然是对参数做线性拟合
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐