选多项式阶数不能靠猜,应通过残差分析和交叉验证判断:阶数过低导致欠拟合,过高引发过拟合;多数真实数据用degree=2或3即可,更高阶需谨慎;避免依赖训练集r²,而应观察交叉验证r²均值与方差突变、残差是否呈系统性模式。

直接用 numpy.polyfit 或 sklearn.preprocessing.PolynomialFeatures 配合线性模型就能做,但多数人卡在「阶数选几」和「过拟合没察觉」上。
怎么选多项式阶数?别靠猜,看残差和交叉验证
阶数太低,拟合不足;太高,曲线在训练点上抖得厉害,预测全垮。真实数据里,degree=2 或 degree=3 覆盖了绝大多数非线性趋势(比如增长放缓、先升后降)。更高阶(如 degree=5)只在物理建模或极小样本插值时谨慎尝试。
- 画出拟合后的残差图:
plt.scatter(y_pred, y_true - y_pred)—— 如果残差随预测值系统性变化(比如开口朝上/下),说明阶数不够 - 用
cross_val_score对比不同degree:设置cv=5,观察R²的均值与方差,方差突然变大就是过拟合信号 - 避免用训练集
R²选阶数——它永远随阶数升高而上升,毫无参考价值
用 numpy.polyfit 快速拟合,但注意它不返回统计量
numpy.polyfit 是最轻量的方案,适合探索性分析或嵌入简单脚本。它返回系数数组,索引 0 对应最高次项。
import numpy as np x = np.array([1, 2, 3, 4, 5]) y = np.array([2.1, 3.9, 6.2, 8.1, 9.8]) coeffs = np.polyfit(x, y, deg=2) # 返回 [a, b, c] 对应 ax² + bx + c poly_func = np.poly1d(coeffs) y_pred = poly_func(x)
- 它不做中心化或缩放,当
x值很大(如年份 2000–2024)时,高次项数值爆炸,polyfit可能因浮点精度失效 - 没有标准误、p 值、置信区间——要做推断分析必须换
statsmodels或手动计算协方差矩阵 - 预测新数据时,直接调用
poly_func(new_x)即可,不用再拼系数
用 sklearn 做稳健拟合,必须加 StandardScaler
当你要把多项式回归嵌进 pipeline、做特征工程或后续接正则化时,PolynomialFeatures + LinearRegression 是更可控的选择。但跳过标准化会出事:
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
<p>pipe = Pipeline([
('scale', StandardScaler()), # 关键!先标准化 x
('poly', PolynomialFeatures(degree=3)),
('lr', LinearRegression())
])
pipe.fit(x.reshape(-1, 1), y)</p>
-
PolynomialFeatures默认生成所有交互项(如 x₁², x₁x₂),单变量时没问题;但多变量时设interaction_only=False才安全 - 不加
StandardScaler,x=100 时 x³=1e6,权重更新被主导,LinearRegression收敛慢甚至失败 - 若需 L2 正则化,把
LinearRegression换成Ridge,比硬调degree更防过拟合
拟合完必须检查:残差不是白噪声就等于没拟合好
多项式只是函数形式,不代表它真的捕捉了数据机制。真正要问的是:残差中还有结构吗?
- 画
residuals vs. fitted图:如果漏斗形(异方差)、S 形(仍存非线性),说明模型设定仍有问题 - 跑
statsmodels.stats.diagnostic.acorr_ljungbox检验残差自相关——时间序列数据尤其关键 - 对原始
x做散点图叠加拟合曲线,眼睛比 R² 更早发现“拟合了形状却错位了”的情况
很多人跑出高 R² 就停手,但残差里藏着趋势、周期或异常点响应,这些不会自动出现在系数表里。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











