二阶多项式回归特征生成异常: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
相关产品推荐
相关产品推荐

