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

Scikit-Learn feature_names_in_属性使用场景的困惑与疑问

关于Scikit-Learn中feature_names_in_属性的正确用法

你搞混了文档里“特征为纯字符串”的意思——这里指的是特征的名称(列名)是字符串,不是特征的取值是字符串。这是很多人容易踩的坑,下面结合你的场景一步步说清楚:

为什么直接传字符串特征会报错?

chi2卡方检验是基于频数/数值统计的,必须接收数值型特征矩阵,直接传[['A','B','C'], ['A','B','D']]这种字符串取值的列表,模型根本没法计算统计量,所以报错是必然的,必须先把字符串特征转成数值型(比如用TfidfVectorizer或CountVectorizer)。

转成数值后怎么获取保留的特征名称?

你用TfidfVectorizer转成浮点数组后,数组本身没有列名信息,所以SelectKBest的feature_names_in_不会被设置。正确的做法是结合Vectorizer的特征名称和SelectKBest的筛选掩码:

from sklearn.feature_selection import SelectKBest, chi2
from sklearn.feature_extraction.text import TfidfVectorizer

# 先把嵌套列表转成TfidfVectorizer能处理的文本格式
X_text = [' '.join(x) for x in [['A', 'B', 'C'], ['A', 'B', 'D']]]
y = ['Blue', 'Green']

# 1. 向量化并获取所有特征名称
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(X_text)
all_feature_names = vectorizer.get_feature_names_out()

# 2. 执行特征选择
selector = SelectKBest(chi2, k=2)
selector.fit(X, y)

# 3. 筛选出被保留的特征名称
selected_features = all_feature_names[selector.get_support()]
print(selected_features)

怎么让SelectKBest拥有feature_names_in_属性?

如果你希望selector.feature_names_in_能直接访问,需要给输入的数值矩阵加上列名——用pandas的DataFrame包装即可:

import pandas as pd

# 把向量化后的数组转成带列名的DataFrame
X_df = pd.DataFrame(X.toarray(), columns=all_feature_names)

# 用DataFrame训练SelectKBest
selector = SelectKBest(chi2, k=2)
selector.fit(X_df, y)

# 现在可以直接访问feature_names_in_
print(selector.feature_names_in_)
# 再结合筛选掩码得到保留的特征
selected_features = selector.feature_names_in_[selector.get_support()]

总结文档的真实含义

文档里说“该属性仅在特征为纯字符串时可用”,准确意思是:当输入的特征矩阵的列名是字符串类型时,feature_names_in_才会被赋值。如果输入是无列名的numpy数组,这个属性就不会存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:06:02