【问题标题】:sklearn and large datasetssklearn 和大型数据集
【发布时间】:2014-07-15 09:26:52
【问题描述】:

我有一个 22 GB 的数据集。我想在我的笔记本电脑上处理它。当然,我无法将其加载到内存中。

我经常使用 sklearn,但数据集要小得多。

在这种情况下,经典方法应该是这样的。

只读部分数据 -> 部分训练您的估算器 -> 删除数据 -> 读取其他部分数据 -> 继续训练您的估算器。

我已经看到一些 sklearn 算法具有部分拟合方法,应该允许我们使用数据的各种子样本训练估计器。

现在我想知道为什么在 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 不是处理这类事情的正确工具? 告诉我。

【问题讨论】:

  • 查看相关:stackoverflow.com/questions/17017878/…,根据您的任务应该是可能的
  • 我找到了一些变量太多的例子。但是如果我们的样本太多怎么办?
  • 我不是专家,但我认为没关系,您的模型是根据输入进行训练的,它应该只是存储的参数/权重。如果您有一个决策树,情况就不同了,因为随着参数数量的增加以及样本量的增加,决策树的大小会增加。
  • 真正的问题是我无法加载 csv 文件,因为它太大了

标签: python bigdata scikit-learn


【解决方案1】:

你可能想看看 Dask 或 Graphlab

它们类似于 pandas,但处理的是大规模数据(使用核外数据帧)。 pandas 的问题是所有数据都必须放入内存中。

这两个框架都可以与 scikit learn 一起使用。您可以将 22 GB 的数据加载到 Dask 或 SFrame,然后与 sklearn 一起使用。

【讨论】:

  • 那么它适用于 scikit-learn 吗?或不?请扩展您的答案
  • @Mayou36 我已经将 SFrames 与 scikit learn 一起使用,是的,它们非常兼容。不过我还没用过 Dask。
  • 我不相信 scikit-learn 会接受 dask 数据帧作为输入
【解决方案2】:

我在超过 30Gb 的 Kaggle 数据集上使用了几个具有核外功能的 scikit-learn 分类器来训练线性模型:随机梯度、感知器和被动攻击以及多项朴素贝叶斯。所有这些分类器都共享您提到的 partial_fit 方法。不过,有些人的表现比其他人好。

您可以在这篇文章中找到方法、案例研究和一些很好的资源: http://www.opendatascience.com/blog/riding-on-large-data-with-scikit-learn/

【讨论】:

    【解决方案3】:

    我认为 sklearn 适用于更大的数据。如果您选择的算法支持 partial_fit 或在线学习方法,那么您就走上了正轨。需要注意的一件事是,您的块大小可能会影响您的成功。

    此链接可能有用... Working with big data in python and numpy, not enough ram, how to save partial results on disc?

    我同意 h5py 很有用,但您可能希望使用 quiver 中已有的工具。

    您可以做的另一件事是随机选择是否在 csv 文件中保留一行...并将结果保存到 .npy 文件中,以便更快地加载。通过这种方式,您可以获得数据样本,让您可以开始使用所有算法......并在此过程中处理更大的数据问题(或根本不处理!有时采用好的方法的样本就足够了取决于你想要什么)。

    【讨论】:

      【解决方案4】:

      我发现您选择使用 Python 而不是 R 进行统计分析很有趣,但是,我将从将我的数据转换为可以处理如此大的数据集的格式开始。 python h5py 包非常适合这种存储——允许非常快速地访问您的数据。您将需要以合理的大小将数据分块,例如 100 万个元素块,例如20 列 x 50,000 行将每个块写入 H5 文件。接下来你需要考虑你正在运行什么样的模型——你还没有真正指定。

      事实上,由于数据量很大,您可能不得不为模型和机器学习交叉验证编写算法。首先编写一个算法来总结数据,这样你就知道你在看什么。然后,一旦您决定要运行什么模型,您将需要考虑交叉验证将是什么。在数据集的每个块中放入一个“列”,表示每行属于哪个验证集。许多人选择将每个块标记为特定的验证集。

      接下来,您将需要编写一个 map reduce 风格的算法来在验证子集上运行您的模型。另一种方法是简单地在每个验证集的每个块上运行模型并平均结果(考虑这种方法的理论有效性)。

      考虑使用 spark,或 R 和 rhdf5 或类似的东西。我没有提供任何代码,因为这是一个项目,而不仅仅是一个简单的编码问题。

      【讨论】:

      • 使用 Python 代替 R 进行数据分析是很常见的。 AFAIK,它们现在同样被使用,python,因为它是一种功能齐全的编程语言,通常受到具有一定编程经验的用户的青睐。
      猜你喜欢
      • 2015-05-19
      • 2020-06-10
      • 2018-09-11
      • 1970-01-01
      • 2017-05-11
      • 2019-10-24
      • 2019-04-26
      • 2017-03-07
      • 2012-07-07
      相关资源
      最近更新 更多