使用sklearn选择多标签功能

时间:2016-05-04 20:30:07

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

我希望使用sklearn使用多标签数据集执行功能选择。我希望获得标签的最终功能集,然后我将在另一个机器学习包中使用。我打算使用我看到的方法here,它分别为每个标签选择相关的功能。

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 个答案:

答案 0 :(得分:2)

根据paper中的结论:

  

[...]根据平均值或最大值对要素进行排名   所有标签上的卡方评分都是最好的   分类器使用较少的功能。

然后,为了选择一个很好的功能子集,您只需要这样做(例如):

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数据帧,每个标签有一列(所以我可以选择列{{ 1}})。此外,还有一个应该事先修复的阈值变量。

答案 1 :(得分:0)

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

有很多选项,但SelectKBest和Recursive功能消除是两个相当受欢迎的选项。

RFE的工作原理是将一致的特征留出模型,重新训练,并比较结果,以便最后留下的特征能够实现最佳的预测精度。

最好的是高度依赖于您的数据和用例。

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