【问题标题】:scikit-learn: get selected features when using SelectKBest within pipelinescikit-learn:在管道中使用 SelectKBest 时获取选定的功能
【发布时间】:2015-12-09 04:57:23
【问题描述】:

我正在尝试在多标签场景中将特征选择作为 scikit-learn 管道的一部分。我的目的是为某些给定的 k 选择最佳的 K 个特征。

这可能很简单,但我不明白在这种情况下如何获取选定的特征索引。

在常规情况下,我可以这样做:

anova_filter = SelectKBest(f_classif, k=10)

anove_filter.fit_transform(data.X, data.Y)

anova_filter.get_support()

但在多标签场景中,我的标签尺寸是 #samples X #unique_labels 所以 fit 和 fit_transform 产生以下异常: ValueError: 错误的输入形状

这是有道理的,因为它需要维度 [#samples] 的标签

在多标签场景中,这样做是有意义的:

clf = Pipeline([('f_classif', SelectKBest(f_classif, k=10)),('svm', LinearSVC())])

multiclf = OneVsRestClassifier(clf, n_jobs=-1)

multiclf.fit(data.X, data.Y)

但是我得到的对象是 sklearn.multiclass.OneVsRestClassifier 类型,它没有 get_support 函数。在管道期间使用经过训练的 SelectKBest 模型时,如何获得它?

【问题讨论】:

    标签: machine-learning scikit-learn classification feature-selection multilabel-classification


    【解决方案1】:

    按照您的设置方式,每个班级将有一个 SelectKBest。那是你的意图吗? 你可以通过

    multiclf.estimators_[i].named_steps['f_classif'].get_support()
    

    如果您想为所有 OvR 模型选择一个功能, 你可以做

    clf = Pipeline([('f_classif', SelectKBest(f_classif, k=10)),
                    ('svm', OneVsRestClassifier(LinearSVC()))])
    

    并获得单个特征选择

    clf.named_steps['f_classif'].get_support()
    

    【讨论】:

    • 谢谢安德烈亚斯。我实际上尝试过,但我得到了 ValueError: bad input shape exception。即使我使用 OneVsRestClassifier,它似乎也没有得到 multilebel 场景。有什么想法吗?
    • 你尝试了哪一个?第一个?如果没有回溯,我真的不能说。
    • 好的,一些调试和表示更改并且它起作用了。谢谢!
    • clf.name_steps['f_classif'].get_support() 应该读作 clf.named_steps['f_classif'].get_support() 在“命名”的末尾缺少一个“d”
    • 嗨 .. 通过 get_support(indices = True) 返回的索引和通过 p_values 返回的索引(在选择最小的“k”p 值之后)似乎不一样。你能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 2018-10-27
    • 2021-03-17
    • 2022-11-26
    • 2015-08-14
    • 2014-05-01
    • 1970-01-01
    • 2018-07-21
    相关资源
    最近更新 更多