必须改用get_feature_names_out();该函数自scikit-learn 1.2起取代已移除的get_feature_names(),调用时须显式传入input_features(如X.columns),pyLDAvis等第三方库未适配时需手动绕过sklearn绑定层。

因为 get_feature_names 在 scikit-learn 1.0 就已被标记弃用,1.2 版本正式移除 —— 必须改用 get_feature_names_out。
报错现象和直接原因
运行含 get_feature_names() 的代码时,会看到两段典型输出:
- 先触发
FutureWarning:“Function get_feature_names is deprecated; please use get_feature_names_out instead” - 紧接着抛出
AttributeError: 'OneHotEncoder' object has no attribute 'get_feature_names'或类似错误
这不是环境没装好,也不是拼写错,而是 API 被硬性删除。scikit-learn 从 1.2 开始彻底清理了所有 get_feature_names 的实现,连旧版兼容逻辑都删了。
怎么把 get_feature_names() 改成 get_feature_names_out()?
绝大多数情况只需替换函数名,但要注意三点:
立即学习“Python免费学习笔记(深入)”;
-
get_feature_names_out()必须传入input_features参数(通常是原始列名列表),不能空着调用;例如:encoder.get_feature_names_out(['color']) - 如果之前用的是
StandardScaler().get_feature_names(),现在要改成scaler.get_feature_names_out(X.columns)—— 它不会自己猜列名,必须你告诉它 - 在
ColumnTransformer中,应统一调用preprocessor.get_feature_names_out(X.columns),而不是分别调各子转换器的接口
示例对比:
## 旧写法(1.2+ 报错)
names = encoder.get_feature_names()
<h2>新写法(必须指定输入列名)</h2><p>names = encoder.get_feature_names_out(['category_col'])</p><h2>Pipeline 场景下正确用法</h2><p>X_train = pd.DataFrame({'cat': ['A', 'B'], 'num': [1.0, 2.0]})
preprocessor.fit(X_train)
feature_names = preprocessor.get_feature_names_out(X_train.columns)为什么 verbose_feature_names_out=True 会让结果变复杂?
scikit-learn ≥ 1.2 默认开启 verbose_feature_names_out=True,这会导致 OneHotEncoder 返回带前缀的列名(如 ['cat_A', 'cat_B']),而老代码可能依赖无前缀名(['A', 'B'])做后续处理。
- 若想临时退回旧行为,显式设
OneHotEncoder(verbose_feature_names_out=False) - 但更推荐适配新格式:用
get_feature_names_out(['cat'])得到带前缀名,再用.str.replace('cat_', '')等方式清洗(如需) - 注意:
verbose_feature_names_out=False不等于恢复get_feature_names(),它只是让前缀消失,返回的仍是get_feature_names_out()的结果
pyLDAvis.sklearn.prepare 报错怎么办?
这是最典型的连带问题:你没直接调 get_feature_names,但 pyLDAvis.sklearn.prepare() 内部还在用它。
- 根本原因是 pyLDAvis 当前(截至 2026 年 10 月)尚未适配 sklearn 1.2+,仍调用已删除的接口
- 短期解法:降级 sklearn 到 1.1.x(不推荐,会错过安全更新和新功能)
- 推荐解法:改用
pyLDAvis.prepare()手动传入topic_term_dists、doc_topic_dists等底层结构,绕过 sklearn 绑定层 - 或等 pyLDAvis 发布兼容版本(可关注其 GitHub issues 中关键词 “sklearn 1.2”)
真正麻烦的不是函数名改了,而是很多第三方库卡在迁移半途 —— 它们调用 get_feature_names_out 时又漏传 input_features,反而引发新报错。所以检查依赖库版本比改自己代码更费时间。


















