我正在运行(或尝试)一个脚本来对文档进行分类。抛出错误的代码是:
X = df['text'].values
Y = np.asarray(df['label'], dtype=np.dtype(int))
text_clf = Pipeline([('vect', HashingVectorizer(ngram_range=(1,3), preprocessor=neg_preprocess, n_features=10000000)),
('tfidf', TfidfTransformer()),
('clf', SGDClassifier(loss='log', n_jobs=-1, penalty='elasticnet'))])
text_clf.fit(X, Y)
了解HashingVectorizer产生的内容:
<375175x10000000 sparse matrix of type '<type 'numpy.float64'>'
with 56324335 stored elements in Compressed Sparse Row format>
完整的错误和回溯是:
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-15-09ad11dfb82b> in <module>()
7 ('clf', SGDClassifier(loss='log', n_jobs=-1, penalty='elasticnet'))])
8
----> 9 text_clf.fit(X, Y)
10
11 print datetime.now()-startTime
D:UsersDBAnacondalibsite-packagessklearnpipeline.pyc in fit(self, X, y, **fit_params)
129 """
130 Xt, fit_params = self._pre_transform(X, y, **fit_params)
--> 131 self.steps[-1][-1].fit(Xt, y, **fit_params)
132 return self
133
D:UsersDBAnacondalibsite-packagessklearnlinear_modelstochastic_gradient.pyc in fit(self, X, y, coef_init, intercept_init, class_weight, sample_weight)
517 coef_init=coef_init, intercept_init=intercept_init,
518 class_weight=class_weight,
--> 519 sample_weight=sample_weight)
520
521
D:UsersDBAnacondalibsite-packagessklearnlinear_modelstochastic_gradient.pyc in _fit(self, X, y, alpha, C, loss, learning_rate, coef_init, intercept_init, class_weight, sample_weight)
416
417 self._partial_fit(X, y, alpha, C, loss, learning_rate, self.n_iter,
--> 418 classes, sample_weight, coef_init, intercept_init)
419
420 # fitting is over, we can now transform coef_ to fortran order
D:UsersDBAnacondalibsite-packagessklearnlinear_modelstochastic_gradient.pyc in _partial_fit(self, X, y, alpha, C, loss, learning_rate, n_iter, classes, sample_weight, coef_init, intercept_init)
359 if self.coef_ is None or coef_init is not None:
360 self._allocate_parameter_mem(n_classes, n_features,
--> 361 coef_init, intercept_init)
362
363 self.loss_function = self._get_loss_function(loss)
D:UsersDBAnacondalibsite-packagessklearnlinear_modelstochastic_gradient.pyc in _allocate_parameter_mem(self, n_classes, n_features, coef_init, intercept_init)
187 else:
188 self.coef_ = np.zeros((n_classes, n_features),
--> 189 dtype=np.float64, order="C")
190
191 # allocate intercept_ for multi-class
MemoryError:
整个训练集的特征向量的大小非常显著,但是每个文档都很短(约200个单词),并且特征集很小。我想稀疏矩阵处理数据不会有麻烦,但也许我完全错了?我监视了我的计算机上的资源消耗,当它失败时,它有足够的RAM剩余。
代码中是否存在导致此错误的内容?我想也许TfidfTransformer()
可能是罪魁祸首,因为它导致状态,但我从管道中删除了它,仍然有同样的错误。如果是特征向量大小的问题,肯定有办法处理大量数据……
我使用的是ippython notebook和python 2.7.6 Anaconda发行版。如果需要更多的信息,请告诉我。
我不认为它是矢量器,因为回溯显示它在以下行失败:
self.coef_ = np.zeros((n_classes, n_features), dtype=np.float64, order="C")
这会分配一个密集的 numpy数组,这会使用大量内存。它的形状是(n_classes, n_features)
, n_features
是你作为参数传递给矢量10M的相同的n_features
!你的数据集中有多少类?
一个快速而简单的解决方案是降低n_features
的值。或者,您可以尝试其他不将输入转换为密集数组的分类器。我不知道sklearn的哪个分类器能做到这一点。
PS这个问题展示了如何确定一个矩阵的实际内存大小。您可以验证它不是矢量器或tfidf转换器失败。