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

二阶多项式回归特征生成异常:10个输入特征生成超百变量,预期仅20+

问题原因

你遇到的特征数量远超预期的问题,是因为PolynomialFeatures默认会生成所有2阶交互项(即不同特征之间的乘积项,比如x1*x2、x1*x3等)。对于原特征数为n的数据集,2阶多项式的总特征数计算公式为:
总特征数 = n(一次项) + n*(n+1)/2(二次项+交互项)
比如原特征有14个时,总特征数为14 + 14*15/2 = 119,这就会超过100,而你预期的是仅保留原特征和各自的二次项(共2n个特征)。

解决方案

有两种简单的方法可以得到你需要的特征:

方法1:手动构造多项式特征

直接拼接原特征和各特征的二次项,跳过交互项的生成:

import numpy as np
# X为原特征矩阵,形状为(样本数, 原特征数)
X_poly = np.hstack([X, X**2])

这样得到的特征矩阵只包含原特征的一次项和各自的二次项,特征数量正好是2*原特征数,符合你的预期。

方法2:用PolynomialFeatures生成后筛选特征

如果想保留PolynomialFeatures的使用流程,可以先生成所有特征,再筛选出仅包含单个变量的项(一次项和二次项):

from sklearn.preprocessing import PolynomialFeatures
degree = 2
poly = PolynomialFeatures(degree, include_bias=False)
X_poly = poly.fit_transform(X)

# 获取所有特征名称
feature_names = poly.get_feature_names_out()
# 筛选仅包含单个变量的特征(排除带空格的交互项名称)
selected_cols = [i for i, name in enumerate(feature_names) if ' ' not in name]
# 提取筛选后的特征矩阵
X_poly_filtered = X_poly[:, selected_cols]
后续使用

处理完特征后,再进行数据集划分和模型训练即可:

from sklearn.model_selection import train_test_split
import statsmodels.api as sm

X_train_poly, X_test_poly = train_test_split(X_poly_filtered, test_size=0.2, random_state=42)
poly_model = sm.OLS(y_train, X_train_poly).fit()
print(poly_model.summary())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:35:15