2014-07-20 24 views
5

Esiste un modo per inviare dati per addestrare un modello in Vowpal Wabbit senza scriverlo su disco?Leggi i dati dalla memoria in Vowpal Wabbit?

Ecco cosa sto cercando di fare. Ho un dataset relativamente grande in csv (circa 2gb) che si adatta alla memoria senza problemi. Lo carico in R in un frame di dati, e ho una funzione per convertire i dati in quel dataframe in formato VW.

Ora, per addestrare un modello, devo prima scrivere i dati convertiti in un file e poi inviarlo a VW. E la scrittura su disco parte troppo tempo, soprattutto perché voglio provare diversi modelli con diverse trasformazioni di funzionalità, e quindi devo scrivere i dati su disco più volte.

Quindi, supponendo che io sia in grado di creare un vettore di caratteri in R, in cui ogni elemento è una riga di dati in formato VW, come potrei inserirlo in VW senza scriverlo su disco?

Ho considerato l'utilizzo della modalità daemon e la scrittura del vettore di caratteri su una connessione localhost, ma non ho potuto ottenere VW a treno in modalità daemon: non sono sicuro che ciò sia possibile.

Sono disposto a utilizzare C++ (tramite il pacchetto Rcpp) se necessario per farlo funzionare.

Grazie mille in anticipo.

UPDATE:

Grazie a tutti per il vostro aiuto. Nel caso in cui qualcuno è interessato, ho appena convogliato l'output a VW come suggerito nella risposta, in questo modo:

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

risposta

2

Vowpal Wabbit supporta la lettura dei dati da standard input (cat train.dat | vw), in modo da poter aprire un tubo direttamente da R.

modalità demone sostiene la formazione. Se hai bisogno di apprendimento incrementale/contiguo, puoi usare un trucco con un esempio fittizio il cui tag inizia con la stringa "salva". Opzionalmente è possibile specificare il nome del file modello così:

1 save_filename| 

Un'altra opzione è quella di utilizzare VW come biblioteca, vedere una example.

Si noti che VW supporta varie funzionalità di ingegneria utilizzando gli spazi dei nomi delle funzionalità.

+0

Grazie mille. Per chiarire, se uso il trucco di esempio fittizio "salva", il modello salvato sarà basato su tutti gli esempi inviati al demone fino a quel punto, giusto? – user3856970

+0

Sì, il modello salvato sarà basato su tutti gli esempi inviati al demone fino a quel momento (e come al solito con l'apprendimento online, gli esempi successivi influenzano maggiormente il modello). –

0

Sono anche utilizzando R per trasformare i dati e li uscita VowpalWabbit. Esiste il pacchetto RVowpalWabbit su CRAN che può essere utilizzato per connettere R con VowpalWabbit. Tuttavia, è disponibile solo su Linux.

Inoltre, per velocizzare le cose, utilizzo la funzione fread del pacchetto data.table. Le trasformazioni di data.table sono anche più veloci rispetto a data.frame, ma è necessario imparare una sintassi diversa.

+0

Grazie. Ho familiarità con 'data.table' e' RVowpalWabbit'. Tuttavia, quest'ultimo non sarà d'aiuto, poiché è comunque necessario specificare un file per leggere i dati. – user3856970

+0

Sì, non me ne sono reso conto di 'RVowpalWabbit'. Grazie per aver scritto cosa ha funzionato per te. Ho provato ad usare anche l'approccio, tuttavia non è stato prodotto alcun file "my_model.vw". Eventuali suggerimenti? Lo sto eseguendo su Windows 7, "vw.exe" che si trova sia in R che nella directory di lavoro della riga di comando. –

+0

Forse prova ad usare il trucco "salva" menzionato nella risposta scelta? Ho rinunciato a utilizzare VW su Windows in quanto mi ha portato troppi mal di testa. Quindi, se anche questo dovesse fallire, ti suggerirei di provarlo su Linux. – user3856970

5

Quello che stai cercando è in esecuzione vw in modalità daemon.

Il modo standard per farlo è quello di eseguire vw come demone:

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

È possibile sostituire 26542 dal porto di vostra scelta.

Ora è possibile connettersi al server TCP (che può essere localhost, sulla porta 26542) e ad ogni richiesta che si scrive sul socket TCP, verrà risposto sullo stesso socket.

È possibile sia imparare (inviare esempi etichettati, che cambieranno il modello in tempo reale) sia scrivere query e leggere risposte.

È possibile eseguire una query + una previsione alla volta o molte alla volta. Tutto ciò di cui hai bisogno è un char newline alla fine di ogni query, esattamente come testare da un file. L'ordine è garantito per essere conservato.

È inoltre possibile interconnettere le richieste per apprendere dalle richieste destinate esclusivamente alla previsione e non è previsto l'aggiornamento del modello in memoria. Il trucco per raggiungere questo obiettivo è usare un peso zero per esempi da cui non si vuole imparare.

Questo esempio aggiornare il modello perché ha un peso di 1:

label 1 'tag1| input_features... 

E questo non aggiornerà il modello perché ha un peso di 0:

label 0 'tag2| input_features... 

A un po 'più nel riferimento ufficiale è nel wiki wabbit vowpal: How to run vowpal wabbit as a daemon sebbene si noti che in quell'esempio principale un modello è pre-imparato e caricato in memoria.