2012-06-25 4 views
7

sklearn 0.11의 LogisticRegression 객체를 사용하여 약 80,000 개의 기능으로 200,000 회의 관측치에 모형을 맞추려고합니다. 목표는 짧은 텍스트 설명을 800 개의 클래스 중 하나로 분류하는 것입니다. Scikit- 로지스틱 회귀 메모리 기억 오류

나는 분류 pythonw.exe에 맞게하려고

저를 제공합니다

응용 프로그램 오류 "0x00000000의에서에서 ... 메모리를 참조 명령". 메모리를 쓸 수 없습니다. "라는 메시지가 표시됩니다.

기능은 매우 희소하며 관찰 당 약 10 개이며 바이너리 (1 또는 0)이므로 봉투 계산에서 내 4GB의 RAM으로 메모리 요구 사항을 처리하지만 그럴 듯하지는 않습니다. 관측치가 적고 기능이 적을 때만 모델이 적합합니다.

더 많은 관찰과 기능을 사용하고 싶습니다. 순진한 이해는 뒷 배경을 다루는 liblinear 라이브러리가이를 지원할 수 있다는 것입니다. 몇 가지 더 많은 관찰을 할 수있는 방법에 대한 아이디어는 무엇입니까?

내 코드는 다음과 같습니다.

y_vectorizer = LabelVectorizer(y) # my custom vectorizer for labels 
y = y_vectorizer.fit_transform(y) 

x_vectorizer = CountVectorizer(binary = True, analyzer = features) 
x = x_vectorizer.fit_transform(x) 

clf = LogisticRegression() 
clf.fit(x, y) 

분석기로 전달하는 features() 함수는 각 관찰에서 감지 된 피쳐를 나타내는 문자열 목록을 반환합니다.

sklearn 0.11, Windows XP 및 4GB RAM을 사용하고 있습니다. 그것은 C 때문에

+0

파이썬 인터프리터가 충돌 했습니까? '0x0'에 쓰는 것은 꽤 심각한 오류입니다, 우리는 (scikit-learn 개발자들) 그것을 조사해야합니다. –

+0

파이썬 인터프리터가 작동하지 않습니다. –

+0

사용중인 데이터 세트가 공개되어 있습니까? 이 충돌을 작은 데이터 세트 (예 :'x_first_half = x [: x.shape [0]/2]'또는'x_second_half = x [x.모양 [0]/2 :]'? – ogrisel

답변

20

liblinear (sklearn.linear_model.LogisticRegression의 배면 구현)는 데이터의 복사본을 호스팅 ++ 그의 내부 메모리 레이아웃 직접적 scipy.sparse.csr_matrix 또는 scipy.sparse.csc_matrix로 scipy에 사전 할당 희소 행렬 상으로 매핑 할 수없는 라이브러리. 귀하의 경우에는

나는 scipy.sparse.csr_matrix로 데이터를로드하고 (당신은 로지스틱 회귀 모델과 predict_proba 메소드를 호출 할 수있는 기능을 원하는 경우 loss='log' 포함) sklearn.linear_model.SGDClassifier에 먹이를 추천 할 것입니다. SGDClassifier은 이미 scipy.sparse.csr_matrix 메모리 레이아웃을 사용하는 경우 입력 데이터를 복사하지 않습니다.

800 * (80000 + 1) * 8/(1024 ** 2) = 488MB의 밀도가있는 모델을 메모리에 할당해야합니다 (입력 데이터 세트의 크기 이외에).

편집 : 어떻게 당신이 할 수있는 데이터 세트 추출 후 사용 가능한 메모리에 데이터 세트

의 메모리 액세스를 최적화 할

x_vectorizer = CountVectorizer(binary = True, analyzer = features) 
x = x_vectorizer.fit_transform(x) 
from sklearn.externals import joblib 
joblib.dump(x.tocsr(), 'dataset.joblib') 

그런 다음 (전체 메모리 해제를 강제로)이 파이썬 프로세스를 종료하고 새로운 프로세스에서 :

x_csr = joblib.load('dataset.joblib') 

linux/OSX에서는 다음과 함께 메모리 맵핑을 할 수 있습니다.

x_csr = joblib.load('dataset.joblib', mmap_mode='c') 
+3

우수 답변, 다른 사람이 제공하는 것보다 훨씬 비싼 소프트웨어에 대한이 무료 소프트웨어에 대한 더 나은 지원을 제공합니다. 세상은 당신에게 많은 감사를드립니다. 그러나 SGDClassifier의 predict_proba 메소드는 2 개의 카테고리 분류 태스크에 대해서만 구현 된 것으로 보입니다. –

+0

실제로, 나는 그것을 잊었다. SGDClassifier에 적절한 다항식 로지스틱 회귀 분석을 추가하거나 1 대 vs 나머지 멀티 클라스 설정에서 확률 예측을 위해 Platt의 배율 또는 변형을 구현하기 위해 메일 링리스트에 대한 토론이 진행 중입니다. – ogrisel