scikit中LinearSVC缩减后如何获取选中的特征

Posted

技术标签:

【中文标题】scikit中LinearSVC缩减后如何获取选中的特征【英文标题】:How to get the selected features after LinearSVC reduction in scikit 【发布时间】:2015-09-25 10:16:45 【问题描述】:

标题说明了一切,我查看了 scikit 文档,这些文档对于这个特定任务来说非常糟糕,并且我查看了几个在线资源,包括 this 帖子。

但是,他们似乎错了。对于特征选择,我们可以这样做:

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

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

LinearSVCcoef_ 属性非常重要,建议对其进行迭代,选择coef_ 不为零的特征。好吧,这是错误的,但您可以非常接近真实结果。

在检查X_reduced 之后,我注意到我选择了 310 个特征,这是肯定的,我的意思是,我正在检查结果矩阵,现在,如果我执行 coef_ 的事情,则选择了 414 个特征,来自一共2000,所以很接近实物。

根据 scikit LinearSVC docs,mean(X) 涉及到 Threshold=None,但我被困住了,不知道现在该做什么。

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

【问题讨论】:

【参考方案1】:

我认为LinearSVC() 确实返回具有非零系数的特征。您能否上传可以重现您看到的不一致的示例数据文件和代码脚本(例如,通过 dropbox 共享链接)?

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

【讨论】:

谢谢,这里是:link @nxgtrturbo 我看到了和你一样的不一致。如果我将阈值设置为一个非常小的值(例如,eps 这里),它会给出预期的结果。 是的,但是目标是在两边都达到 310,因为这是自定义管道的一部分,它获得了几种不同的缩减方法(并非所有方法都使用阈值)。你会说这是一个错误吗?或者至少是错误的文档? @nxgtrturbo 我同意the docs 不是最精确的。他们确实提到您可以设置阈值,但我没有看到任何地方都写有默认值。但是查看源代码可以看到,对于 L1 惩罚,阈值默认为 1e-5。 @nxgtrturbo 正如@user3914041 所建议的,源代码transformer.transform?? 表明1e-5 被用作默认阈值。我已经修改了代码给你 310。

以上是关于scikit中LinearSVC缩减后如何获取选中的特征的主要内容,如果未能解决你的问题,请参考以下文章

SK了解如何获取 LinearSVC 分类器的决策概率

scikit-learn 中的 SVC 和 LinearSVC 在啥参数下是等效的?

为 LinearSVC 计算 scikit 中每个样本 x 的概率估计 P(y|x)

LinearSVC sklearn (scikit-learn) 中 C 的行为

多处理 scikit-learn

scikit-learn:如何缩减“y”预测结果