Scikit-learn MultinomialNB中的内存不足错误

时间:2013-12-12 06:38:24

标签: scikit-learn scikits

为了在大约400 MB的文本数据中运行NB分类器,我需要使用矢量化器。

vectorizer = TfidfVectorizer(min_df=2)
X_train = vectorizer.fit_transform(X_data)

但它给出了内存错误。我使用的是Linux64 python 64位版本。人们如何通过Scikit中的矢量化过程处理大型数据集(文本)

Traceback (most recent call last):
  File "ParseData.py", line 234, in <module>
    main()
  File "ParseData.py", line 211, in main
    classifier = MultinomialNB().fit(X_train, y_train)
  File "/home/pratibha/anaconda/lib/python2.7/site-packages/sklearn/naive_bayes.py", line 313, in fit
    Y = labelbin.fit_transform(y)
  File "/home/pratibha/anaconda/lib/python2.7/site-packages/sklearn/base.py", line 408, in fit_transform
    return self.fit(X, **fit_params).transform(X)
  File "/home/pratibha/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/label.py", line 272, in transform
    neg_label=self.neg_label)
  File "/home/pratibha/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/label.py", line 394, in label_binarize
    Y = np.zeros((len(y), len(classes)), dtype=np.int)

已编辑(ogrisel):我将标题从“Scikit Vectorizer中的内存不足错误”更改为“Scikit-Learn MultinomialNB中的内存不足错误”,以使其更具描述性的实际问题。

1 个答案:

答案 0 :(得分:3)

让我在评论中总结讨论的结果:

  • 许多scikit-learn分类器内部使用的标签预处理机器不能很好地按比例调整w.r.t.班级数量。这是一个已知问题,有ongoing work来处理它。

  • 即使标签预处理限制是固定的,MultinomialNB类it-self也可能不适合在基数为43K的标签空间中进行分类。

要解决大基数分类问题,您可以尝试:

  • SGDClassifier(loss='log', penalty='elasticnet')列上的二进制y_train实例单独转换为numpy数组,然后调用clf.sparsify()并最终将这些稀疏模型包装为最终的一对二休息分类器(或通过proba排列二元分类器的预测)。依赖于正则化参数alpha的值,您可能会得到足够小以适合内存的稀疏模型。您也可以尝试使用LogisticRegression执行相同的操作,例如:

    clf_label_i = LogisticRegression(penalty ='l1')。fit(X_train,y_train [:,label_i] .toarray())。sparsify()

  • 或者尝试对目标标签y_train执行PCA,然后将分类问题转换为缩减标签PCA空间中的多输出回归问题,然后通过查找解码回归器的输出标签PCA空间中最近的类编码。

您还可以查看 Block Coordinate Descent Algorithms for Large-scale Sparse Multiclass Classification中实施的lightning,但我不确定它是否适用于标签基数43K。