使用scikit Python包进行决策树时出现66k特征的内存错误

1 投票
1 回答
1077 浏览
提问于 2025-04-18 01:33

问题描述

我有一个包含1600000行和大约66000个特征的文档。 我正在使用“词袋模型”来构建决策树。 以下代码在处理1000行的文档时运行良好,但在处理实际的1600000行文档时却出现了内存错误。 我的服务器有64GB的内存。

有没有办法直接使用稀疏矩阵,而不是使用.todense().toarray()?或者有没有办法减少默认的float64类型? 请帮帮我。

代码:

vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5,stop_words='english')
X_train = vectorizer.fit_transform(corpus)

clf = tree.DecisionTreeClassifier()
clf = clf.fit(X_train.todense(),corpus2)

错误:

Traceback (most recent call last):
  File "test123.py", line 103, in <module>
    clf = clf.fit(X_train.todense(),corpus2)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/base.py", line 458, in todense
    return np.asmatrix(self.toarray())
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 550, in toarray
    return self.tocoo(copy=False).toarray()
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/coo.py", line 219, in toarray
    B = np.zeros(self.shape, dtype=self.dtype)
MemoryError

简而言之,有没有方法可以在包含66000个特征的大型数据集上使用分类树?

1 个回答

0

添加 dtype=np.float32,比如:vec = TfidfVectorizer(..., dtype=np.float32)

至于稀疏和密集数据,我也遇到过类似的问题。像 GradientBoostingClassifier、RandomForestClassifier 或 DecisionTreeClassifier 这些模型需要密集数据,所以我选择使用 SVC。

撰写回答