【发布时间】:2017-08-25 09:57:25
【问题描述】:
我正在做一个分类任务,我的训练文件是一个 csv,它有大约 8GB(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)
非常欢迎任何建议。
【问题讨论】:
-
为什么不把所有东西都放在一个循环中,只存储和读取每个partial_fit所需的行?
-
你真的需要对所有这些数据进行训练吗?如果数据是同质的,你可以训练适合记忆的部分数据并产生一个好的分数。试试看。如果还不够,您可以在训练数据上对所有部分进行训练和预测,然后简单地对预测进行平均并获得更好的结果。
-
并且您可以在使用后立即删除任何不需要的数据。
-
是的,我想我会尝试预测训练数据的所有部分,然后我会平均预测。太棒了!
标签: python pandas memory machine-learning scikit-learn