我正在研究两类机器学习问题。训练集包含2百万行URL(字符串)和标签0和1.分类器LogisticRegression()应在传递测试数据集时预测两个标签中的任何一个。 当我使用较小的数据集,即78,000个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
我的代码适用于具有足够精确度的小型数据集
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)
我尽量将'max_features'保持为最小值,比如max_features = 100,但结果仍然相同。
请注意:
更新
@Andreas Mueller建议使用HashingVectorizer(),我将它用于小型和大型数据集,成功编译了78,000个数据集,但是200万个数据集给了我相同的内存错误,如上所示。我在编译大数据集时尝试使用8GB ram和使用中的内存空间= 30%。答案 0 :(得分:4)
IIRC max_features仅在计算完整个字典后应用。
最简单的方法是使用不计算字典的HashingVectorizer
。
您将失去获取功能的相应令牌的能力,但您不应再遇到内存问题。