2014-07-20 29 views
5

有没有办法发送数据来在Vowpal Wabbit中训练模型而不写入磁盘?从Vowpal Wabbit的内存中读取数据?

这是我正在尝试做的。我有一个相对较大的csv数据集(大约2GB),适合内存,没有问题。我将它加载到数据框中,并且我有一个函数可以将该数据框中的数据转换为VW格式。

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

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

我考虑过使用守护进程模式和写作的特征向量到本地主机连接,但在守护进程模式我不能让大众来列车 - 我不知道这甚至有可能。

如果需要,我愿意使用C++(通过Rcpp包)来完成这项工作。

非常感谢您提前。

UPDATE:

谢谢大家的帮助。如果任何人的兴趣,我只是管道输出到大众作为回答表明,像这样:

# 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) 

回答

2

Vowpal Wabbit支持从标准输入(猫train.dat | VW)中读取数据,所以你可以从R.

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

1 save_filename| 

另一种选择是使用VW图书馆,看到一个example

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

+0

非常感谢。为了澄清,如果我使用“保存”虚拟示例技巧,保存的模型将基于发送到该守护进程的所有示例,直到该点,对吧? – user3856970

+0

是的,保存的模型将基于发送到该守护进程的所有示例(如同在线学习一样,后面的示例更多地影响模型)。 –

0

我也使用R键数据,并将其输出转换为VowpalWabbit。在CRAN上存在用于连接R和VowpalWabbit的RVowpalWabbit 包。但是,它仅在Linux上可用。

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

+0

谢谢。我熟悉'data.table'和'RVowpalWabbit'。但是,后者对此无能为力,因为您仍然需要指定一个文件来读取数据。 – user3856970

+0

是的,我还没有意识到这个'RVowpalWabbit'。感谢您写下对您有用的东西。我也尝试使用该方法,但没有生成“my_model.vw”文件。有什么建议么?我在Windows 7上运行它,“vw.exe”位于R和命令行工作目录中。 –

+0

也许尝试使用所选答案中提到的“保存”技巧?我放弃了在Windows上使用VW,因为它给我带来了太多的麻烦。所以如果这也失败了,我建议你在Linux上试试它。 – user3856970

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虽然请注意,在该主要示例中,模型是预先学习并加载到内存中的。