多项式回归中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
相关产品推荐
相关产品推荐

