我希望使用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为多标签数据集执行特征选择?
根据本文的结论:
[…]根据平均值或最大值对特征进行排序Chi在所有标签上的得分均为平方,导致大多数最佳分类器,同时使用较少的特征。
然后,为了选择一个好的特性子集,你只需要做(类似的事情):
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是每个标签有一列的panda数据帧(所以我可以选择列Y[label]
)。此外,还有一个阈值变量应该事先固定。
http://scikit-learn.org/stable/modules/feature_selection.html
有很多选项,但SelectKBest和Recursive功能消除是两个相当流行的选项。
RFE的工作原理是将统一格式的特征排除在模型之外,再训练并比较结果,以便最后留下的特征能够实现最佳预测精度。
什么是最好的在很大程度上取决于您的数据和用例。
除了可以松散地描述为特征选择的交叉验证方法外,你还可以看看贝叶斯模型选择,这是一种更具理论性的方法,倾向于更简单的模型而不是复杂的模型。