如何在scikit中减少LinearSVC后获取所选功能

时间:2015-07-07 18:43:38

标签: scikit-learn svm feature-selection

标题说明了一切,我检查了scikit个文档,这些文档对于此特定任务非常差,我检查了几个在线资源,包括this帖子。

然而,他们似乎错了。对于功能选择,我们可以执行以下操作:

clf=LinearSVC(penalty="l1",dual=False,random_state=0)
X_reduced = clf.fit_transform(X_full,y_full)

现在,如果我们检查X_reduced的形状,很明显选择了多少个特征。现在的问题是,哪些?

coef_的{​​{1}}属性非常重要,建议对其进行迭代,LinearSVC与零不同的要素是选中的。好吧,这是错误的,但你可以非常接近实际结果。

在检查coef_之后,我注意到我有310个选定的功能,这是肯定的,我的意思是,我正在检查结果矩阵,现在,如果我执行X_reduced的事情,414个功能从总共2000个中选出,所以它接近真实的东西。

根据scikit LinearSVC docscoef_涉及mean(X),但我被卡住了,不知道现在该做什么。

更新:这是link,其中包含重现错误的数据和代码,只需几KB

1 个答案:

答案 0 :(得分:1)

我认为LinearSVC()会返回非零系数的要素。您能否上传可以重现您看到的不一致的示例数据文件和代码脚本(例如,通过dropbox sharelink)?

from sklearn.datasets import make_classification
from sklearn.datasets import load_svmlight_file
from sklearn.svm import LinearSVC
import numpy as np

X, y = load_svmlight_file("/home/Jian/Downloads/errorScikit/weirdData")

transformer = LinearSVC(penalty='l1', dual=False, random_state=0)
transformer.fit(X, y)
# set threshold eps
X_reduced = transformer.transform(X, threshold=np.finfo(np.float).eps)

print(str(X_reduced.shape[1]) + " is NOW equal to " + str((transformer.coef_ != 0).sum()))

414 is NOW equal to 414


# as suggested by user3914041, if you want both sides are 310
transformer.transform(X).shape

Out[46]: (62, 310)

(abs(transformer.coef_) > 1e-5).sum()

Out[47]: 310