【问题标题】:What dos this Ruby statement mean?这个 Ruby 语句是什么意思?
【发布时间】:2019-10-15 15:50:00
【问题描述】:

以下代码来自 Ruby Gem rroc 的文档。我迫切需要为我的 AI 项目计算 AUC。但是我几乎没有 Ruby 文件 I/O 的知识,也没有机会学习。文档说 rroc 需要一个 n×2 数组,但下面的第一行代码表明数据在 csv 文件中,它将被格式化为 my_data 以便 roc 计算 auc。

我已经尝试了 csv 数据和数组的所有可能组合作为第一行读取或直接输入到计算 auc 的行的两个文件。充其量代码可以正常工作,没有错误,但输出为 0。我希望,如果我对该行的作用有更全面的了解,我可以解决问题或放弃之前版本的 gem宝石被证明是过时的,这个已经 8 岁了。我从 gem 作者引用的文章中获取了数据,并且很确定这不是问题,但是,...

所以,为了细化这个问题:从那句话中,我们能知道“some_data.cvs”中应该包含什么样的数据吗?以及如何制作 my_data?

require 'rroc'

my_data = open('some_data.csv').readlines.collect { |l| l.strip.split(",").map(&:to_f) }
auc = ROC.auc(my_data)
puts auc

下面我复制了两次运行的输出,第一次是读入数组数据,第二次是 csv 值(每个都在单独的文件中)。为了确定,我添加了一行来读出输入文件。

RoyiMac:ruby $ ruby PDaucT.rb
[[90, 1], [80, 1], [70,-1], [60,1], [55,1], [54,1], [53,-1], [52,-1], [51,1], [50,-1], [40,1], [39,-1], [38,1], [37,-1], [36,-1], [35,-1], [34,1], [33,-1], [30,1], [10,-1]] 

0.0
RoyiMac:ruby $ ruby PDaucT.rb
90,1,80,1,70,-1,60,1,55,1,54,1,53,-1,52,-1,51,1,50,-1,40,1,39,-1,38,1,37,-1,36,-1,35,-1,34,1,33,-1,30,1,10,-1

0.0

【问题讨论】:

  • 运行 REPL 中的每一段代码以查看它正在创建什么也一样快,不是吗? (同时使用collectmap 很奇怪,但这是次要的。)我的意思是,希望readlines 是不言自明的,而collect/map 是非常典型的操作。除了 auc 没有提供您认为应该得到的结果之外,代码的具体问题是什么?
  • 这段代码会进行简单的 CSV 解析。正确的方法是使用built-in CSV module
  • 请花点时间为您的问题写一个新标题。这个标题是完全通用的,无法深入了解您的要求。请参阅How do I ask a good question?,具体来说:“标题是潜在回答者首先看到的内容,如果您的标题不感兴趣,他们将不会阅读其余部分。因此,请重视。”
  • 如果您能准确地解释您对这些方法的文档不清楚的地方,以及您执行代码的哪些部分,将会很有帮助> 和 明白。你知道什么是变量吗?你知道什么是消息发送吗?你知道什么是任务吗?你知道什么是参数列表吗?你知道什么是块吗?你知道什么是参数列表吗?你知道什么是字符串吗?你知道什么是浮标吗?你知道什么是常数吗?等等。一方面,这将使我们能够集中我们的答案。其次,这将使 Ruby 开发人员能够……
  • ... 改进文档,以便未来的开发人员不会遇到与您相同的问题。帮助世界变得更美好!

标签: ruby file rubygems


【解决方案1】:

代码说明:

open('some_data.csv') # open the some_data.csv file
  .readlines          # returns an array with each element being a line
  .collect { |l|      # for each line do the following tranformation
    l.strip           # remove proceeding and trailing whitespace characters
     .split(',')      # split the line based on the "," character (returning an array)
     .map(&:to_f)     # call .to_f on each element in the array, converting them to a float value
  }

map/collect 是彼此的别名。

但是,就像 tadman 已经说过的 in the comments 一样,您最好使用 csv 标准库。也可以通过以下方式实现:

require 'csv'

my_data = CSV.read('some_data.csv', converters: :float)
# should output
#=> [[90, 1], [80, 1], [70,-1], [60,1], [55,1], [54,1], [53,-1], [52,-1], [51,1], [50,-1], [40,1], [39,-1], [38,1], [37,-1], [36,-1], [35,-1], [34,1], [33,-1], [30,1], [10,-1]]

【讨论】:

  • 当我阅读您的回复时,我不清楚您为我翻译的代码将如何生成和排列,就像您在标准库示例中显示的那样。然后我复制了你的 csv 代码,给它提供了一个与上面复制的输出中的第二个完全相同的文本文件,它返回了数字的垂直列表,每行一个。然后我使用了有问题的原始行,它也打印了一个垂直列表,每行一个数字。所以在我看来仍然不清楚 roc 需要什么,如果它需要一个数组,它如何得到一个给定提供的代码。
  • @Roy 我对 roc-curve 没有任何经验,但该库也提供 ROC.curve_points(my_data),您可以检查是否会产生任何结果。
  • 这是绘制 ROC 曲线本身的单独方法。有趣但不是我需要的。
  • 你这么说,但auccurve_points 都调用相同的方法。 github.com/stevenbedrick/RROC/blob/…
猜你喜欢
  • 2012-01-05
  • 2021-12-25
  • 2014-03-30
  • 1970-01-01
  • 2022-01-12
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多