get_feature_names_out 是 scikit-learn 1.0 起强制替代 get_feature_names 的标准接口,必须在 fit 或 fit_transform 后调用,返回 ndarray of str,行为因 estimator 类型而异,且无 set_output 自动返回 dataframe 功能。

get_feature_names_out 是标准接口,不是“推荐用”,而是“必须用”
从 scikit-learn 1.0 开始,get_feature_names 被正式标记为 deprecated;到 1.2 版本,它已被完全移除。如果你还在代码里写 vectorizer.get_feature_names(),运行时会触发 FutureWarning,升级后直接抛 AttributeError。这不是风格偏好,是 API 断层——旧方法已不存在。
调用 get_feature_names_out 前必须先 fit 或 fit_transform
这个方法不接受未拟合对象的调用,否则报 NotFittedError。常见错误是:先初始化 CountVectorizer,再直接调 .get_feature_names_out(),中间漏了 .fit() 或 .fit_transform()。
- 正确顺序:先
vectorizer.fit(corpus)或vectorizer.fit_transform(corpus),再调.get_feature_names_out() - 如果只用
transform()(没 fit 过),也会失败——它不学习词汇表,也就无特征名可返回 -
get_feature_names_out()返回的是numpy.ndarrayofstr,不是 list,别用.append()或下标赋值去改它
不同 estimator 的 get_feature_names_out 行为差异很大
它不是万能列名生成器,输出取决于 estimator 类型和参数配置:
-
CountVectorizer和TfidfVectorizer:返回实际提取的词项,如['and', 'document', 'first'] -
StandardScaler(≥1.2):默认返回['x0', 'x1'],除非你传入feature_names_in_并启用convert_dtype=True -
OneHotEncoder(≥1.0):若输入是 DataFrame 且设了drop='first',返回名会带后缀如['category_A', 'category_B'],但sparse=True时可能打乱顺序 -
ColumnTransformer:必须显式传input_features=X.columns,否则各分支 fallback 到默认命名
为什么不能靠 set_output 自动返回 DataFrame?
网上流传的 set_output 方法根本不存在——scikit-learn 没提供、没文档、没源码。想让 StandardScaler.transform() 返回 DataFrame?只能手动桥接:
- 确保输入是
pd.DataFrame,且.columns非空 - 调用
scaler.transform(X)得到 ndarray - 用
scaler.get_feature_names_out()拿列名,再套pd.DataFrame(..., columns=..., index=X.index) - 注意:sklearn 故意不自动返回 DataFrame,是为了避免 dtype 推断开销和跨库依赖,这点容易被忽略











