2012-06-25 3 views
7

Sklearn 0.11'in LogisticRegression nesnesini, yaklaşık 80.000 özelliğe sahip 200.000 gözlemde bir modele uyacak şekilde kullanmaya çalışıyorum. Amaç, kısa metin açıklamalarını 800 sınıftan 1'ine ayırmaktır. Scikit-Öğrenin Lojistik Regresyon Bellek Hatası

Ben sınıflandırıcı pythonw.exe sığdırmak girişiminde

bana verir:

Uygulama Hatası "0x00000000 en ... başvurulan belleğe talimatı". Bellek yazılamadı ".

Özellikler son derece seyrek, gözlem başına yaklaşık 10'dur ve ikilidir (1 veya 0), bu yüzden zarfın arka yüzüne göre 4 GB RAM'im hesaplayabilmeli bellek gereksinimlerini işlemekle birlikte, bu durum böyle görünmüyor.Menel modeller yalnızca daha az gözlem ve/veya daha az özellik kullandığımda beliriyor

Daha fazla gözlem ve özellik kullanmak istiyorum. saf anlayışı, sahnelerin arkasındaki şeyleri çalıştıran liblinear kütüphanesinin bunu destekleyebilmesidir: Bir kaç tane daha gözlem yapabildiğime dair herhangi bir fikir.

Kodum şunun gibi görünüyor:

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) 

Analizöre aktardığım özellikler() işlevi, her bir gözlemde algılanan özellikleri belirten bir dizelerin listesini döndürür.

Python 2.7, sklearn 0.11, Windows XP 4 GB RAM kullanıyorum. Bir C olduğu için

+0

Python yorumlayıcısı kilitlendi mi? '0x0'ya yazmak oldukça büyük bir hatadır, biz (scikit-geliştiricileri geliştirir), ona bakmalıyız. –

+0

Python yorumlayıcısı çöküyor. –

+0

Genel olarak kullandığınız veri kümesi var mı? Bu çökmeyi daha küçük bir veri kümesiyle (örneğin x_first_half = x [: x.shape [0]/2] 'veya x_second_half = x [x.şekil [0]/2:] '? – ogrisel

cevap

20

liblinear (sklearn.linear_model.LogisticRegression ait destek uygulaması) verilerine kendi kopyasını ev sahipliği yapacak ++ olan dahili bellek düzeni doğrudan bu scipy.sparse.csr_matrix veya scipy.sparse.csc_matrix olarak SciPy bir ön tahsis seyrek matris üzerine eşlenemez kütüphanesi. Senin durumunda

Ben scipy.sparse.csr_matrix olarak veri yüklemek ve (bir lojistik regresyon modeli ve predict_proba yöntemi çağırmak için yeteneği istiyorsanız loss='log' ile) sklearn.linear_model.SGDClassifier bunu beslemek için öneriyoruz. SGDClassifier, zaten scipy.sparse.csr_matrix bellek düzenini kullanıyorsa giriş verilerini kopyalamayacaktır.

Bellekte 800 * (80000 + 1) * 8/(1024 ** 2) = 488MB (giriş veri kümenizin boyutuna ek olarak) yoğun bir model ayırmak için bunu bekleyin.

Düzenleme: nasıl yapabilirsiniz veri kümesi çekimi sonrası boş hafıza için sizin veri kümesi

için bellek erişimi optimize etmek:

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

Sonra (tam bellek miktarda kaldırma zorlamak için) bu piton işlemi ve bu yeni bir süreç içinde: linux altında

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

/OSX yapabildin bellek haritası bu daha da verimli bir şekilde:

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

Mükemmel cevap, bu ücretsiz yazılım için diğerlerinden çok pahalı yazılımlar için verdiğinden daha iyi destek sağlıyorsunuz, dünya size çok teşekkür borçludur. Bununla birlikte, bir küçük not, SGD Sınıflandırıcı's predict_proba yöntemi sadece 2 kategori sınıflandırma görevleri için uygulanıyor gibi görünüyor. –

+0

Gerçekten, bunu unutmuşum. SGD Sınıflandırıcısına doğru çok-yönlü lojistik regresyon eklemek ya da Platt'ın ölçekleme ya da varyantlarını bire-vs-çok-yönlü multisınıf ayarında tahmin etmek için posta listesi üzerinde bir tartışma vardır. – ogrisel