Scikit和Pandas:处理大数据

如何使用scikit-learn在不遇到内存问题的条件下,训练一个大约75MB的csv数据模型?

我使用IPython笔记本作为编程环境,并使用pandas和sklearn包来分析kaggle的数字识别教程中的数据。

数据可在网页上获取,链接到我的代码,以及这里是错误信息

KNeighborsClassifier用于预测。

问题:

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

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

我尝试了以下方法:

以块的方式迭代CSV文件,并相应地拟合数据,但问题是每次处理一部分数据时,预测模型都会被覆盖。

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


回答:

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

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

为了避免这种情况,你可以编写/重用一个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

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注