39 Python 数据挖掘番外篇:为什么 `LinearRegression` 也能做多项式回归? ——从 `PolynomialFeatures(degree=2)` 说起
为什么 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=2或degree=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虽然仍然是线性回归,但就能够拟合二次曲线了。
所以:
- 线性回归:模型形式没变
- 多项式回归:特征形式变了
- 本质:仍然是对参数做线性拟合
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)