5

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

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

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

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

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

如有必要,我愿意使用 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)
4

3 回答 3

5

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

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

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

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

现在您可以 TCP 连接到服务器(可以是localhost, on port 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 尽管请注意,在该主要示例中,模型是预先学习并加载到内存中的。

于 2014-07-20T22:47:13.983 回答
2

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

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

1 save_filename| 

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

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

于 2014-07-20T21:57:35.113 回答
0

我还使用 R 转换数据并将它们输出到 VowpalWabbit。CRAN 上有RVowpalWabbit 可以用来连接 R 和 VowpalWabbit 的包。但是,它仅在 Linux 上可用。

另外,为了加快速度,我使用freaddata.table包的功能。的转换data.table也比 in 快data.frame,但需要学习不同的语法。

于 2014-07-20T12:43:03.150 回答