【问题标题】:Memory Error when trying to fit a classifier尝试拟合分类器时出现内存错误
【发布时间】: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


【解决方案1】:

使用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"])

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2015-08-23
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多