3

나는 두 클래스 기계 학습 문제에 종사하고있다. 교육 세트에는 2 백만 개의 URL 행 (문자열)과 레이블 0과 1이 있습니다. 분류 자 ​​LogisticRegression()은 테스트 데이터 집합이 전달 될 때 두 개의 레이블 중 하나를 예측해야합니다. 작은 데이터 세트, 즉 URL이 78,000 개이고 라벨에 0과 1을 사용할 때 95 %의 정확도 결과를 얻고 있습니다.Scikit-Learn Python의 CountVectorizer()는 큰 데이터 세트를 먹일 때 메모리 오류를 발생시킵니다. Smaller 데이터 세트가있는 동일한 코드가 제대로 작동하지만 무엇이 누락 되었습니까?

나는이 오류가받을 큰 데이터 세트 (URL 문자열의 2 백만 행)에 공급하면 내가 데 문제가 : 공정 충분한 정확도가 작은 데이터 세트를 위해 노력하고 있습니다

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 = 100,하지만 여전히 같은 결과로 최소한 'max_features'을 유지하기 위해 노력했다.

참고 : 나는 기가 바이트 램과 코어 i5를 사용하고

  • 나는 같은 기가 바이트 램에 코드 만 행운
  • 내가 sklearn와 Pyhon 2.7.6을 사용하고 시도 , NumPy와 1.8.1, SciPy 0.14.0,하기 matplotlib 1.3.1

UPDATE :

@Andreas Mueller는 HashingVectorizer()를 사용하도록 제안했지만 작고 큰 데이터 세트와 함께 사용하여 78,000 개의 데이터 세트를 성공적으로 컴파일했지만 200 만 개의 데이터 세트가 위에 표시된 것과 동일한 메모리 오류를 발생 시켰습니다. 큰 데이터 세트를 컴파일 할 때 8GB RAM 및 사용 중 메모리 공간 = 30 %에서 시도했습니다.

+0

조금 더 생각하면 약간 이상하게 보입니다. 당신은 3-gram과 함께''char_wb''를 사용하고 있습니다. 그래서 많은 기능이 있어서는 안됩니다. 맞습니까? 더 작은 데이터 세트에 대해 몇 가지 기능을 사용 했습니까? –

+0

3 그램 만 있으면 40968 개의 기능과 54 %의 정확도를 얻게됩니다. char_wb 만 있으면 78,000 개의 URL에서 50 개의 기능 만 가져오고 데이터 세트에는 행당 하나의 URL이 있습니다. char_wb와 3-gram을 적용하면 25,376 개의 특징과 95 %의 정확도를 얻게됩니다. – Nasir

+0

Ok 25k는 char 3-grams에 적합합니다. –

답변

3

IIRC max_features는 전체 사전을 계산 한 후에 만 ​​적용됩니다. 가장 쉬운 방법은 사전을 계산하지 않는 HashingVectorizer을 사용하는 것입니다. 기능에 해당하는 토큰을 가져올 수 없지만 더 이상 메모리 문제가 발생하지 않아야합니다.

+0

전에 HashingVectorizer를 사용해 보았습니다. 그러나 78,000 행의 동일한 작은 데이터 세트에서 다시 확인해 보았습니다.하지만 주 데이터 세트 2 백만 행에로드 할 때 콘솔에 동일한 메모리 오류가 표시되었습니다. 추적 호출 오류에서 발생 HashingVectorizer 변환 단계에서 시작됩니다. – Nasir

+0

다음 결과는 RAM에 큰 것 같습니다. 핵심 방법을 사용할 수 있습니다. http://scikit-learn.org/dev/modules/scaling_strategies.html#scaling-with-instances-using-out-of-core-learing 이것은 TFIDF를 수행하는 것을 허용하지 않습니다. 그래도 스케일링. –

+0

ok 작업 중 ... btw 32 비트 Python으로 작업 중입니다. 이게 내 문제와 관련이있는 일인가? – Nasir