使用sklearn进行多标签特征选择

7

我希望使用sklearn对多标签数据集进行特征选择。我想要获取跨标签的最终特征集,然后在另一个机器学习包中使用这些特征。我原计划采用此处所述的方法,该方法会单独为每个标签选择相关特征。

from sklearn.svm import LinearSVC
from sklearn.feature_selection import chi2, SelectKBest
from sklearn.multiclass import OneVsRestClassifier
clf = Pipeline([('chi2', SelectKBest(chi2, k=1000)),
                ('svm', LinearSVC())])
multi_clf = OneVsRestClassifier(clf)

我计划使用以下方法提取每个标签的包含特征的索引:

selected_features = []
for i in multi_clf.estimators_:
    selected_features += list(i.named_steps["chi2"].get_support(indices=True))

现在,我的问题是,如何选择要包含在最终模型中的选定特征?我可以使用每个独特的功能(这将包括仅对一个标签有关的功能),或者我可以执行一些操作以选择与更多标签相关的功能。

我的初始想法是创建给定功能被选择为的标签数量的直方图,并根据视觉检查识别阈值。我的担忧是这种方法是主观的。是否有一种更有原则的方法使用sklearn为多标签数据集执行特征选择?

2个回答

11
根据这篇论文的结论:

[...] 将特征按照所有标签上的平均或最大卡方分数排序,可导致使用更少的特征即可得到大多数最佳分类器。

因此,为了选择好的特征子集,只需执行类似于下面的操作:

from sklearn.feature_selection import chi2, SelectKBest

selected_features = [] 
for label in labels:
    selector = SelectKBest(chi2, k='all')
    selector.fit(X, Y[label])
    selected_features.append(list(selector.scores_))

// MeanCS 
selected_features = np.mean(selected_features, axis=0) > threshold
// MaxCS
selected_features = np.max(selected_features, axis=0) > threshold
注意: 在上面的代码中,我假设X是某个文本向量化程序的输出(即文本的向量化版本),Y是一个带有每个标签一列的pandas数据框,这样我就可以选择列Y [label]。此外,还有一个阈值变量应该事先固定。

1

http://scikit-learn.org/stable/modules/feature_selection.html

有很多选择,但SelectKBest和递归特征消除是两个相当受欢迎的选项。

递归特征消除通过从模型中删除无用的特征,并重新训练和比较结果,从而使最后剩下的特征能够实现最佳预测精度。

最佳选择高度依赖于您的数据和使用情况。

除了可以笼统地描述为交叉验证方法的特征选择方法之外,您还可以查看贝叶斯模型选择,这是一种更理论的方法,倾向于简单模型而不是复杂模型。


1
据我所知,sklearn中的特征选择方法适用于二元分类器。您可以单独获取每个标签的选定特征,但我的问题是如何以原则性的方式确定适用于所有标签的最终特征集合。 - Taylor
我不确定我理解你的意思。例如,SelectKBest是模型无关的,并且在文档中可以看到RFE的示例,向您展示如何获取最终的特征集。http://scikit-learn.org/stable/auto_examples/feature_selection/plot_rfe_with_cross_validation.html#example-feature-selection-plot-rfe-with-cross-validation-py此外,许多/大多数实现了一个变换功能,该功能将从输入中选择经过训练的最佳特征。 - Chris
但是这个最终的特征集只适用于一个分类器,对吧?由于二元相关方法将多标签分类问题分解为一系列二元分类问题,因此该最终特征集仅对我的许多标签中的一个进行相应。我将为每个单独的标签返回一个由特征选择方法返回的特征集,但我想将所选特征组合起来创建一个适用于所有标签的特征集。 - Taylor
我发布的链接中有一个8类、25特征分类问题的工作示例,RFECV特征选择方法可以处理该问题。我知道one v all分类器可能不符合您的要求,但是还有许多其他方法可以完全满足您的需求,就像我提供的链接一样。特征选择不必使用与最终形式相同的模型进行,而且采用这种方法可以增加模型过度拟合的难度,这种方法也是有效的。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接