Как мы участвовали в хакатоне Data Science Week 2015

Вернулся с дататона DSW 2015, где мы заняли второе место и, пока ничего не забылось, хотел бы выписать какие-то впечатления.
85d98fbc6fe144328f87ec1c9f7cf092
Для нас подготовили три задачи. Все достаточно интересные и сложные. Чтобы получить нормальное качество для каждой из них, я думаю, нужно потратить не одну неделю. Нам предложили уложиться в сутки.

Первая задача была про предсказание зарплат по описанию вакансий. На HH часто вместо суммы, на которую может рассчитывать соискатель, пишут «з/п не указана». Предлагалось как-то исправить это обстоятельно и заполнить пробелы примерными значениями. Нам предоставили ~700 000 записей вида

{
  "code": null,
  "site": {
    "id": "hh",
    "name": "hh.ru"
  },
  "published_at": "2015-08-18T18:19:00+0300",
  "accept_handicapped": false,
  "key_skills": [],
  "employment": {
    "id": "full",
    "name": "Полная занятость"
  },
  "id": "4027565",
  "archived": false,
  "contacts": null,
  "response_url": null,
  "relations": [],
  "employer": {
    "logo_urls": null,
    "vacancies_url": "https://api.hh.ru/vacancies?employer_id=1942790",
    "name": "Сирота ЛБ",
    "url": "https://api.hh.ru/employers/1942790",
    "alternate_url": "http://hh.ru/employer/1942790",
    "id": "1942790"
  },
  "response_letter_required": false,
  "billing_type": {
    "id": "free",
    "name": "Бесплатная"
  },
  "hidden": false,
  "type": {
    "id": "open",
    "name": "Открытая"
  },
  "specializations": [
    {
      "id": "3.318",
      "profarea_name": "Маркетинг, реклама, PR",
      "profarea_id": "3",
      "name": "Управление маркетингом"
    },
    {
      "id": "3.98",
      "profarea_name": "Маркетинг, реклама, PR",
      "profarea_id": "3",
      "name": "Исследования рынка"
    },
    {
      "id": "3.230",
      "profarea_name": "Маркетинг, реклама, PR",
      "profarea_id": "3",
      "name": "Продвижение, Специальные мероприятия"
    },
    {
      "id": "3.90",
      "profarea_name": "Маркетинг, реклама, PR",
      "profarea_id": "3",
      "name": "Интернет-маркетинг"
    }
  ],
  "premium": false,
  "description": "

Обязанности: консультирование клиентов, работа с электронной почтой, обучение новых сотрудников, ведение отчета по проделанной работе.

Требования: уверенный пользователь ПК, скоростной интернет, целеустремленность, желание зарабатывать, терпеливость при работе с клиентами, ответственность, доброжелательность.

Условия: трудоустройство по Т.З.Р.Ф., своевременная зарплата, бонусы, премии, бесплатное обучение и сопровождение до результата, карьерный рост.

Обращаться по эл. почте

", "schedule": { "id": "fullDay", "name": "Полный день" }, "suitable_resumes_url": null, "test": null, "department": null, "allow_messages": true, "address": null, "salary": { "to": null, "from": 31000, "currency": "RUR" }, "name": "Менеджер он-лайн офиса", "created_at": "2015-08-18T18:19:00+0300", "area": { "url": "https://api.hh.ru/areas/1884", "id": "1884", "name": "Льгов" }, "experience": { "id": "between1And3", "name": "От 1 года до 3 лет" }, "negotiations_url": null, "branded_description": null }


И тестовый набор с пустыми полями «salary.to» и «salary.from», которые нужно было заполнить. Вообще данные очень интересные. Думаю, с их помощью можно много чего понять про рынок труда в России. Мы, для начала, посмотрели на какие-то базовые вещи. Данные нам дали свежие. За несколько дней до выгрузки есть скачок числа новых вакансий. Ребята объясняют это тем, что рекрутеры часто в начале недели перезаливают объявления, чтобы их увидело побольше людей:
10bb46f7ee0f46ca8fca3211bb50b372

На удивление часто требуются люди без опыта:
90fc9ed5d086426bbe78e45b5d7dd1dc

Обычно нужны люди на полный день:
f9e8ef790c7048fab5abc22752220426

Пока я с интересом изучал данные и периодически делился наблюдениями, Диман, не особо вникая с содержание, запихнул всё в Vowpal Wabbit и получил модель, которая сразу заняла первой место и пребывала там в гордом одиночестве почти до самого конца хакатона. В чём там заключалась суть я не понял, кому интересно можете посмотреть презентацию (правда там тоже информации немного). А для самый отчаянных читателей доступен ноутбук с исходниками.

Я поудивлялся тому как нынче молодёжь решает аналитические задачи и перешёл ко второму датасету. Там предлагалось сделать систему для поиска похожих запросов:
c5db27a6da834259b6370017b0220118

В принципе, ребята из HH эту систему уже сделали, и даже год назад написали об этом подробную статью, но данных, которые не подпадают под NDA не так много, поэтому пришлось конструировать велосипед. Впрочем, велосипед, у меня получился вполне зачётный. Данных нам отгрузили щедро. Было два файлика. В первом для каждого пользователя были указаны его запросы (~100 000 000 строк):

Специалист      755713242
Call-центр      293043490
повар универсал -1453491075
Бухгалтер       368599217
        83220527
Бухгалтер по расчету заработной платы   2002085826
        -1690082898
кладовщик       199265113
Водитель категории C    -571664634
starling        938815142
...


Во втором, для каждого запроса было указано по какому результату каждый пользователь кликал (~60 000 000 строк):

374962018       -1871849048     Перевозки
435199331       656053665       java
-479980995      2055924405      развитие территории
-312078053      1785295198      стажер
373352347       -1306352914     swatch group
-335100665      -786187311      обработка изображений
430556647       834763896       директор
430528038       1620277313      Бухгалтер
435232940       -1022351920     Программист 1с
433204418       -2121514172     координатор сервиса
...


Я, естественно, не мог не заметить сходство этой задачи с задачей про поиск похожих групп ВК, про которую недавно писал. За несколько часов был построен роскошный граф вида:
bf1eabae203548199cb41a81bb4263d3

Каждой вершине соответствовал запрос. Похожие запросы объединялись в кластеры. Вот, например, запросы про фармацевтов:
c3267037201340d090be655283f80fd6

Про таможенников:
4c3590a5f130442cafaf515fc7d96dcb

Метрика для этой задачи была интересной. В конце хакатона нужно было выйти на сцену и в реальном времени понаходить рекомендации для запросов, которые придумает жюри. В нашем случае это выглядело так:
52e40e6f29e6469ea95d76de68eecd1f.gif

С первой и второй задачами у нас всё получилось, достаточно неплохо, чего не скажешь о последней третьей задаче. Там нужно было сделать систему рекомендаций товаров для Озона. Данные выглядели примерно так:

[
    100000, 
    {
        "0": "данная книга содержит подробное описание широко распространенных моделей телевизоров выпускаемых фирмами goldstar supra shivaki ham собранных на шасси pc04 и pc91a приведено комплексное описание работы телевизоров по функциональной и принципиальнойсхемам методика поиска неисправностей и регулировка этих телевизоров схемы сопровождаются таблицами назначения элементов данные модели широко распространены на нашем рынке и часто вызывают интерес у людей занимающихся ремонтом телевизионной аппаратуры в ответ на их многочисленные обращения была написана данная книга книга предназначена для специалистов занимающихся обслуживанием и ремонтом телевизионной техники и подготовленных радиолюбителей", 
        "1": "телевизоры goldstar на шасси pc04 pc91a", 
        "2": "ю бобылев", 
        "6": "зарубежная электроника", 
        "32": "русский", 
        "18": "наука и техника", 
        "53": "5_88977_036_5"
    }
]
[
    1000001, 
    {
        "0": "регион все регионы br рейтинг mpaa not rated p", 
        "1": "skinny tiger and fatty dragon", 
        "7": "skinny tiger and fatty dragon"
    }
]
[
    1000003, 
    {
        "0": "регион 1 usa and canada br рейтинг mpaa r not for sale to persons under age 18 p", 
        "1": "skipped parts", 
        "7": "skipped parts"
    }
]
[
    1000005, 
    {
        "0": "регион 1 usa and canada br рейтинг mpaa not rated p", 
        "1": "sky wars", 
        "7": "sky wars"
    }
]
...


Подобных записей нам отгрузили ~10 000 000 штук, что дофига. Там была ещё куча всяких файликов, но я на них даже не смотрел. Нужно было для данного товара найти хорошие оригинальные рекомендации. Кроме того, что задача сама по себе, мягко говоря, не простая и данных очень много у нас возникла ещё одна проблема. Это Spark. Примерно 12 часов ушло на то, чтобы загрузить туда данные и запустить простейшие операции. Хакатон однозначно не лучше место для первого знакомства с подобными технологиями. В итоге за два часа до дедлайна мы приняли волевое решение забить на Spark и запилить хотя бы какое-то решение локально. Мой Макбучек, как всегда не подвёл, место на диске подходило к концу, но базовое решение у нас появилось. Мы делали очень примитивную вещь. Все слова из описания товара складывали в set. Потом шли по списку товаров и считали пересечение. Товары с большим пересечением попадали в рекомендации. В принципе, такой метод работал. Для


[
    28759795, 
    {
        "1": "bruder тягач mack с прицепом платформой с колесным экскаватором погрузчиком цвет красный желтый черный", 
        "5": "спецтехника", 
        "6": "bworld", 
        "9": "машинки танки самолеты", 
        "10": "bruder", 
        "11": "bruder spielwaren gmbh", 
        "45": "23 февраля", 
        "15": "тягач прицеп платформа экскаватор погрузчик", 
        "38": "для мальчиков", 
        "30": "сын"
    }
]


Мы рекомендовали

[
    30161483, 
    {
        "1": "bruder самосвал mercedes benz с колесным экскаватором цвет красный желтый", 
        "5": "спецтехника", 
        "6": "bworld", 
        "9": "машинки танки самолеты", 
        "10": "bruder", 
        "11": "bruder spielwaren gmbh", 
        "45": "23 февраля", 
        "15": "самосвал экскаватор", 
        "38": "для мальчиков", 
        "30": "сын"
    }
]
[
    28759817, 
    {
        "1": "bruder эвакуатор mercedes benz с внедорожником цвет красный желтый черный", 
        "5": "спецтехника", 
        "6": "bworld", 
        "9": "машинки танки самолеты", 
        "10": "bruder", 
        "11": "bruder spielwaren gmbh", 
        "45": "23 февраля", 
        "15": "эвакуатор внедорожник аксессуары", 
        "38": "для мальчиков", 
        "30": "сын"
    }
]
[
    28759801, 
    {
        "1": "bruder фургон scania цвет зеленый белый красный", 
        "5": "спецтехника", 
        "6": "bworld", 
        "9": "машинки танки самолеты", 
        "10": "bruder", 
        "11": "bruder spielwaren gmbh", 
        "45": "23 февраля", 
        "15": "машина погрузчик 2 паллета", 
        "38": "для мальчиков", 
        "30": "сын"
    }
]

Правда, чтобы сделать рекомендации для одного товара, нам нужна была примерно минута. А тестовых кейсов было ~60 000. И до дедлайна оставалось 15 минут. Короче, третью задачу мы подслили.

Первое место заняли чуваки, которые, более или менее решили все три задачи. Респект им. Но мы тоже молодцы.

© Habrahabr.ru