sklearn与大规模数据集
我有一个22GB的数据集,我想在我的笔记本电脑上处理它。显然,我无法一次性把它全部加载到内存里。
我经常使用sklearn,但通常处理的数据集要小得多。
在这种情况下,传统的方法大概是这样的:
先读取一部分数据 -> 部分训练你的模型 -> 删除这部分数据 -> 读取另一部分数据 -> 继续训练你的模型。
我看到一些sklearn的算法有一个叫做partial fit的方法,这个方法应该可以让我们用数据的不同子集来训练模型。
现在我在想,使用sklearn来做到这一点有没有简单的方法?我在寻找类似这样的东西:
r = read_part_of_data('data.csv')
m = sk.my_model
`for i in range(n):
x = r.read_next_chunk(20 lines)
m.partial_fit(x)
m.predict(new_x)
也许sklearn并不是处理这类问题的合适工具?请告诉我你的看法。
4 个回答
我觉得你选择用Python来做统计分析而不是R挺有意思的。不过,我建议你先把数据整理成能处理这么大数据集的格式。Python的h5py库非常适合这种存储方式,它能让你快速访问数据。你需要把数据分成合理的块,比如每块包含100万条数据,比如20列乘以50,000行,然后把每块写入H5文件。接下来,你需要考虑你要运行什么样的模型,但你还没有具体说明。
实际上,由于数据量大,你可能需要自己编写模型和机器学习的交叉验证算法。首先,写一个算法来总结数据,这样你就能知道自己在看什么。然后,一旦你决定了要运行哪个模型,就需要考虑交叉验证的方式。在每个数据块中添加一列,标明每一行属于哪个验证集。你可以选择给每个数据块标记为特定的验证集。
接下来,你需要写一个类似于MapReduce的算法来在验证子集上运行你的模型。另一种方法是直接在每个验证集的每个数据块上运行模型,然后取平均结果(要考虑这种方法的理论有效性)。
可以考虑使用Spark,或者R和rhdf5之类的工具。我没有提供任何代码,因为这更像是一个项目,而不仅仅是一个简单的编码问题。
你可以看看 Dask 或 Graphlab。
这两个工具和 pandas 有点像,但它们可以处理大规模的数据(使用外存数据框)。pandas 的一个问题是,所有的数据都必须能放进内存里。
这两个框架都可以和 scikit learn 一起使用。你可以把 22 GB 的数据加载到 Dask 或 SFrame 中,然后再用 sklearn 进行处理。
我用过几个支持大数据处理的scikit-learn分类器来训练线性模型,比如随机梯度下降、感知机、被动攻击和多项式朴素贝叶斯,这些都是在一个超过30GB的Kaggle数据集上进行的。这些分类器都有一个叫做partial_fit的方法,正如你提到的。不过,有些分类器的表现比其他的要好。
你可以在这篇文章中找到方法论、案例研究和一些不错的资源: http://www.opendatascience.com/blog/riding-on-large-data-with-scikit-learn/
我觉得sklearn在处理大数据时还不错。如果你选择的算法支持部分训练(partial_fit)或者在线学习的方法,那就没问题了。不过要注意的是,你的数据块大小可能会影响你的成功率。
这个链接可能对你有帮助... 在Python和Numpy中处理大数据,内存不够,如何将部分结果保存到磁盘?
我同意h5py很有用,但你可能更想用一些你已经掌握的工具。
你还可以随机选择是否保留csv文件中的某一行...然后把结果保存到.npy文件中,这样加载会更快。这样你就能得到一部分数据,可以用来尝试各种算法...同时也能在处理大数据的问题上找到解决办法(或者根本不处理!有时候,取样和好的方法就足够了,这要看你想要什么)。