2012-12-01 79 views
0

我正在運行一堆預處理在幾乎每次迭代中都會發生變化的實驗。一旦我有格式的數據,我需要從scikits(liblinear)運行分類器。我可以將數據轉換爲svm light格式。我知道有一個模塊將其轉換爲scikits標準。問題是我不想寫一個文件到磁盤。我有48場演出的內存,而且更願意在內存中進行轉換。用於scikit的SVM輕型裝載機學習

下面是一個例子,我採用svm light格式,將它寫入一個字符串對象,並將svm光加載器寫入它。不幸的是,裝載機拒絕撒播(其他方式)。有什麼建議麼?我正在運行超過1000個不同的預處理管道,我不能繼續寫入磁盤。

樣本SVM光數據是: http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/a1a

我的代碼

import numpy as np 
from sklearn.datasets import svmlight_format 

import cStringIO 

bufFile = cStringIO.StringIO() 
with open('C:/Users/theDesktop/Desktop/sampleData.txt') as a: 
     p = a.readlines() 
     a.close() 

bufFile.writelines(p) 

X_train, y_train = svmlight_format.load_svmlight_file(bufFile) 

我的錯誤:

Traceback (most recent call last): 

File "C:\Users\theDesktop\Desktop\module1.py", 
line 25, in <module> X_train, y_train=svmlight_format.load_svmlight_file(bufFile) 

File "C:\Python27\lib\site-packages\sklearn\datasets\svmlight_format.py", 
line 97, in load_svmlight_file zero_based)) 

File "C:\Python27\lib\site-packages\sklearn\datasets\svmlight_format.py", 
line 177, in load_svmlight_files for _, indices, _, _ in r): 

File "C:\Python27\lib\site-packages\sklearn\datasets\svmlight_format.py", 
line 177, in <genexpr> for _, indices, _, _ in r): 

File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", 
line 1895, in amin return amin(axis, out) 

ValueError: zero-size array to minimum.reduce without identity 

回答

1

在第二次看,我覺得我在下面回答不同的問題(如果你有興趣,你可以檢查)=)你正在尋找一個高效的內存格式轉換器和一個新的視角。首先,有48個內存的問題是什麼?除非您正在處理包含數百萬個文檔的語料庫,否則它足夠用於文本處理。其次,如果sklearn將文件寫入磁盤作爲不同實例中的不同文件,則可以將其調整爲覆蓋,最後可以刪除最後一次迭代。或者,您可以使用os連接終端,然後通過使用rm命令,您可以在每次迭代中或一次刪除任何您喜歡的文件。

如果問題是python在每次迭代中創建一個新對象,那麼覆蓋再次是內存效率的解決方案。

我試圖幫助你;如果我誤導或誤解了你,請給予評論,以便其他讀者不會感到困惑。


這是有點遲了表,但據我瞭解你使用sklearn作爲蟒蛇和svm-light之間的接口。我不知道你想要什麼輸出;但如果它只是針對不同的預處理方法的精確度度量,那麼您可以使用Python的os庫作爲命令行之間的接口,然後在安裝之後可以從那裏調用svm-light。然後通過使用grep或類似工具,可以提取準確性或其他所需信息,因爲svm-light的學習和分類腳本確實將日誌信息打印到標準輸出。另外請注意,svm-light在訓練和分類後輸出模型文件和其他文件,因此您需要在每次迭代中使用rm或其他工具將其刪除,或者可能只是一遍又一遍地覆蓋它們並最終刪除它們。

通過這種方式,你可以像你說的那樣保存內存,也許(?)比使用sklearn可以獲得更多的信息。作爲最後一句話,我不確定這個解決方法的複雜性:它可能會更耗時,如果時間對您有限制,請檢查它。

我不知道這是否是一種可能和有效的解決方法,我相信你已經克服了這種情況,因爲它已經3個月了;但如果你發表評論,這可能會幫助其他人。

+0

嘿謝謝你試圖幫助我。還是一個懸而未決的問題,並不確定它在你的答案中得到解決。 a)sklearn在liblinear svm上有它自己的包裝器b)svm -light只是數據格式c)目前我基於一些預處理需求創建新文件,將文件存儲到硬盤然後通過load_svmlight_file讀取它 - 指向被覆蓋的磁盤上的特定文件。我不想寫入磁盤,而是想寫入更快的內存,並將load_svm_light指向存儲在內存中的此文件。 – pythOnometrist

+0

我的黑客使用cstringio類似對象的文件失敗。所以任何解決這個問題的辦法都會有幫助對不起,不能在一個評論中適合所有這一切。 – pythOnometrist

+0

我不知道你是否可以寫作工作記憶並從那裏讀取或不讀,但我沒有得到它的必要性。爲什麼你需要這樣一個高效的程序?你願意寫入工作內存的文本文件的平均大小是多少? – clancularius