【问题标题】:sklearn: get feature names after L1-based feature selectionsklearn:在基于 L1 的特征选择后获取特征名称
【发布时间】:2014-09-20 08:56:12
【问题描述】:

This question and answer 证明,当使用 scikit-learn 的专用特征选择例程之一执行特征选择时,可以按如下方式检索所选特征的名称:

np.asarray(vectorizer.get_feature_names())[featureSelector.get_support()]

例如,在上面的代码中,featureSelector 可能是sklearn.feature_selection.SelectKBestsklearn.feature_selection.SelectPercentile 的一个实例,因为这些类实现了get_support 方法,该方法返回一个布尔掩码或所选特征的整数索引。

当执行feature selection via linear models penalized with the L1 norm 时,不清楚如何完成此操作。 sklearn.svm.LinearSVC 没有 get_support 方法,并且文档没有明确说明在使用其 transform 方法从样本集合中消除特征后如何检索特征索引。我在这里遗漏了什么吗?

【问题讨论】:

    标签: numpy machine-learning scikit-learn


    【解决方案1】:

    对于稀疏估计器,您通常可以通过检查非零条目在系数向量中的位置来找到支持(假设存在系数向量,例如线性模型就是这种情况)

    support = np.flatnonzero(estimator.coef_)
    

    对于你的 LinearSVC 和 l1 惩罚,它会相应地

    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_)]
    

    【讨论】:

    • 谢谢!我必须对您的回复进行一次编辑才能使其正常工作(添加了对 numpy.flatnonzero 的调用)。接受编辑后,我会将您的答案标记为已接受(在此期间我不想混淆任何人)。
    • 谢谢。等效地,您可以使用np.where(svc.coef_ != 0)[0] 而不是np.flatnonzero。 (你的第二次修改被拒绝了,所以我做了你建议的补充更正)
    【解决方案2】:

    我一直在使用 sklearn 15.2,根据 LinearSVC documentation,coef_ 是一个数组,如果 n_classes == 2 则形状 = [n_features] 否则 [n_classes, n_features]。 所以首先,np.flatnonzero 不适用于多类。您将遇到索引超出范围错误。其次,它应该是 np.where(svc.coef_ != 0)[1] 而不是 np.where(svc.coef_ != 0)[0] 。 0 是类的索引,而不是特征。我最终使用了np.asarray(vectorizer.get_feature_names())[list(set(np.where(svc.coef_ != 0)[1]))]

    【讨论】:

    • 没错,这在多类中会变得一团糟。感谢您的提醒。提取正确索引的一般方法应该是np.where(svc.coef_ != 0)[-1],即最后一个索引,它适用于二元和多类问题。
    猜你喜欢
    • 2017-06-03
    • 2012-12-17
    • 2016-08-06
    • 1970-01-01
    • 2017-02-10
    • 2017-04-06
    • 2019-01-12
    • 2018-09-01
    • 2017-04-26
    相关资源
    最近更新 更多