不是。PolynomialFeatures默认生成所有不超过指定阶数的项,包括常数项、一次项、幂项(如a²、b²)和交互项(如ab);仅当设置interaction_only=True且include_bias=False时,才排除幂项和常数项。

PolynomialFeatures 默认只生成交互项吗?
不是。PolynomialFeatures 默认会生成所有不超过指定阶数的单项、交互项和幂项。比如 degree=2 时,输入特征 [a, b] 会产出:[1, a, b, a², ab, b²] —— 包含常数项、一次项、平方项和交叉项。
如果你只要纯交互项(即排除 a²、b² 等幂项,也排除常数项和一次项),必须显式设置参数:
-
interaction_only=True:禁用幂项(如a²),只保留不同特征间的乘积项 -
include_bias=False:去掉常数项1 - 再配合
degree=2,才能得到严格意义上的二阶交互项:[a, b, ab](注意:一次项仍保留;若连一次项也不要,得手动剔除)
如何只保留 a×b、a×c 这类指定交互项?
PolynomialFeatures 不支持按名称或索引定制交互组合,它总是穷举所有满足条件的组合。想实现“指定交互”,得绕开它:
- 用
pandas手动构造:df['a_b'] = df['a'] * df['b'],再pd.concat回原数据 - 用
sklearn.preprocessing.FunctionTransformer封装自定义函数,例如只计算第 0 和第 1 列的乘积 - 写个简单循环或
itertools.combinations构建列名对,再批量相乘——适合中等规模特征集
硬塞进 PolynomialFeatures 再删列不仅冗余,还容易因列序变动出错。
fit_transform 时遇到 ValueError: Found array with 0 sample(s)
这个错误通常不是数据为空,而是传入了空的二维结构,比如 np.array([]).reshape(0, n_features) 或 pandas 空 DataFrame。但更隐蔽的常见原因是:PolynomialFeatures 对 NaN 值零容忍,且不报明确提示,而是内部运算失败后抛出看似无关的维度错误。
- 务必在调用前检查缺失值:
np.isnan(X).any()或X.isnull().values.any() - 缺失值不能靠
PolynomialFeatures自动处理,必须先用SimpleImputer或其他方式填充 - 如果 X 是稀疏矩阵(如
scipy.sparse.csr_matrix),确保它非空且格式合法;某些旧版 scikit-learn 对稀疏输入的交互项支持不稳定
交互后特征爆炸,训练变慢甚至内存溢出怎么办?
PolynomialFeatures 的输出维度增长极快:n 个原始特征 + degree=d → 组合数为 C(n+d, d)。10 个特征做 degree=3 就会产生 286 列;100 个特征直接到 176851 列。
- 优先用
interaction_only=True限制为二阶,避免高次幂带来的冗余 - 在交互前做特征筛选:用
VarianceThreshold去掉低方差特征,或用单变量统计(如f_classif)预筛 - 交互后立即跟
StandardScaler—— 否则ab量级可能远超a,导致后续模型(如线性回归、SVM)数值不稳定 - 真要上高维交互,考虑替代方案:树模型(天然支持隐式交互)、
sklearn.ensemble.HistGradientBoostingClassifier(支持自动特征组合),或用FeatureHasher降维
交互不是万能增强器,尤其当原始特征本身噪声大或业务意义模糊时,生成的 ab 可能比 a 和 b 更难解释、更易过拟合。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











