14

如何使用 scikit-learn 在大型 csv 数据(~75MB)上训练模型而不会遇到内存问题?

我使用 IPython notebook 作为编程环境,使用 pandas+sklearn 包来分析来自 kaggle 的数字识别器教程的数据。

数据可在网页上找到,链接到我的代码,这是错误消息

KNeighborsClassifier用于预测。

问题:

使用 read_csv 函数加载大型数据集时发生“MemoryError”。为了暂时绕过这个问题,我必须重新启动内核,然后 read_csv 函数成功加载文件,但是当我再次运行相同的单元格时会出现同样的错误。

read_csv函数成功加载文件时,对 进行更改后dataframe,我可以将特征和标签传递给 KNeighborsClassifier 的 fit() 函数。此时会出现类似的内存错误。

我尝试了以下方法:

逐块迭代 CSV 文件,并相应地拟合数据,但问题是每次数据块的预测模型都会被覆盖。

您认为我可以做些什么来成功训练我的模型而不会遇到内存问题?

4

1 回答 1

12

注意:当您使用 pandas 加载数据时,它会创建一个DataFrame对象,其中每列对于所有行都有同质数据类型,但 2 列可以有不同的数据类型(例如整数、日期、字符串)。

当您将DataFrame实例传递给 scikit-learn 模型时,它将首先分配一个 dtype 为 np.float32 或 np.float64 的同质 2D numpy 数组(取决于模型的实现)。此时,您将在内存中拥有 2 个数据集副本。

为避免这种情况,您可以编写/重用一个 CSV 解析器,该解析器直接以 scikit-learn 模型预期的内部格式/dtype 分配数据。例如,您可以尝试numpy.loadtxt(查看参数的文档字符串)。

此外,如果您的数据非常稀疏(许多零值),最好使用 scipy.sparse 数据结构和可以处理这种输入格式的 scikit-learn 模型(检查文档字符串以了解)。但是 CSV 格式本身不太适合稀疏数据,我不确定是否存在直接的 CSV 到scipy.sparse解析器。

编辑:供参考 KNearestNeighborsClassifer 分配具有形状的临时距离数组,(n_samples_predict, n_samples_train)仅在需要时非常浪费(n_samples_predict, n_neighbors)。可以在此处跟踪此问题:

https://github.com/scikit-learn/scikit-learn/issues/325

于 2012-07-29T10:47:08.103 回答