Есть ли способ отправить данные для обучения модели в Vowpal Wabbit, не записывая их на диск?
Вот что я пытаюсь сделать. У меня есть относительно большой набор данных в CSV (около 2 ГБ), который без проблем помещается в памяти. Я загружаю его в R в кадр данных, и у меня есть функция для преобразования данных в этом кадре в формат VW.
Теперь, чтобы обучить модель, мне нужно сначала записать преобразованные данные в файл, а затем передать этот файл в VW. И запись на диск занимает слишком много времени, особенно потому, что я хочу попробовать разные модели с различными преобразованиями функций, и, следовательно, мне приходится записывать данные на диск несколько раз.
Итак, предполагая, что я могу создать символьный вектор в R, в котором каждый элемент представляет собой строку данных в формате VW, как я могу передать это в VW, не записывая его на диск?
Я подумал об использовании режима демона и записи вектора символов в соединение с локальным хостом, но я не мог заставить VW поезд в режиме демона — я не уверен, что это даже возможно.
Я готов использовать c ++ (через пакет Rcpp), если это необходимо.
Заранее большое спасибо.
ОБНОВИТЬ:
Спасибо всем за вашу помощь. В случае, если кому-то интересно, я просто передал вывод в VW, как предложено в ответе, примерно так:
# 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)
Vowpal Wabbit поддерживает чтение данных из стандартного ввода (cat train.dat | vw), поэтому вы можете открыть канал непосредственно из R.
Режим демона поддерживает обучение. Если вам нужно пошаговое / непрерывное обучение, вы можете использовать трюк с фиктивным примером, тег которого начинается со строки «save». При желании вы также можете указать имя файла модели:
1 save_filename|
Еще один вариант — использовать VW в качестве библиотеки, см. пример.
Обратите внимание, что VW поддерживает разработку различных функций с использованием пространств имен функций.
То, что вы можете искать, работает 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...
Немного больше в официальной ссылке в wowbit vowpal:
Как запустить vowpal wabbit в качестве демона хотя обратите внимание, что в этом главном примере модель предварительно изучена и загружена в память.
Я также использую R для преобразования данных и вывода их в VowpalWabbit. Существует RVowpalWabbit
пакет на CRAN, который можно использовать для соединения R с VowpalWabbit. Тем не мение,
он доступен только в Linux.
Кроме того, чтобы ускорить процесс, я использую fread
функция data.table
пакет. Преобразования data.table
также быстрее, чем в data.frame
, но нужно изучить другой синтаксис.