【发布时间】:2013-03-30 11:19:23
【问题描述】:
我正在寻找一种 gem,它将 CSV 数据集拆分为更小的数据集,以便在机器学习系统上进行训练和测试。 R 中有一个包可以根据随机抽样执行此操作;但我的研究并没有在 Ruby 中发现任何东西。我想在 Ruby 中这样做的原因是原始数据集非常大,例如1700 万行或 5.5 gig。 R 期望将整个数据集加载到内存中。 Ruby 要灵活得多。任何建议将不胜感激。
【问题讨论】:
我正在寻找一种 gem,它将 CSV 数据集拆分为更小的数据集,以便在机器学习系统上进行训练和测试。 R 中有一个包可以根据随机抽样执行此操作;但我的研究并没有在 Ruby 中发现任何东西。我想在 Ruby 中这样做的原因是原始数据集非常大,例如1700 万行或 5.5 gig。 R 期望将整个数据集加载到内存中。 Ruby 要灵活得多。任何建议将不胜感激。
【问题讨论】:
这会将您的原始数据分成两个文件,而不会将其全部加载到内存中:
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
【讨论】:
您可以使用 smarter_csv Ruby gem 并将 chunk_size 设置为所需的样本大小, 然后将块保存为 Resque 作业,然后可以并行处理。
https://github.com/tilo/smarter_csv
查看该 GitHub 页面上的示例。
【讨论】:
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 不会将整个文件加载到内存中。
【讨论】:
您可能希望为此编写自己的代码,基于 Ruby 捆绑的 csv gem。如何拆分数据有很多可能性,在如此大的数据集上高效执行此操作的要求非常专业,同时也不需要那么多代码。
但是,您可能会在查看ai4r 的许多子功能时获得一些运气
我还没有为 Ruby 找到许多成熟的预打包机器学习算法(您也可以在 R 或 Python 的 scikitlearn 中找到这些算法)。没有随机森林、gbm 等——或者如果有的话,它们很难找到。 有 R 的 Ruby 接口。也是 ATLAS 的包装器。我都没试过。
我确实使用了 ruby-fann(神经网络),而 gem narray 是您处理大型数值数据集的朋友。
【讨论】: