使用Scikit Learn的DictVectorizer时,toarray中的MemoryError

Gay*_*tri 3 python scipy scikit-learn

我正在尝试在我的数据上实现SelectKBest算法,以获得最佳功能.为此,我首先使用DictVectorizer预处理我的数据,数据由1061427行和15个功能组成.每个功能都有许多不同的值,我相信由于高基数,我会收到内存错误.

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以做到这一点?当我在具有256GB RAM的计算机上处​​理时,为什么会出现内存错误.

任何帮助表示赞赏!

Gay*_*tri 5

我解决了这个问题.

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

  • 删除基数非常高的列不是解决方案,这不是根本问题。问题是`toarray()`。sklearn的DictVetorizer就是为此目的而设计的-矢量化具有高基数的分类特征。在下面阅读我的评论。 (2认同)

icm*_*icm 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},
    ]
Run Code Online (Sandbox Code Playgroud)

    [ {A:1,B:22.1,C:Red,D:AB12},
      {C:Blue},
  {C:Green,D:AB65},
    ]
Run Code Online (Sandbox Code Playgroud)

这节省了很多空间。