非线性回归在scikit-learn中通过特征工程(如polynomialfeatures+linearregression)或自带非线性能力的模型(如svr、randomforestregressor)实现,而非直接使用linearregression或名为nonlinearregression的模型。

非线性回归不是直接用 LinearRegression
Scikit-learn 本身没有叫 NonlinearRegression 的模型——它不提供通用的“非线性拟合”黑箱。所谓“非线性回归”,在 scikit-learn 中实际是靠「特征工程 + 线性模型」或「自带核/树结构的非线性模型」两条路实现的。直接把原始特征丢进 LinearRegression,哪怕真实关系是 y = x² + sin(x),结果大概率是欠拟合。
用 PolynomialFeatures 构造多项式特征再套 LinearRegression
这是最贴近传统“非线性回归”的做法:把非线性关系显式编码成新特征,让线性模型能学。关键不是模型非线性,而是输入空间被映射了。
-
PolynomialFeatures(degree=2, include_bias=True)会把[x1, x2]变成[1, x1, x2, x1², x1*x2, x2²];degree 超过 3 就容易过拟合,尤其样本少时 - 必须搭配
StandardScaler预处理——高次项数值可能爆炸,不缩放会导致LinearRegression训练不稳定甚至发散 - 别忘了用
Pipeline把缩放、多项式、回归串起来,否则predict()时漏掉某步就出错
示例片段:
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
<p>poly_reg = Pipeline([
('scaler', StandardScaler()),
('poly', PolynomialFeatures(degree=2)),
('lr', LinearRegression())
])
poly_reg.fit(X_train, y_train)</p>
用 SVR 或 RandomForestRegressor 替代“线性假设”
如果你不确定该用几次多项式,或者关系含跳跃、周期性、多峰,硬凑多项式反而更差。这时候应换模型本身具备非线性表达能力的:
-
SVR(kernel='rbf')对小数据拟合光滑曲线很稳,但gamma和C需调参;kernel='linear'就退化成线性回归 -
RandomForestRegressor(n_estimators=100)不需要特征缩放,抗异常值强,但预测函数不可导、无法外推——超出训练X范围的点,结果可能突变 -
GradientBoostingRegressor比随机森林更易过拟合,但通常精度更高;设learning_rate=0.05和n_estimators=300是较安全起点
评估非线性拟合效果不能只看 R²
R² 在非线性场景下有误导性:它对残差分布敏感,且无法反映外推行为。你得额外检查:
- 残差图:
y_predvsy_true - y_pred是否还残留明显模式(比如抛物线形)——有就说明模型仍没抓住核心非线性结构 - 交叉验证分层方式:对时间序列或空间数据,用
TimeSeriesSplit或自定义GroupKFold,避免未来信息泄露 - 测试集必须覆盖训练范围之外的区域:如果只在
x ∈ [0,1]训练,却要在x=2预测,所有基于插值的模型(SVR、RF、多项式)都会失效
真正麻烦的是:非线性没标准答案。选多项式还是树模型,取决于你是否需要可解释性、是否关心外推、数据噪声水平和样本量。没跑通之前,别急着归因到“模型不行”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











