2017-08-25 26 views
0

我正在進行分類任務,我的培訓文件是一個csv,它具有大約8GB(aporx 720萬行和212列)。首先,我的方法是將所有此csv文件在一個熊貓數據框中,然後用它作爲多維數組來訓練我的樸素貝葉斯分類器,但是當我嘗試合適的數據時,我得到了一個memory error(我正在使用8GB ram和64位版本的python) 。嘗試適應分類器時的內存錯誤

之後,我嘗試將我的dataframe分成5塊,然後使用partia_fit()方法,但仍然耗盡內存。

這是到目前爲止我的代碼(目標值是從其他txt文件中提取):

from csv import DictReader 
from sklearn.naive_bayes import MultinomialNB 
import numpy 
from pandas import* 


target_values_train = [] 

with open('train.txt') as f: 
    reader = DictReader(f, delimiter='\t') 
    for row in reader: 
     target_values_train.append(int(row['human-generated'])) 

y_train = numpy.asarray(target_values_train) 
y_train = y_train[:, numpy.newaxis] 

tp = read_csv('train-indices.csv', iterator=True, chunksize=1000, delimiter=';', skiprows=1) 
df_train = concat(tp, ignore_index=True) 
del df_train['id'] 
print(df_train) 
print(df_train.shape) 
print(y_train.shape) 
df1, df2, df3, df4 = np.array_split(df_train, 5) 
y1, y2, y3, y4, y5=np.array_split(y_train, 5) 
print(df1.shape) 
print(df2.shape) 
print(df3.shape) 


clf = MultinomialNB() 
clf.partial_fit(df1, y1) 
clf.partial_fit(df2, y2) 
clf.partial_fit(df3, y3) 
clf.partial_fit(df4, y4) 
clf.partial_fit(df5, y5) 

任何建議是非常值得歡迎的。

+0

爲什麼不將所有內容放在一個循環中,只存儲和讀取每個partial_fit所需的行? –

+0

你真的需要訓練所有這些數據嗎?如果數據是同類的,你可以訓練符合記憶的數據部分,併產生好的分數。嘗試一下。如果它不會成立,你可以訓練和預測所有部分的訓練數據,然後簡單地進行預測並獲得更好的結果。 – CrazyElf

+0

您可以嘗試在使用後立即刪除任何不需要的數據。 – CrazyElf

回答

0

使用pd.concat您將再次在內存中重新加載所有數據,因此它相當於一次加載文件。

您需要逐個遍歷塊才能進行訓練。例如,您可以執行以下操作:

tp = read_csv('training_data.csv', iterator=True, chunksize=1000, delimiter=';', skiprows=1) 
clf = MultinomialNB() 
for chunk in tp: 
    clf.partial_fit(chunk[["train_col1", "train_col1",...]], chunk["y1"]) 
相關問題