use*_*328 7 machine-learning feature-selection python-2.7 scikit-learn multilabel-classification
我正在寻找使用 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)
Run Code Online (Sandbox Code Playgroud)
然后我计划使用以下方法提取每个标签包含的特征的索引:
selected_features = []
for i in multi_clf.estimators_:
selected_features += list(i.named_steps["chi2"].get_support(indices=True))
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是,如何选择要包含在最终模型中的选定特征?我可以使用每一个独特的特征(包括只与一个标签相关的特征),或者我可以做一些事情来选择与更多标签相关的特征。
我最初的想法是创建一个给定特征选择的标签数量的直方图,并根据视觉检查确定一个阈值。我担心的是这种方法是主观的。使用 sklearn 为多标签数据集执行特征选择是否有更原则性的方法?
mac*_*bua 10
根据本文的结论:
[...] 根据所有标签的平均或最大卡方得分对特征进行排名,从而得到大多数最好的分类器,同时使用较少的特征。
然后,为了选择一个好的功能子集,您只需要执行(类似)以下操作:
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
Run Code Online (Sandbox Code Playgroud)
注意:在上面的代码中,我假设 X 是某个文本向量化器(文本的矢量化版本)的输出,而 Y 是一个 Pandas 数据框,每个标签有一列(因此我可以选择列Y[label])。此外,还有一个阈值变量应该事先固定。
| 归档时间: |
|
| 查看次数: |
8350 次 |
| 最近记录: |