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

от автора

Вернулся с дататона DSW 2015, где мы заняли второе место и, пока ничего не забылось, хотел бы выписать какие-то впечатления.


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

Первая задача была про предсказание зарплат по описанию вакансий. На 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": "<p><strong>Обязанности:</strong> консультирование клиентов, работа с электронной почтой, обучение новых сотрудников, ведение отчета по проделанной работе.</p> <p> </p> <p><strong>Требования:</strong> уверенный пользователь ПК, скоростной интернет, целеустремленность, желание зарабатывать, терпеливость при работе с клиентами, ответственность, доброжелательность.</p> <p> </p> <p><strong>Условия</strong>: трудоустройство по Т.З.Р.Ф., своевременная зарплата, бонусы, премии, бесплатное обучение и сопровождение до результата, карьерный рост.</p> <p>Обращаться по эл. почте</p>",   "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», которые нужно было заполнить. Вообще данные очень интересные. Думаю, с их помощью можно много чего понять про рынок труда в России. Мы, для начала, посмотрели на какие-то базовые вещи. Данные нам дали свежие. За несколько дней до выгрузки есть скачок числа новых вакансий. Ребята объясняют это тем, что рекрутеры часто в начале недели перезаливают объявления, чтобы их увидело побольше людей:

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

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

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

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

В принципе, ребята из 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	координатор сервиса ... 

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

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

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

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

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

[     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 минут. Короче, третью задачу мы подслили.

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

ссылка на оригинал статьи http://habrahabr.ru/post/265721/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *