首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这些是在Scikit learn中使用DictVectorizer的不可调和的缺点吗?

这些是在Scikit learn中使用DictVectorizer的不可调和的缺点吗?
EN

Stack Overflow用户
提问于 2015-10-25 06:25:57
回答 2查看 434关注 0票数 2

我有5+百万数据来预测人们的种族。一个文本特征会产生数万个文本特征。例如,名字'Smith‘会产生'sm','mi',’it‘……然后我需要将它转换成一些稀疏矩阵

代码语言:javascript
复制
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
X2= vec.fit_transform(measurements)

因为生成了成千上万的特性,所以我不能使用下面的代码来给我一个数组,否则我会得到一个内存不足的错误。

代码语言:javascript
复制
X = vec.fit_transform(measurements).toarray()

据我所知,scikilearn中的许多其他函数/模块只允许拟合数组格式的数据。例如:用于降维和特征选择的http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCAhttp://scikit-learn.org/stable/modules/feature_selection.html

代码语言:javascript
复制
pca = PCA(n_components=2)
pca.fit(X) # X works but not X2, though I can't get X with my big data set because of out-of-memory error
EN

回答 2

Stack Overflow用户

发布于 2015-10-25 16:38:07

我不确定这是否会有帮助,但您可以尝试将X2分成较小的部分(但仍然尽可能大),并对它们使用IncrementalPCA

代码语言:javascript
复制
from sklearn.utils import gen_batches
from sklearn.decomposition import IncrementalPCA

pca = IncrementalPCA()
n_samples, n_features = X2.shape
batchsize = n_features*5
for slice in gen_batches(n_samples, batchsize):
    pca.partial_fit(X2[slice].toarray())

如果您的RAM大小允许,您可以将该5常量更改为某个更大的数字。

票数 0
EN

Stack Overflow用户

发布于 2015-10-27 05:50:01

正如您所注意到的,您可能无法将文本特征转换为numpy数组。

因此,您需要专注于能够处理稀疏数据的技术。

PCA并不是其中之一。

原因是主成分分析对数据执行居中,这使得数据密集(想象一个稀疏矩阵,然后对每个元素减去0.5 )。

This SO answer提供了更多解释和替代方案:

澄清:主成分分析在数学上被定义为将数据居中(去除每个特征的平均值),然后对居中的数据应用截断奇异值分解。

由于将数据居中将破坏稀疏性并迫使通常不再适合内存的密集表示,因此通常直接对稀疏数据进行截断SVD (不居中)。这类似于PCA,但并不完全相同。

在文本数据的上下文中,在TfidfVectorizerCountVectorizer之后执行奇异值分解实际上是一种著名的技术,称为潜在语义分析。

至于特征选择部分,您可能必须修改评分函数的源代码(例如chi2),以便它可以处理稀疏矩阵,而不会使它们变得密集。

这是可能的,这主要是保持矩阵的稀疏性和使用有效的数组操作之间的权衡。

不过,在您的情况下,我会先尝试将其放在分类器中,看看这些额外的工作是否值得您花费时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33324030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档