scikit learn Python中的CountVectorizer()在输入大数据集时出现内存错误。同样的代码和较小的数据集可以很好地工作,我缺少什么?

scikit learn Python中的CountVectorizer()在输入大数据集时出现内存错误。同样的代码和较小的数据集可以很好地工作,我缺少什么?,python,numpy,machine-learning,scikit-learn,feature-extraction,Python,Numpy,Machine Learning,Scikit Learn,Feature Extraction,我正在研究两类机器学习问题。培训集包含200万行URL(字符串)和标签0和1。分类器LogisticRegression()应在通过测试数据集时预测两个标签中的任何一个当我使用较小的数据集,即78000 URL和0和1作为标签时,我得到了95%的准确率结果。 我遇到的问题是,当我输入大数据集(200万行URL字符串)时,会出现以下错误: Traceback (most recent call last): File "<stdin>", line 1, in <module&

我正在研究两类机器学习问题。培训集包含200万行URL(字符串)和标签0和1。分类器LogisticRegression()应在通过测试数据集时预测两个标签中的任何一个当我使用较小的数据集,即78000 URL和0和1作为标签时,我得到了95%的准确率结果。

我遇到的问题是,当我输入大数据集(200万行URL字符串)时,会出现以下错误:

Traceback (most recent call last):

File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile

execfile(filename, namespace)
File "C:/Users/Slim/.xy/startups/start/chi2-94.85 - Copy.py", line 48, in <module>

bi_counts = bi.fit_transform(url_list)
File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line 780, in fit_transform

vocabulary, X = self._count_vocab(raw_documents, self.fixed_vocabulary)
File "C:\Python27\lib\site-packages\sklearn\feature_extraction\text.py", line 717, in _count_vocab

j_indices.append(vocabulary[feature])
MemoryError
我试着尽量减少“最大功能”,比如说最大功能=100,但结果还是一样

请注意:

  • 我正在使用带4GB ram的core i5
  • 我在8GB内存上尝试了相同的代码,但是 不走运
  • 我将Pyhon 2.7.6与sklearn、NumPy 1.8.1、SciPy 0.14.0、Matplotlib 1.3.1一起使用
更新:


@Andreas Mueller建议使用HashingVectorizer(),我将其用于大小数据集,成功编译了78000个数据集,但200万个数据集给了我如上所示的相同内存错误。我在8GB ram上试用过,编译大数据集时使用的内存空间=30%

IIRC仅在计算整个字典后应用max_功能。 最简单的方法是使用不计算字典的
hashingvectorier

您将失去为功能获取相应令牌的能力,但不应再遇到内存问题。

再仔细想想,这似乎有点奇怪。您使用的是带有3克字符的
char\u wb
,所以不应该有那么多功能,对吗?对于较小的数据集,您获得了多少功能?仅3克,我就获得了40968个功能和54%的准确率。由于只有char_wb,我从78000个URL中只获得了50个特性,数据集每行有一个URL。在应用char_wb和3-gram时,我得到了25376个特征和95%的准确率。Ok 25k对于char 3-gram似乎是合理的。@Andreas Mueller,当两者都使用combine时,我得到了25k个特征和3-gram和char_wb。仅使用了3-gram,我就获得了40k功能。以前尝试过HashingVectorizer,但现在我在78000行的同一个小数据集上再次检查了它,它工作了,但当我在主数据集中加载了200万行时,控制台显示了相同的内存错误。在回溯调用中,错误源于HashingVectorizer转换阶段。然后我猜结果对于您的RAM来说太大了。您可以使用核心外方法:这将不允许您进行TFIDF缩放。确定正在使用它。。。顺便说一句,我在32位python中工作。这和我的问题有关吗?哦,是的,这意味着你只能使用2gb的ram afaik。实际上,这是32位的问题,在64位python上得到了结果。谢谢
bi = CountVectorizer(ngram_range=(3, 3),binary = True, max_features=9000, analyzer='char_wb')
bi_counts = bi.fit_transform(url_list)
tf = TfidfTransformer(norm='l2')
X_train_tf =tf.fit_transform(use_idf=True, bi_counts)
clf = LogisticRegression(penalty='l1',intercept_scaling=0.5,random_state=True)
clf.fit(train_x2,y)