2014-06-16 168 views
3

我试图在我的数据上实现SelectKBest算法以获得最佳功能。为此,我首先使用DictVectorizer预处理数据,数据由1061427行和15个特征组成。每个功能都有很多不同的值,我相信由于高基数,我正在收到内存错误。使用Scikit的DictVectorizer学习时出现MemoryError学习

我得到以下错误:

File "FeatureExtraction.py", line 30, in <module> 
    quote_data = DV.fit_transform(quote_data).toarray() 
File "/usr/lib64/python2.6/site-packages/scipy/sparse/compressed.py", line 563, in toarray 
    return self.tocoo(copy=False).toarray() 
File "/usr/lib64/python2.6/site-packages/scipy/sparse/coo.py", line 233, in toarray 
    B = np.zeros(self.shape, dtype=self.dtype) 
MemoryError 

有没有办法,我能做到这一点任何替代办法?当我在具有256GB RAM的计算机上处​​理时,为什么会出现内存错误。

任何帮助表示赞赏!

+2

似乎你的错误来自'toarray'方法,而不是'DictVectorizer'。你必须把它变成数组吗? – Korem

+0

是的,我必须将它转换为一个数组。是否有任何其他方式来做到这一点? – Gayatri

+0

@TalKremerman我也尝试删除toarray()和改变Sparse = False的参数,我仍然得到相同的错误。这里是代码:DV = DictVectorizer(sparse = False) data = DV.fit_transform(data)and早些时候我写过DV = DictVectorizer(sparse = True) data = DV.fit_transform(data).toarray()。无论哪种方式,它都会给出一个0和1的二维数组,这是我需要输入到SelectKBest的。 – Gayatri

回答

1

执行fit_transform时,不是将整个字典传递给它,而是创建一个只有唯一出现的字典。 下面是一个例子:

变换词典:

之前

[ {A:1,B:22.1,C:Red,D:AB12}, 
     {A:2,B:23.3,C:Blue,D:AB12}, 
    {A:3,B:20.2,C:Green,D:AB65}, 
    ] 

[ {A:1,B:22.1,C:Red,D:AB12}, 
     {C:Blue}, 
    {C:Green,D:AB65}, 
    ] 

这节省了大量的空间。

5

我想出了这个问题。

当我删除了一个非常高基数的列DictVectorizer工作正常。该列拥有数百万个不同的唯一值,因此dictvectorizer给出了一个内存错误。

+1

删除具有很高基数的列不是一个解决方案,这不是根本问题。 问题是'toarray()'。 sklearn的DictVetorizer专为此目的而设计 - 向量化高基数的分类特征。阅读下面的评论。 – Serendipity

2

如果您的数据具有较高的基数,因为它代表的文字,你可以尝试使用资源友好的向量化样HashingVectorizer

1

问题是toarray()sklearn中的DictVetorizer(用于向量化具有高基数的分类特征),默认输出稀疏矩阵。 内存不足,因为您需要致电fit_transform().toarray()来进行密集表示。

只需使用:

quote_data = DV.fit_transform(quote_data) 
0

我用DictVectorizer到分类数据库条目转变成一个热载体,并不断收到此内存错误。我正在做出以下致命缺陷:d = DictVectorizer(sparse = False)。当我在2000或更多类别的某些字段上调用d.transform()时,python会崩溃。解决工作是实例DictVectorizer稀疏为真,顺便说一句是默认行为。如果你正在做很多类别项目的热表示,密集阵列并不是最有效的结构。在这种情况下调用.toArray()效率非常低。

矩阵乘法中一个热矢量的目的是从某个矩阵中选择一行或一列。这可以通过使用向量中存在1的索引简单地更高效地完成。这是一种隐含的乘法形式,它要求的运算量少于显式乘法运算所需的量级。

1

@Sendndipity使用fit_transform函数,我也跑进了内存错误。并删除列在我的情况下不是一个选项。所以我删除.toarray()和代码工作正常。

我运行两个测试使用较小的数据集有和没有.toarray()选项,并在这两种情况下,它产生了一个相同的矩阵。

总之,删除.toarray()完成了这项工作!