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
的形状,很清楚选择了多少特征。所以现在的问题是,哪些?
LinearSVC
的coef_
属性非常重要,建议对其进行迭代,选择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缩减后如何获取选中的特征的主要内容,如果未能解决你的问题,请参考以下文章
scikit-learn 中的 SVC 和 LinearSVC 在啥参数下是等效的?
为 LinearSVC 计算 scikit 中每个样本 x 的概率估计 P(y|x)