从Vowpal Wabbit的内存中读取数据?

时间:2014-07-20 01:16:23

标签: c++ r vowpalwabbit

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

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

现在,为了训练模型,我必须首先将转换后的数据写入文件,然后将该文件提供给VW。写入磁盘部分的时间太长,特别是因为我想尝试不同的功能转换的各种模型,因此我必须多次将数据写入磁盘。

所以,假设我能够在R中创建一个字符向量,其中每个元素都是VW格式的一行数据,如何在不将其写入磁盘的情况下将其提供给大众?

我考虑使用守护进程模式并将字符向量写入localhost连接,但是我无法在守护进程模式下让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)

3 个答案:

答案 0 :(得分:5)

您可能正在寻找的是在守护程序模式下运行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虽然注意到在该主要示例中预先学习并加载到内存中。

答案 1 :(得分:2)

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

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

1 save_filename| 

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

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

答案 2 :(得分:0)

我也在使用R来转换数据并将它们输出到VowpalWabbit。存在RVowpalWabbit CRAN上的软件包可以用来连接R和VowpalWabbit。然而, 它只能在Linux上使用。

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