2

为了在大约 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 中的内存不足错误”,以使其更能描述实际问题。

4

1 回答 1

3

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

  • 许多 scikit-learn 分类器内部使用的标签预处理机制在内存方面不能很好地扩展类的数量。这是一个已知问题,正在努力解决这个问题。

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

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

  • 在转换为 numpy 数组的列上独立拟合二进制SGDClassifier(loss='log', penalty='elasticnet')实例,然后调用并最终将这些稀疏模型包装为最终的 one-vs-rest 分类器(或通过 proba 对二进制分类器的预测进行排名)。取决于正则化参数 alpha 的值,您可能会得到足够小以适合内存的稀疏模型。您也可以尝试对 做同样的事情,例如:y_trainclf.sparsify()LogisticRegression

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

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

您还可以查看在闪电中实现 的大规模稀疏多类分类的块坐标下降算法,但我也不确定它是否适合标签基数 43K。

于 2013-12-17T08:24:23.487 回答