【问题标题】:Read data from memory in Vowpal Wabbit?从 Vowpal Wabbit 的内存中读取数据?
【发布时间】:2014-09-10 20:35:23
【问题描述】:

有没有办法发送数据以在 Vowpal Wabbit 中训练模型而不将其写入磁盘?

这就是我想要做的。我在 csv 中有一个相对较大的数据集(大约 2gb),它可以毫无问题地放入内存中。我将它在 R 中加载到一个数据框中,并且我有一个函数可以将该数据框中的数据转换为 VW 格式。

现在,为了训练模型,我必须先将转换后的数据写入文件,然后将该文件提供给大众。并且写入磁盘部分花费的时间太长,特别是因为我想尝试具有不同特征转换的不同模型,因此我必须多次将数据写入磁盘。

那么,假设我能够在 R 中创建一个字符向量,其中每个元素都是 VW 格式的一行数据,我怎么能将它输入 VW 而不将其写入磁盘?

我考虑使用守护程序模式并将字符向量写入本地主机连接,但我无法在守护程序模式下让 VW 进入 train ——我不确定这是否可能。

如有必要,我愿意使用 c++(通过 Rcpp 包)来完成这项工作。

非常感谢您。

更新:

感谢大家的帮助。如果有人感兴趣,我只是按照答案中的建议将输出通过管道传输到大众,如下所示:

# Two sample rows of data
datarows <- c("1 |name 1:1 2:4 4:1", "-1 |name 1:1 4:1")
# Open connection to VW
con <- pipe("vw -f my_model.vw")
# Write to connection and close
writeLines(datarows, con)
close(con)

【问题讨论】:

    标签: c++ r vowpalwabbit


    【解决方案1】:

    您可能正在寻找以守护程序模式运行 vw

    执行此操作的标准方法是将vw 作为守护程序运行:

    vw -i some.model --daemon --quiet --port 26542 -p /dev/stdout
    

    您可以将26542 替换为您选择的端口。

    现在您可以 TCP 连接到服务器(可以是 localhost,在端口 26542 上),并且您写入 TCP 套接字的每个请求都将在同一个套接字上得到响应。

    您既可以学习(发送带标签的示例,这将实时更改模型),也可以编写查询并回读响应。

    您可以一次执行一个查询+预测,也可以一次执行多个。您所需要的只是每个查询末尾的换行符,就像您从文件中测试一样。保证订单被保留。

    您还可以将用于学习的请求与仅用于预测且不应更新内存模型的请求混合使用。实现这一点的诀窍是对您不想学习的示例使用零权重。

    此示例将更新模型,因为它的权重为 1:

    label 1 'tag1| input_features...
    

    而且这个不会更新模型,因为它的权重为 0:

    label 0 'tag2| input_features...
    

    官方参考中的更多内容在 vowpal wabbit wiki 中: How to run vowpal wabbit as a daemon 尽管请注意,在该主要示例中,模型是预先学习并加载到内存中的。

    【讨论】:

      【解决方案2】:

      Vowpal Wabbit 支持从标准输入(cat train.dat | vw)读取数据,因此您可以直接从 R 中打开管道。

      守护程序模式支持训练。如果您需要增量/连续学习,您可以使用带有标签以字符串“save”开头的虚拟示例的技巧。您也可以选择指定模型文件名:

      1 save_filename| 
      

      另一种选择是使用 VW 作为库,请参阅 example

      请注意,VW 支持使用特征命名空间的各种特征工程。

      【讨论】:

      • 非常感谢。澄清一下,如果我使用“保存”虚拟示例技巧,保存的模型将基于到那时发送到守护程序的所有示例,对吧?
      • 是的,保存的模型将基于到那时发送到守护程序的所有示例(并且与在线学习一样,后面的示例对模型的影响更大)。
      【解决方案3】:

      我也在使用 R 来转换数据并将它们输出到 VowpalWabbit。存在RVowpalWabbit CRAN 上的包,可用于将 R 与 VowpalWabbit 连接。然而, 它仅在 Linux 上可用。

      另外,为了加快速度,我使用了data.table 包的fread 函数。 data.table 的转换也比 data.frame 更快,但需要学习另一种语法。

      【讨论】:

      • 谢谢。我对data.tableRVowpalWabbit 都很熟悉。但是,后者对此无济于事,因为您仍然需要指定一个文件来读取数据。
      • 是的,我还没有意识到RVowpalWabbit 的这一点。感谢您写下对您有用的方法。我也尝试使用该方法,但是没有生成文件“my_model.vw”。有什么建议?我在 Windows 7 上运行它,“vw.exe”位于 R 和命令行工作目录中。
      • 也许尝试使用所选答案中提到的“保存”技巧?我放弃了在 Windows 上使用 VW,因为它给我带来了太多的头痛。所以如果这也失败了,我建议你在 Linux 上试试。
      猜你喜欢
      • 2014-12-08
      • 2013-04-07
      • 2017-10-09
      • 2018-01-20
      • 2013-12-15
      • 2014-08-29
      • 2015-01-06
      • 2015-06-20
      • 2017-10-07
      相关资源
      最近更新 更多