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 时出现“管道的最后一步”错误?
使用 GridSearchCV scikit-learn 在管道中的 KMeans