Ruby中的数据拆分

时间:2013-03-30 11:19:24

标签: ruby csv split

我正在寻找一个宝石,它将CSV数据集拆分成更小的数据集,用于在机器学习系统上进行培训和测试。根据随机抽样, R 中有一个包可以做到这一点;但是我的研究在Ruby中没有发现任何东西。我想在Ruby中这样做的原因是原始数据集非常大,例如1700万行或5.5演出。 R 期望将整个数据集加载到内存中。 Ruby更灵活。任何建议将不胜感激。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

CSV内置于ruby中,您不需要任何宝石来执行此操作:

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不会将整个文件加载到内存中。

答案 2 :(得分:0)

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

但是,您可能会看到ai4r

的许多子功能

我还没有找到许多用于Ruby的成熟的预先打包的机器学习算法(你可能也会在R或Python的scikitlearn中找到)。没有随机森林,gbm等 - 或者如果有,它们很难找到。 到R的Ruby接口。也是ATLAS的包装器。我也没试过。

我确实使用ruby-fann(神经网络),而宝石narray是你的大数值数据集的朋友。

答案 3 :(得分:0)

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

https://github.com/tilo/smarter_csv

查看GitHub页面上的示例。