You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多项式回归中LinearRegression().coef_系数解读及维度疑问

为什么你得到了28个系数?

这是因为你使用的PolynomialFeatures(degree=2)默认会生成所有可能的二次多项式特征,而不只是你预期的单个特征的一次和二次项。具体来说,针对6个特征,它会生成:

  • 1个偏置项(全1的列,对应模型中的截距b;如果LinearRegression默认开启fit_intercept=True,这个项的系数会被纳入coef_,同时模型的intercept_会变为0)
  • 6个一次项(x₁到x₆)
  • 15个两两交叉项(比如x₁x₂、x₁x₃…x₅x₆,总共C(6,2)=15个)
  • 6个单个特征的二次项(x₁²到x₆²)

加起来正好是1+6+15+6=28个特征,所以qm.coef_会输出28个系数——模型不仅拟合了你想要的单个特征的一次、二次项,还自动拟合了所有特征之间的交互交叉项。

你预期的12个系数在哪里?

你要的6个一次项系数和6个二次项系数就藏在这28个里面,你可以通过poly.get_feature_names_out(x_train.columns)来查看每个系数对应的特征名称,比如:

print(poly.get_feature_names_out(x_train.columns))

输出会是类似这样的列表:

['1', 'x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x1^2', 'x1 x2', 'x1 x3', ..., 'x6^2']

其中x1到x6对应的就是一次项系数,x1^2到x6^2对应的就是单个特征的二次项系数,剩下带空格的就是交叉项系数。

如何只得到你预期的12个系数?

如果你只想拟合每个特征的一次项和二次项,不想包含交叉项,有两种简单的方法:

方法1:手动构造特征

直接给原始数据集添加每个特征的平方项,再拟合线性回归:

# 复制原始训练集
X_quad = x_train.copy()
# 逐个添加特征的平方项
for col in x_train.columns:
    X_quad[f"{col}_sq"] = x_train[col] ** 2
# 拟合模型
qm = LinearRegression()
qm.fit(X_quad, y_train)
print(qm.coef_)  # 这里会得到12个系数,对应6个一次项+6个二次项

方法2:过滤PolynomialFeatures生成的交叉项

如果你还是想用PolynomialFeatures,可以先生成所有特征,再筛选出只包含单个特征的项:

poly = PolynomialFeatures(degree=2, include_bias=False)  # 关闭偏置项,让LinearRegression自己拟合截距
X_poly = poly.fit_transform(x_train)
# 获取所有特征的名称
feature_names = poly.get_feature_names_out(x_train.columns)
# 筛选出不包含交叉项的特征(名称里没有空格的)
selected_idx = [i for i, name in enumerate(feature_names) if ' ' not in name]
X_selected = X_poly[:, selected_idx]
# 拟合模型
qm = LinearRegression()
qm.fit(X_selected, y_train)
print(qm.coef_)  # 同样得到12个目标系数

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:02:31