scikit-learn:在管道中使用 SelectKBest 时获取选定的功能

Posted

技术标签:

【中文标题】scikit-learn:在管道中使用 SelectKBest 时获取选定的功能【英文标题】:scikit-learn: get selected features when using SelectKBest within pipeline 【发布时间】: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 模型时,如何获得它?

【问题讨论】:

【参考方案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 值之后)似乎不一样。你能解释一下吗?

以上是关于scikit-learn:在管道中使用 SelectKBest 时获取选定的功能的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 scikit-learn 中使用 make_pipeline 时出现“管道的最后一步”错误?

在 scikit-learn 管道中插入或删除步骤

scikit-learn 在管道中使用多个类预处理 SVM

使用 GridSearchCV scikit-learn 在管道中的 KMeans

如何在 scikit-learn 中使用管道调整自定义内核函数的参数

使用 Scikit-Learn 在管道中包含预测器