2012-06-25 60 views
7

我試圖使用sklearn 0.11的邏輯迴歸對象擬合模型200,000觀察與約80000特點。目標是將短文描述分爲800個類中的1個。Scikit-瞭解Logistic迴歸內存錯誤

當我嘗試以適應分類pythonw.exe給我:

應用程序錯誤「在00000000 ...在引用內存的指令」。內存不能被寫入「。

功能非常稀疏,每次觀察約10次,並且是二進制(1或0),所以通過我的信封計算背面我的4 GB RAM應該能夠處理內存需求,但似乎並非如此,只有當我使用較少的觀測和/或較少的特徵時,模型才適用。天真的理解是,運行在幕後的線性庫能夠支持這一點。任何想法如何我可能擠壓更多的觀察?

我的代碼如下所示:

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()函數只返回指示每個觀測中檢測到的特徵的字符串列表。

我使用Python 2.7,sklearn 0.11,Windows XP中有4 GB的RAM。因爲它是一個C

+0

做了Python解釋器會崩潰嗎?寫入'0x0'是一個非常嚴重的錯誤,我們(scikit-learn開發者)應該研究它。 –

+0

Python解釋器確實崩潰。 –

+0

您正在使用的數據集是公開的嗎?你能用小數據集(例如'x_first_half = x [:x.shape [0]/2]'或者'x_second_half = x [x。形狀[0]/2:]'? – ogrisel

回答

20

liblinear(背襯實施sklearn.linear_model.LogisticRegression)將承載其自身的數據副本++庫,其內部存儲器佈局不能被直接映射到一個預先分配的稀疏矩陣中SciPy的諸如scipy.sparse.csr_matrixscipy.sparse.csc_matrix

在你的情況我建議您加載數據作爲scipy.sparse.csr_matrix和(如果你想有一個邏輯迴歸模型,並調用predict_proba方法的能力與loss='log')將其提供給一個sklearn.linear_model.SGDClassifier。如果輸入數據已經使用scipy.sparse.csr_matrix內存佈局,則SGDClassifier不會複製輸入數據。

期望它分配爲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添加適當的多項式邏輯迴歸,或者實現Platt的縮放比例或變量,用於預測一對多靜態多類設置中的概率。 – ogrisel