Добавление дополнительных данных в каждую строку в H2OFrame

Я работаю с огромным H2OFrame (~ 150 ГБ, ~ 200 миллионов строк), которым мне нужно немного манипулировать. Чтобы быть более конкретным: я должен использовать столбец ip фрейма, чтобы найти названия местоположения/города для каждого IP-адреса и добавить эту информацию в каждую из строк фрейма.

Преобразование фрейма в простой объект Python и манипулирование им локально не вариант из-за огромного размера фрейма. Итак, я надеялся, что смогу использовать свой кластер H2O для создания нового H2OFrame city_names, используя столбец ip исходного фрейма, а затем объединить оба фрейма.

Мой вопрос похож на заданный вопрос здесь , и из ответа на этот вопрос я понял, что в H2O нет возможности выполнять сложные манипуляции с каждой из строк фрейма. Это действительно так? В конце концов, функция apply H2OFrame принимает только лямбду без пользовательских методов.

Один из вариантов, о котором я подумал, заключался в том, чтобы использовать Spark/Sparkling Water для такого рода манипуляций с данными, а затем преобразовать искровой фрейм в H2OFrame для выполнения операций машинного обучения. Однако, если возможно, я бы предпочел избежать этого и использовать только H2O, не в последнюю очередь из-за накладных расходов, которые создает такое преобразование.

Так что, я думаю, все сводится к следующему: есть ли способ сделать такого рода манипуляции, используя только H2O? И если нет, есть ли другой вариант сделать это без изменения архитектуры моего кластера (т.е. без необходимости превращать мой кластер H2O в кластер газированной воды?)


person ksbg    schedule 20.09.2017    source источник


Ответы (2)


Да, при использовании приложения с H2OFrame вы не можете передать функцию, вместо этого принимается только лямбда. Например, если вы попытаетесь передать функцию tryit, вы получите следующую ошибку, показывающую ограничение:

H2OValueError: Argument `fun` (= <function tryit at 0x108d66410>) does not satisfy the condition fun.__name__ == "<lambda>"

Как вы уже знаете, газированная вода — это еще один вариант, позволяющий сначала выполнить обработку всех данных в искре, а затем отправить данные в H2O для машинного обучения.

Если вы хотите придерживаться H2O как есть, то ваши варианты — просто пройтись по фрейму данных, чтобы обработать элементы по-своему. Следующий вариант может занять немного времени в зависимости от ваших данных, однако он не требует перемещения вашей среды.

  • Создайте новый кадр H2O, выбрав только столбец «ip» и добавив в него местоположение, город и другие пустые столбцы с помощью NA.
  • Прокрутите все значения ip и на основе «ip», найдите местоположение/город и добавьте местоположение, город и другие значения столбца в существующие столбцы.
  • Наконец, cbind новый h2oFrame с оригинальным H2OFrame
  • Проверьте столбцы «ip» и «ip0» на правильное слияние со 100% совпадением, а затем удалите один из повторяющихся столбцов «ip0».
  • Удалите другой лишний H2OFrame, чтобы сэкономить память
person AvkashChauhan    schedule 21.09.2017

Если ваш алгоритм ip --> city представляет собой таблицу поиска, вы можете создать ее как фрейм данных, а затем использовать h2o.merge. Например, это видео (начиная примерно с отметки 59 минут) показывает, как объединять данные о погоде. в данные авиакомпаний.

Я полагаю, что для IP-адресов вы, возможно, захотите сначала усечь первые две или три части.

Если у вас нет справочной таблицы, становится интересно, быстрее ли превратить сложный алгоритм в это справочное дерево и выполнить h2o.merge, или продолжать загружать большие объемы данных пакетами, запускать их локально в клиенте, загружать пакет ответов и выполнение h2o.cbind в конце.

Кстати, классным и модным подходом было бы выбрать 1 миллион ваших IP-адресов, найти правильный ответ на клиенте, чтобы создать набор обучающих данных, а затем использовать h2o для построения модели машинного обучения. Затем вы можете использовать h2o.predict() для создания нового столбца города в ваших реальных данных. (Тем не менее, сначала вы захотите хотя бы разбить IP-адрес на 4 столбца.) (Моя догадка, что глубокий случайный лес подойдет лучше всего... но я определенно немного поэкспериментирую.)

person Darren Cook    schedule 22.09.2017