我正在进行分类任务,我的培训文件是一个大约8GB的csv(aporx 720万行和212列)。首先,我的方法是将所有这些csv文件放在pandas数据帧中,然后使用它作为多维数组,训练我的朴素贝叶斯分类器,但当我尝试拟合数据时,我得到了memory error
(我正在使用8GB内存和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 :(得分: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"])