2013-12-12 4 views
2

약 400MB의 텍스트 데이터에서 NB 분류기를 실행하려면 vectorizer를 사용해야합니다.Scikit-learn MultinomialNB에서 메모리 부족 오류

vectorizer = TfidfVectorizer(min_df=2) 
X_train = vectorizer.fit_transform(X_data) 

그러나 메모리 오류가 발생합니다. Linux64는 Python 64 비트 버전을 사용하고 있습니다. 사람들은 어떻게

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에서 벡터화 과정을 통해 작동합니까 : I가 "메모리 오류 중 Scikit에서"Scikit 벡터 기에서 메모리 오류 부족 "에서 제목을 변경 -learn MultinomialNB "를 사용하여 실제 문제를보다 잘 설명 할 수 있습니다.

+0

역 추적은 벡터화 단계가 아니라 'MultinomialNB(). fit (X_train, y_train)'을 호출 할 때 y 변수의 레이블 추출과 관련이있는 것처럼 보입니다. 'y_train' 변수에는 무엇이 있습니까? 이 데이터 구조의 모양은 무엇입니까? – ogrisel

+0

안녕하세요 Orgisel, X_train의 원래 모양은 6MX6M이고 y_train은 6Mx43K입니다. 나는 트리밍을 시도하고 400Kx6M이고 ytrain 인 X_train의 서브 세트만을 취했습니다. 400Kx43k – David

+0

y_train은 43,000 개의 가능한 클래스로 6M 데이터 포인트를 분류하는 스파 스 인디케이터 매트릭스 (0 및 1 라벨 있음)라고 말하고 있습니까? 레이블 전처리 코드가 수정 되더라도 MultinomialNB는 밀집한 표현을 사용하고 있으며 그 많은 클래스에 대한 매개 변수를 절대로 저장할 수 없게됩니다. – ogrisel

답변

3

나 코멘트에 토론의 결과를 요약 해 보자 : 분류를 배우기 scikit 많은 내부적으로 사용

  • 라벨 전처리 기계가 아니라 메모리 현명한 w.r.t.를 확장하지 않습니다 클래스의 수. 이는 알려진 문제이며이를 해결하기 위해 ongoing work이 있습니다.

  • 레이블 사전 처리 제한이 수정 된 경우에도 MultinomialNB 클래스 it-self는 카디널리티가 43K 인 레이블 공간에서 분류하기에 적합하지 않을 수 있습니다. 독립적으로, 다음으로 그 희소 모델을 감싸 마지막 clf.sparsify()를 호출하고 NumPy와 배열로 변환 y_train의 컬럼에

    • 에 맞는 바이너리 SGDClassifier(loss='log', penalty='elasticnet') 경우 :

    는 당신이 시도 할 수 많은 기수 분류 문제를 해결하기 위해, 최종 one-vs-rest 분류기 (또는 proba에 의한 2 진 분류기의 순위 예측). regularizer 매개 변수 alpha의 값에 따라 메모리에 들어가기에 충분히 작은 희소 모델을 얻을 수 있습니다. 또한 LogisticRegression와 동일한 기능을 수행 할 시도 할 수 있습니다, 즉 같은 :..

    clf_label_i = 로지스틱 회귀 (벌금 = 'L1')에 맞게 (X_train, y_train [:, label_i] .toarray()) sparsify()

  • 다른 방법으로 대상 레이블 y_train의 PCA를 시도한 다음 분류 문제를 축소 레이블 PCA 공간에서 다중 출력 회귀 문제로 변환 한 다음 가장 가까운 클래스 인코딩을 찾아 회귀 분석기의 출력을 디코딩하십시오. 레이블 PCA 공간.

또한 lightning 구현 Block Coordinate Descent Algorithms for Large-scale Sparse Multiclass Classification에 모습을 가질 수 있지만, 나는 그것을 라벨 카디널리티 43K에 적합한 중 하나 확실하지 않다.

+0

감사합니다. Ogrisel, 매우 잘 이해했습니다. – David