尝试拟合分类器时出现内存错误

时间:2017-08-25 09:57:25

标签: python pandas memory machine-learning scikit-learn

我正在进行分类任务,我的培训文件是一个大约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)

非常欢迎任何建议。

1 个答案:

答案 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"])