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
相关产品推荐
相关产品推荐

