【问题标题】:Data Splitting in RubyRuby 中的数据拆分
【发布时间】:2013-03-30 11:19:23
【问题描述】:

我正在寻找一种 gem,它将 CSV 数据集拆分为更小的数据集,以便在机器学习系统上进行训练和测试。 R 中有一个包可以根据随机抽样执行此操作;但我的研究并没有在 Ruby 中发现任何东西。我想在 Ruby 中这样做的原因是原始数据集非常大,例如1700 万行或 5.5 gig。 R 期望将整个数据集加载到内存中。 Ruby 要灵活得多。任何建议将不胜感激。

【问题讨论】:

    标签: ruby csv split


    【解决方案1】:

    这会将您的原始数据分成两个文件,而不会将其全部加载到内存中:

    require 'csv'
    
    sample_perc = 0.75
    
    CSV.open('sample.csv','w') do |sample_out|
      CSV.open('test.csv','w') do |test_out|
        CSV.foreach('alldata.csv') do |row|
          (Random.rand < sample_perc ? sample_out : test_out) << row
        end
      end
    end
    

    【讨论】:

    • 这是一个非常优雅的解决方案。
    【解决方案2】:

    您可以使用 smarter_csv Ruby gem 并将 chunk_size 设置为所需的样本大小, 然后将块保存为 Resque 作业,然后可以并行处理。

    https://github.com/tilo/smarter_csv

    查看该 GitHub 页面上的示例。

    【讨论】:

      【解决方案3】:

      CSV 是 ruby​​ 内置的,您不需要任何 gem 来执行此操作:

      require 'csv'
      
      csvs = (1..10).map{|i| CSV.open("data#{i}.csv", "w")}
      CSV.foreach("data.csv") do |row|
        csvs.sample << row
      end
      

      CSV.foreach 不会将整个文件加载到内存中。

      【讨论】:

      • 嗯。我想我的问题是你如何设置样本量。例如。主文件的训练 .75 和主文件的测试 .25。另一个问题涉及重叠的可能性。在训练和测试子集中都不能有任何给定的行。我非常感谢您的回复。
      • @pguardiario 你能加入这里吗 - chat.stackoverflow.com/rooms/27184/ruby-conceptual
      • 抱歉,我不明白这些数字是什么意思,或者你所说的测试或培训是什么意思。
      • 当您尝试为给定数据集构建预测模型时,您首先将数据集分成两组,一个训练集和一个测试集。您使用训练集来构建预测模型,例如回归模型、分类树或贝叶斯网络。然后在测试集上测试预测模型。您希望将记录随机分配给训练集或测试集,并且您希望确保 a 记录不会出现在两个集中。至于数字,它们反映了训练集 (75%) 和测试集 (25%) 中记录的百分比。
      • 好的,我的回答描述了将 csv 拆分为 10 个较小的 csv。 Dbenhur 的答案可能更接近您的需要。
      【解决方案4】:

      您可能希望为此编写自己的代码,基于 Ruby 捆绑的 csv gem。如何拆分数据有很多可能性,在如此大的数据集上高效执行此操作的要求非常专业,同时也不需要那么多代码。

      但是,您可能会在查看ai4r 的许多子功能时获得一些运气

      我还没有为 Ruby 找到许多成熟的预打包机器学习算法(您也可以在 R 或 Python 的 scikitlearn 中找到这些算法)。没有随机森林、gbm 等——或者如果有的话,它们很难找到。 R 的 Ruby 接口。也是 ATLAS 的包装器。我都没试过。

      我确实使用了 ruby-fann(神经网络),而 gem narray 是您处理大型数值数据集的朋友。

      【讨论】:

      • 感谢尼尔的回复。我做了很多挖掘,我找不到任何东西。 ML 似乎并没有真正进入 Ruby 场景。 R 的问题在于它还没有完全成为 OOP 的方式,文件处理是一场噩梦。我一直在使用 Ruby 来混淆数据。反正我是在写代码,我不妨试试自己制作一个 gem。我只是不想重新发明轮子。
      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 2015-01-02
      • 2012-10-16
      相关资源
      最近更新 更多