2

我有 5+ 百万数据来预测人们的种族。一个文本特征会产生数以万计的特征。例如,名称“Smith”会产生“sm”、“mi”、“it”等。然后我需要将其转换为一些稀疏矩阵

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer()
X2= vec.fit_transform(measurements)

由于生成的特征数以万计,我不能使用以下给我一个数组,否则我会收到内存不足的错误。

X = vec.fit_transform(measurements).toarray()

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

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
4

2 回答 2

0

正如您所注意到的,您可能无法将文本特征转换为 numpy 数组。
因此,您需要专注于可以处理稀疏数据的技术。

PCA 不是其中之一。
原因是 PCA对数据进行了居中,这使得数据变得密集(想象一个稀疏矩阵,然后对每个元素减去 0.5)。

这个 SO 答案提供了更多解释和替代方法:

澄清一下:PCA 在数学上定义为使数据居中(去除每个特征的平均值),然后对居中的数据应用截断的 SVD。

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

在文本数据的上下文中,在 aTfidfVectorizer或 a之后执行 SVDCountVectorizer实际上是一种称为潜在语义分析的著名技术。

至于特征选择部分,您可能必须修改评分函数的源代码(例如chi2),以便它处理稀疏矩阵而不使它们变得密集。
有可能,这主要是在保持矩阵的稀疏性和使用有效的数组操作之间进行权衡。

在你的情况下,虽然我会尝试先把它扔给分类器,看看额外的工作是否值得你花时间。

于 2015-10-26T21:50:00.887 回答
0

我不确定这是否会有所帮助,但您可以尝试将 X2 切成更小的部分(但仍然尽可能大),然后IncrementalPCA在它们上使用。

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 常量更改为更大的数字。

于 2015-10-25T08:38:06.713 回答