Scikit和Pandas:适合大数据

Ji *_*ark 13 memory classification machine-learning pandas scikit-learn

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

我正在使用IPython笔记本作为编程环境,并使用pandas + sklearn软件包来分析来自kaggle的数字识别器教程的数据.

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

KNeighborsClassifier 用于预测.

问题:

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

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

我尝试了以下方法:

以块的形式迭代CSV文件,并相应地拟合数据,但问题是每次对于一大块数据都会覆盖预测模型.

您认为如何成功训练我的模型而不会遇到内存问题,我怎么办?

ogr*_*sel 11

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

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

为避免这种情况,您可以编写/重用CSV解析器,该解析器直接分配scikit-learn模型所期望的内部格式/ dtype中的数据.您可以尝试numpy.loadtxt(例如,查看参数的docstring).

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

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

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

  • 您应该尝试在暴力模式(而不是balltree)中使用`KNeighborsClassifier`,但预测时间可能太慢.或者,您可以使用简单模型,例如`sklearn.linear_model.Perceptron`,`sklearn.naive_bayes.MultinomialNB`或`sklearn.neighbors.NearestCentroidClassifier`.最后,您还可以尝试在数据的一个小子样本上训练模型,以便快速了解预测精度,然后将数据集的大小加倍并进行迭代. (2认同)