Numpy sklearn:在基于L1的特征选择后获取特征名称

Numpy sklearn:在基于L1的特征选择后获取特征名称,numpy,machine-learning,scikit-learn,Numpy,Machine Learning,Scikit Learn,证明当使用scikit learn的一个专用功能选择例程执行功能选择时,可以按如下方式检索所选功能的名称: np.asarray(vectorizer.get_feature_names())[featureSelector.get_support()] 例如,在上述代码中,featureSelector可能是sklearn.feature\u selection.SelectKBest或sklearn.feature\u selection.SelectPercentile的一个实例,因为这

证明当使用scikit learn的一个专用功能选择例程执行功能选择时,可以按如下方式检索所选功能的名称:

np.asarray(vectorizer.get_feature_names())[featureSelector.get_support()]
例如,在上述代码中,
featureSelector
可能是
sklearn.feature\u selection.SelectKBest
sklearn.feature\u selection.SelectPercentile
的一个实例,因为这些类实现了
get\u support
方法,该方法返回所选功能的布尔掩码或整数索引


当一个人表演时,不清楚如何做到这一点
sklearn.svm.LinearSVC
没有
get_support
方法,文档中没有明确说明在使用其
transform
方法从样本集合中消除特征后如何检索特征索引。我在这里遗漏了什么吗?

对于稀疏估计,您通常可以通过检查非零项在系数向量中的位置来找到支持度(前提是存在系数向量,例如线性模型)

对于带有l1惩罚的
LinearSVC
,相应地

from sklearn.svm import LinearSVC
svc = LinearSVC(C=1., penalty='l1', dual=False)
svc.fit(X, y)
selected_feature_names = np.asarray(vectorizer.get_feature_names())[np.flatnonzero(svc.coef_)]

我一直在使用sklearn 15.2,根据,coef_是一个数组,如果n_类==2个其他[n_类,n_特征],那么shape=[n_特征]。
所以首先,
np.flatnonzero
不适用于多类。您将有索引超出范围错误。其次,它应该是
np.where(svc.coef.=0)[1]
而不是
np.where(svc.coef.=0)[0]
。0是类的索引,而不是功能。最后我使用了
np.asarray(vectorizer.get\u feature\u names())[list(set(np.where(svc.coef.=0)[1])]

谢谢!我必须对您的回复进行一次编辑才能使其生效(添加了一个对numpy.flatnonzero的调用)。一旦编辑被接受,我会将你的答案标记为已接受(我不想同时混淆任何人)。谢谢。等效地,您可以使用
np.where(svc.coef!=0)[0]
而不是
np.flatnonzero
。(你的第二次编辑被拒绝了,所以我做了你建议的补充更正)是的,这在多类中变得很混乱。谢谢你的提醒。然后,提取正确索引的一般方法应该是
np。其中(svc.coef_!=0)[-1]
,即最后一个索引,它将适用于二进制和多类问题。
from sklearn.svm import LinearSVC
svc = LinearSVC(C=1., penalty='l1', dual=False)
svc.fit(X, y)
selected_feature_names = np.asarray(vectorizer.get_feature_names())[np.flatnonzero(svc.coef_)]