7

我正在尝试在多标签场景中将特征选择作为 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: bad input shape

这是有道理的,因为它需要维度 [#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 模型时,如何获得它?

4

1 回答 1

9

按照您的设置方式,每个班级将有一个 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()
于 2015-09-13T15:30:40.817 回答