我有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发布于 2015-10-25 16:38:07
我不确定这是否会有帮助,但您可以尝试将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-27 05:50:01
正如您所注意到的,您可能无法将文本特征转换为numpy数组。
因此,您需要专注于能够处理稀疏数据的技术。
PCA并不是其中之一。
原因是主成分分析对数据执行居中,这使得数据密集(想象一个稀疏矩阵,然后对每个元素减去0.5 )。
This SO answer提供了更多解释和替代方案:
澄清:主成分分析在数学上被定义为将数据居中(去除每个特征的平均值),然后对居中的数据应用截断奇异值分解。
由于将数据居中将破坏稀疏性并迫使通常不再适合内存的密集表示,因此通常直接对稀疏数据进行截断SVD (不居中)。这类似于PCA,但并不完全相同。
在文本数据的上下文中,在TfidfVectorizer或CountVectorizer之后执行奇异值分解实际上是一种著名的技术,称为潜在语义分析。
至于特征选择部分,您可能必须修改评分函数的源代码(例如chi2),以便它可以处理稀疏矩阵,而不会使它们变得密集。
这是可能的,这主要是保持矩阵的稀疏性和使用有效的数组操作之间的权衡。
不过,在您的情况下,我会先尝试将其放在分类器中,看看这些额外的工作是否值得您花费时间。
https://stackoverflow.com/questions/33324030
复制相似问题