如何用Sklearn构建单变量立方+时间项线性的多元多项式回归?
解决方案:构建含单变量三次多项式+线性时间项的回归模型
核心思路
不对所有特征统一做多项式变换,而是单独生成x的三次多项式特征,再与线性的time特征拼接,最后用线性回归拟合,精准匹配你需要的模型形式:
y = c1 + c2x + c3x² + c4x³ + c5time + error
具体实现代码
1. 导入依赖库
import numpy as np from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures
2. 准备数据(替换为你的真实数据)
确保x、time、y是sklearn要求的二维数组格式:
# 模拟示例数据(可替换成你的真实数据) np.random.seed(42) x = np.random.rand(100).reshape(-1, 1) # 转换为(样本数, 1)的二维数组 time = np.random.rand(100).reshape(-1, 1) y = 2 + 3*x + 4*x**2 + 5*x**3 + 6*time + np.random.randn(100,1)*0.1
3. 生成x的三次多项式特征
两种实现方式任选:
方式一:用PolynomialFeatures(规范便捷)
# 仅对x生成三次多项式,不包含偏置项(后续LinearRegression会自动添加截距c1) poly = PolynomialFeatures(degree=3, include_bias=False) x_poly = poly.fit_transform(x) # x_poly结构为 [x, x², x³],形状为(样本数, 3)
方式二:手动构造(直观清晰)
x_poly = np.concatenate([x, x**2, x**3], axis=1)
4. 拼接特征并拟合模型
# 横向拼接x的三次多项式特征与time特征,得到最终特征矩阵 X = np.hstack([x_poly, time]) # 拟合线性回归模型 model = LinearRegression() model.fit(X, y) # 输出模型参数,对应目标模型的c1~c5 print(f"截距c1: {model.intercept_[0]:.4f}") print(f"系数c2(x): {model.coef_[0][0]:.4f}") print(f"系数c3(x²): {model.coef_[0][1]:.4f}") print(f"系数c4(x³): {model.coef_[0][2]:.4f}") print(f"系数c5(time): {model.coef_[0][3]:.4f}")
之前方法效果差的原因
如果直接对[x, time]整体使用PolynomialFeatures(degree=3),会生成大量冗余特征(如time²、time³、x*time等),这些特征不在你的目标模型中,会干扰拟合过程,导致结果严重偏离真实数据。而单独处理x再拼接time,能严格控制特征维度,完全匹配你需要的模型结构。
内容的提问来源于stack exchange,提问作者b25468
相关产品推荐
相关产品推荐

