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