39 Python 数据挖掘番外篇:为什么 `LinearRegression` 也能做多项式回归? ——从 `PolynomialFeatures(degree=2)` 说起

张开发
2026/4/12 2:49:08 15 分钟阅读

分享文章

39 Python 数据挖掘番外篇:为什么 `LinearRegression` 也能做多项式回归? ——从 `PolynomialFeatures(degree=2)` 说起
为什么LinearRegression也能做多项式回归——从PolynomialFeatures(degree2)说起很多同学第一次学到这段代码时都会有一个很自然的疑问fromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.linear_modelimportLinearRegression polyPolynomialFeatures(degree2)X_polypoly.fit_transform(X)modelLinearRegression()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(degree2)到底做了什么它不是训练模型它做的是把原来的特征变成多项式特征例如原始输入X[[1],[2],[3],[4]]执行polyPolynomialFeatures(degree2)X_polypoly.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. 直接用原始Xmodel.fit(X,y)模型拟合的是[y w_0 w_1x]这是一条直线。2. 用PolynomialFeatures(degree2)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)它拿到这些特征后仍然只是做加权求和但由于输入丰富了效果就能变复杂。十一、degree2不仅仅是加一个平方项如果X有多个特征情况会更丰富。例如X[[x1,x2]]当你写PolynomialFeatures(degree2)生成的特征通常包括[1,\ x_1,\ x_2,\ x_12, x_1x_2, x_22]注意这里多了一个非常关键的交叉项[x_1x_2]这表示两个特征的“共同作用”也能被模型学习到。比如学习时间睡眠时间成绩可能不仅仅受它们各自影响还可能受“学习时间 × 睡眠时间”的联合作用影响。这就是多项式特征的进一步价值。十二、举一反三degree3呢如果写PolynomialFeatures(degree3)那么一元输入 (x) 会变成[[1,\ x,\ x2, x3]]模型就变成[y w_0 w_1x w_2x^2 w_3x^3]可以拟合更复杂的曲线。但是要注意次数越高不一定越好。因为次数太高时模型可能会把训练数据“记得太死”导致过拟合。十三、为什么多项式次数不能乱加假设数据本来只是一个平滑的弯曲趋势你却用了 8 次、10 次多项式模型可能会出现曲线扭来扭去训练集拟合得很好预测新数据却很差这就是过拟合。所以在实际使用中次数太低欠拟合次数太高过拟合合适的次数效果最好常见做法是先从degree2或degree3开始再通过验证集或交叉验证选择合适次数十四、代码中常见疑问汇总1. 为什么PolynomialFeatures生成了第一列全是 1因为它默认会加上偏置项也就是常数项[1]对应回归公式中的截距项。2. 既然有常数项LinearRegression里还要截距吗默认LinearRegression()会自动拟合截距。而PolynomialFeatures也会生成一列常数 1。这时有时会显得重复。实际中常见两种处理方式方式1保留默认设置简单教学中这样写没问题。方式2去掉PolynomialFeatures的偏置项polyPolynomialFeatures(degree2,include_biasFalse)这样生成的特征就是[[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(degree2)的作用是把原始特征 (x) 扩展成 (1, x, x^2)这样LinearRegression虽然仍然是线性回归但就能够拟合二次曲线了。所以线性回归模型形式没变多项式回归特征形式变了本质仍然是对参数做线性拟合

更多文章