2014-07-20 7 views
5

Gibt es eine Möglichkeit, Daten zu senden, um ein Modell in Vowpal Wabbit zu trainieren, ohne es auf die Festplatte zu schreiben?Lesen Sie Daten aus dem Speicher in Vowpal Wabbit?

Hier ist, was ich versuche zu tun. Ich habe einen relativ großen Datensatz in csv (ca. 2GB), der problemlos in den Speicher passt. Ich lade es in R in einen Datenrahmen und ich habe eine Funktion, um die Daten in diesem Datenrahmen in VW-Format zu konvertieren.

Jetzt, um ein Modell zu trainieren, muss ich zuerst die konvertierten Daten in eine Datei schreiben und dann diese Datei an VW füttern. Und das Schreiben in den Disk-Teil dauert viel zu lange, zumal ich verschiedene Modelle mit verschiedenen Feature-Transformationen ausprobieren will und somit die Daten mehrfach auf die Festplatte schreiben muss.

Also angenommen, ich bin in der Lage, einen Zeichenvektor in R zu erstellen, in dem jedes Element eine Reihe von Daten im VW-Format ist, wie könnte ich das in VW einspeisen, ohne es auf die Festplatte zu schreiben?

Ich dachte über die Verwendung des Daemon-Modus und das Schreiben des Zeichenvektors auf eine Localhost-Verbindung, aber ich konnte VW nicht im Daemon-Modus trainieren - ich bin mir nicht sicher, ob das überhaupt möglich ist.

Ich bin bereit, C++ (über das Rcpp-Paket) zu verwenden, wenn dies erforderlich ist, um dies zu arbeiten.

Vielen Dank im Voraus.

UPDATE:

Vielen Dank an alle für Ihre Hilfe. Falls jemand interessiert, ich verrohrt nur die Ausgabe an VW, wie in der Antwort vorgeschlagen, etwa so:

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

Antwort

2

Vowpal Wabbit unterstützt Daten von der Standardeingabe lesen (cat train.dat | vw), so dass Sie ein Rohr direkt von R. öffnen kann

Daemon-Modus Training unterstützt. Wenn Sie inkrementelles/zusammenhängendes Lernen benötigen, können Sie einen Trick mit einem Dummy-Beispiel verwenden, dessen Tag mit der Zeichenfolge "save" beginnt. Optional können Sie das Modell Dateinamen mit angeben:

1 save_filename| 

Noch eine andere Option VW als Bibliothek zu verwenden ist, eine example sehen.

Beachten Sie, dass VW verschiedene Feature-Engineering mit Feature-Namespaces unterstützt.

+0

Vielen Dank. Um zu verdeutlichen, wenn ich den Dummy-Beispieltrick "Speichern" verwende, basiert das gespeicherte Modell auf allen Beispielen, die bis dahin an den Daemon gesendet wurden, richtig? – user3856970

+0

Ja, das gespeicherte Modell basiert auf allen Beispielen, die bis zu diesem Zeitpunkt an den Daemon gesendet wurden (und wie beim Online-Lernen üblich, beeinflussen die späteren Beispiele das Modell mehr). –

0

ich auch R bin mit ihnen zu VowpalWabbit zu transformieren Daten und ausgegeben. Es gibt RVowpalWabbit Paket auf CRAN, das verwendet werden kann, um R mit VowpalWabbit zu verbinden. ist jedoch nur unter Linux verfügbar.

Auch um die Dinge zu beschleunigen, verwende ich fread Funktion von data.table Paket. Transformationen von data.table sind auch schneller als in data.frame, aber man muss eine andere Syntax lernen.

+0

Vielen Dank. Ich kenne sowohl "data.table" als auch "RVowpalWabbit". Letzteres wird jedoch nicht helfen, da Sie noch eine Datei angeben müssen, aus der die Daten gelesen werden sollen. – user3856970

+0

Ja, ich habe das über 'RVowpalWabbit' nicht realisiert. Danke, dass du aufgeschrieben hast, was für dich funktioniert hat. Ich habe versucht, den Ansatz auch zu verwenden, jedoch wurde keine Datei "my_model.vw" erstellt. Irgendwelche Vorschläge? Ich verwende es unter Windows 7, wobei "vw.exe" sowohl im R- als auch im Befehlszeilen-Arbeitsverzeichnis gefunden wird. –

+0

Vielleicht versuchen Sie mit dem "Speichern" Trick in der gewählten Antwort erwähnt? Ich habe es aufgegeben, VW unter Windows zu benutzen, da es mir zu viele Kopfschmerzen bereitete. Wenn das auch scheitert, würde ich vorschlagen, dass Sie es unter Linux versuchen. – user3856970

5

Was Sie suchen können, läuft vw im Daemon-Modus.

Der üblicher Weg, dies zu tun ist vw als Daemon ausführen:

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

Sie 26542 durch den Hafen Ihrer Wahl ersetzen.

Jetzt können Sie eine TCP-Verbindung zum Server herstellen (die localhost sein kann, auf Port 26542) und jede Anfrage, die Sie auf den TCP-Socket schreiben, wird auf dem gleichen Socket geantwortet.

Sie können beide lernen (senden Sie beschriftete Beispiele, die das Modell in Echtzeit ändern) oder Abfragen schreiben und Antworten zurücklesen.

Sie können entweder eine Abfrage + Vorhersage gleichzeitig oder viele gleichzeitig durchführen. Alles, was Sie brauchen, ist ein Zeilenumbruchzeichen am Ende jeder Abfrage, genauso wie Sie es aus einer Datei testen würden. Die Bestellung wird garantiert erhalten bleiben.

Sie können auch Anfragen mit denen Anfragen eingehen, die nur für die Vorhersage gedacht sind und die das In-Memory-Modell nicht aktualisieren sollen, mischen. Der Trick, dies zu erreichen, besteht darin, ein Nullgewicht für Beispiele zu verwenden, von denen Sie nicht lernen möchten.

wird dieses Beispiel wird das Modell aktualisiert werden, da es ein Gewicht von 1:

label 1 'tag1| input_features... 

Und das man das Modell nicht aktualisiert werden, da es ein Gewicht von 0 hat:

label 0 'tag2| input_features... 

A etwas mehr in der offiziellen Referenz ist in der vowpal wabbit wiki: How to run vowpal wabbit as a daemon obwohl beachten Sie, dass in diesem Hauptbeispiel ein Modell vorgelernt und in den Speicher geladen wird.