有没有办法在不将数据写入磁盘的情况下发送数据以在 Vowpal Wabbit 中训练模型?
这就是我想要做的。我在 csv 中有一个相对较大的数据集(大约 2gb),可以毫无问题地放入内存中。我在 R 中将它加载到一个数据框中,并且我有一个函数可以将该数据框中的数据转换为 VW 格式。
现在,为了训练模型,我必须先将转换后的数据写入文件,然后将该文件提供给 VW。并且写入磁盘部分耗时太长,特别是因为我想尝试具有不同特征转换的不同模型,因此我不得不多次将数据写入磁盘。
因此,假设我能够在 R 中创建一个字符 vector ,其中每个元素都是 VW 格式的一行数据,我如何在不将其写入磁盘的情况下将其输入 VW?
我考虑过使用守护程序模式并将字符 vector 写入本地主机连接,但我无法让 VW 在守护程序模式下训练——我不确定这是否可能。
如有必要,我愿意使用 c++(通过 Rcpp 包)来完成这项工作。
非常感谢您。
更新:
谢谢大家的帮助。如果有人感兴趣,我只是按照答案中的建议将输出通过管道传输到 VW,如下所示:
# 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)
最佳答案
您可能正在寻找的是在守护进程模式下运行 vw
。
执行此操作的标准方法是将 vw
作为守护进程运行:
vw -i some.model --daemon --quiet --port 26542 -p /dev/stdout
您可以将 26542
替换为您选择的端口。
现在您可以通过 TCP 连接到服务器(可以是 localhost
,在端口 26542
上)并且您写入 TCP 套接字的每个请求都将在同一个 socket 。
您既可以学习(发送带标签的示例,这将实时更改模型),也可以编写查询并回读响应。
您可以一次执行一个查询+预测,也可以一次执行多个。您所需要的只是每个查询末尾的换行符,就像您从文件中测试一样。订单保证得到保留。
您还可以将学习请求与仅用于预测且不应更新内存模型的请求混合使用。实现此目的的技巧是对您不想从中学习的示例使用零权重。
此示例将更新模型,因为它的权重为 1:
label 1 'tag1| input_features...
而这个不会更新模型,因为它的权重为 0:
label 0 'tag2| input_features...
官方引用中的更多内容位于 vowpal wabbit wiki 中: How to run vowpal wabbit as a daemon尽管请注意,在该主要示例中,模型是预先学习并加载到内存中的。
关于c++ - 从 Vowpal Wabbit 中的内存读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24846454/