2012-06-25 17 views
7

Sto tentando di utilizzare l'oggetto LogisticRegression di sklearn 0.11 per adattare un modello a 200.000 osservazioni con circa 80.000 funzioni. L'obiettivo è classificare descrizioni di brevi testi in 1 delle 800 classi.Scikit-Learn Logistic Regression Errore di memoria

Quando si tenta di adattarsi alla pythonw.exe classificatore mi dà:

Errore dell'applicazione "L'istruzione a ... riferimento alla memoria a 0x00000000". La memoria non può essere scritta ".

Le funzionalità sono estremamente sparse, circa 10 per osservazione e sono binarie (1 o 0), quindi con il mio calcolo della busta i miei 4 GB di RAM dovrebbero essere in grado di gestire i requisiti di memoria, ma ciò non sembra essere il caso.I modelli si adattano solo quando utilizzo un minor numero di osservazioni e/o meno funzioni

Se mai, vorrei utilizzare ancora più osservazioni e funzionalità. comprensione ingenua è che la libreria liblinear che gestisce le cose dietro le quinte è in grado di supportarle.Qualsiasi idea su come potrei spremere qualche altra osservazione in?

Il mio codice è simile a questo:

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) 

La funzione features() che si passa all'analizzatore restituisce solo un elenco di stringhe che indicano le caratteristiche rilevate in ciascuna osservazione.

Sto usando Python 2.7, sklearn 0.11, Windows XP con 4 GB di RAM.

+0

Si è verificato un arresto anomalo dell'interprete Python? Scrivere su '0x0' è un errore piuttosto grave, noi (gli sviluppatori di scikit-learn) dovremmo esaminarlo. –

+0

L'interprete Python si arresta in modo anomalo. –

+0

Il set di dati che si sta utilizzando è pubblico? Puoi riprodurre questo crash con un set di dati più piccolo (ad esempio con 'x_first_half = x [: x.shape [0]/2]' o 'x_second_half = x [x.forma [0]/2:] '? – ogrisel

risposta

20

liblinear (attuazione appoggio di sklearn.linear_model.LogisticRegression) ospiterà la propria copia dei dati, perché è un C++ libreria il cui interno memoria layout non possono essere mappati direttamente su una matrice sparsa preassegnati in SciPy come scipy.sparse.csr_matrix o scipy.sparse.csc_matrix.

Nel tuo caso mi sento di raccomandare a caricare i dati come scipy.sparse.csr_matrix e dei mangimi a un sklearn.linear_model.SGDClassifier (con loss='log' se si desidera un modello di regressione logistica e la possibilità di chiamare il metodo predict_proba). SGDClassifier non copierà i dati di input se sta già utilizzando il layout di memoria scipy.sparse.csr_matrix.

Aspettatevi di allocare un modello denso di 800 * (80000 + 1) * 8/(1024 ** 2) = 488 MB in memoria (oltre alla dimensione del set di dati di input).

Edit: come ottimizzare l'accesso alla memoria per il vostro set di dati

Per liberare memoria dopo l'estrazione di dati è possibile:

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

quindi chiudere questo processo python (per forzare completa deallocazione memoria) e in una nuova procedura:

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

Sotto linux/OSX è possibile memorizzare la mappa in modo ancora più efficiente con:

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

Risposta eccellente, fornisci un supporto migliore per questo software gratuito rispetto ad altri software molto costosi, il mondo ti deve molto grazie. Una nota minore, tuttavia, il metodo predict_proba di SGDClassifier sembra essere implementato solo per le attività di classificazione in 2 categorie. –

+0

Infatti, me ne sono dimenticato. È attualmente in corso una discussione sulla mailing list per aggiungere una corretta regressione logistica multinomiale a SGDClassifier o per implementare il ridimensionamento o le varianti di Platt per la previsione delle probabilità in un'impostazione multiclasse con un punto a riposo. – ogrisel

Problemi correlati