Как собрать датасет за неделю: опыт студентов магистратуры «Наука о данных»
Привет, Хабр! Сегодня хотим представить вам некоммерческий открытый датасет, собранный командой студентов магистратуры «Наука о данных» НИТУ МИСиС и Zavtra.Online (подразделении SkillFactory по работе с вузами) в рамках первого учебного Дататона. Мероприятие проходило как один из форматов командной практики. Данная работа заняла первое место из 18 команд.
Датасет содержит полный список объектов торговли и услуг в Москве с транспортными, экономическими и географическими метаданными. Исходная гипотеза состоит в том, что близость объекта к транспортным узлам является одним из важнейших показателей и ключевым фактором экономического успеха. Мы попросили команду детально описать свой опыт сбора такого датасета, и вот что получилось.
TLTR: Ближе к концу статьи вы найдёте информативные графики, карты и ссылки.
Немного про сам Дататон
Программа магистратуры «Наука о данных» НИТУ МИСиС и Zavtra.Online рассчитана на два года — т.е четыре семестра и раз в семестр для студентов будет проводиться хакатон, делая обучение больше ориентированным на решение практических задач. Первый хакатон был посвящен сбору датасета, поэтому и назвали его соответственно — «Дататон».
Всего в Дататоне приняло участие 90 студентов. Перед ними поставили задачу — собрать датасет, который может использоваться в продукте, основанном на Data Science.
Идею для сбора датасета предлагали сами студенты, с оглядкой на потребности общества или бизнеса — так что актуальность стала одним из главных критериев оценки и выбора победителей.
Оценивать команды позвали менторов — практикующих специалистов по Data Science высокого уровня из таких компаний как: Align Technology, Intellivision, Wrike, Мерлин АИ, Лаборатория Касперского, Auriga, Huawei, SkillFactory.
Начало работы над датасетом
При выборе темы для нашего датасета мы руководствовались известным принципом «предвидеть — значит управлять». Поиск новых гипотез — не самая простая задача, особенно когда одними из критериев выступают практичность и ориентация на потребности гипотетического заказчика. Трудно найти неразмеченную область, используя только лишь открытые данные.
Основная работа по сбору и обработке была проделана за 5 дней, остальное время до публикации мы исправляли недостатки, незначительно обогащали датасет и оптимизировали его структуру.
Фундаментальной идеей нашего датасета является гипотеза, что окрестности перспективных транспортно-пересадочных узлов Москвы (далее — ТПУ) станут хорошими зонами для развития бизнеса. Что вообще представляет из себя концепция ТПУ?
Какие проблемы решает датасет?
Основная гипотеза тривиальна и лежит на поверхности. Больший интерес представляют уточняющие вопросы от потенциального предпринимателя, которые можно задать, основываясь на ней. Например:
Наш датасет может служить основой для аналитики и обучения линейных или логистических регрессий, задач классификации или кластеризации. Он подходит для наглядной визуальной демонстрации действующих объектов торговли и услуг в Москве с привязкой к крупным транспортным узлам города. Мы уверены, что он содержит множество «скрытых данных», которые ждут, когда их обнаружат.
1. Описание источников
1.1 Источники
В датасете были использованы следующие данные с сайта Портал открытых данных правительства города Москвы:
1.2 Структура датасета
Основу структуры данных составляют уникальные объекты торговли и услуг, каждому из которых соответствует набор метаданных, включающих в себя такие сведения, как:
Для сложных вложенных объектов мы использовали списки и словари, поскольку организованный доступ к такой структуре значительно проще, нежели парсинг строковых объектов. В целом датасет содержит большое разнообразие типов данных.
Это пример не только объединения, но и неточности отдельных полей, о чем будет следующий раздел
1.3 Качество данных и проблемы при их сборе
Качество исходных данных в целом оказалось удовлетворительным, но недостаточным для реализации всех наших амбиций. В ходе проверки мы обнаружили, что Москва значительно уступает по этому показателю ряду мировых столиц. Также мы заметили некоторые ошибки и неточности, которые пришлось обрабатывать как отдельные выбросы или оставлять на совести авторов источников.
Пример спорных данных
2. Обработка данных
2.1 Данные об объектах
После предварительной оценки имеющихся в распоряжении первичных данных (а это были данные об объектах торговли, услуг и ТПУ на территории Москвы) мы поняли, что ключевым элементом нашего датасета будут уникальные объекты торговли и услуг, которые мы объединили в единый центральный датасет. Всего мы получили более 78 000 записей, для которых помимо уникального ID и названия имеются сведения о:
2.2 Данные об административном делении
Эту информацию, в том числе географические и демографические параметры, мы обнаружили на Википедии в относительно актуальном состоянии на начало 2020 года. Мы автоматизировали процесс выгрузки сведений путём написания собственной функции для парсинга html-страниц. Незначительными трудностями, с которыми мы столкнулись, стали:
2.3 Данные о зонах охвата
Зоны охвата являются не объективной оценкой, а лишь одной из теоретических методик оценки эффективности того или иного объекта торговли. Мы обнаружили методику оценки, которая разделяет объекты на 4 группы. В нашем случае достаточно было ввести лишь 3 из них — маленькие, средние и большие. Разделение мы осуществляли путем анализа типов и названий объектов. Например, приставка «Гипер-» с большой долей вероятности соответствует большому объекту. Исходя из размера мы определили зону, в радиусе которой торговый объект является привлекательным для клиентов.
2.4 Данные о ТПУ
В имеющемся датасете под ТПУ подразумевается любой транспортный объект, которых на территории Москвы более 250. Поэтому нам пришлось объединять их в комплексы, исходя из названий и расстояний между ними. Сведения об объектах включают в себя такие данные, как:
Каждый полученный комплекс центрирован относительно всех включенных объектов, при этом мы сохранили все данные об исходных ТПУ — они хранятся внутри в виде словарей, где ключами выступают оригинальные ID ТПУ.
2.5 Данные о стоимости аренды и покупки коммерческой недвижимости
Этот раздел стал одним из самых сложных, поскольку всё, что связано с недвижимостью, сильно монетизировано и является ценной информацией. В открытом виде актуальные сведения по каждому району получить очень трудно. Риэлторские агентства и торговые площадки не предоставляют бесплатные API, а парсинг торговых площадок был слишком ресурсозатратным в условиях ограничений срока проекта.
Поэтому мы не стали изобретать велосипед, а просто нашли наиболее удобный ресурс и вручную сохранили статистические сведения о стоимости продажи и аренды коммерческой недвижимости для торговых объектов, отдельно стоящих зданий и объектов общего назначения за 2020 год.
Несмотря на значительное количество пропусков и отдельные неточности, эти данные отражают ситуацию на рынке недвижимости и строятся на реальных объявлениях.
2.6 Данные о пассажиропотоке на станциях метро
Эта секция тоже оказалась достаточно проблемной, поскольку изначально идея найти такие сведения в актуальном виде показалась нереальной, а официальные ответы оказалось ждать очень долго (и не факт, что они были бы положительными). Долгое время эта задача оставалось нерешённой, и нам пришлось повторно рассматривать буквально каждую крупицу информации, даже явно устаревшей.
Иронично, что обнаруженная ошибка в старом источнике позволила обнаружить подходящие данные. После повторной проверки мы поняли, что в одном из источников использованы данные за 2019 год, при этом подпись содержит указание на 2016 год. Эта подпись и сбила нас при первой оценке. Актуальность подтвердилась наличием данных по построенным в 2019 году объектам метро.
Впрочем, сами данные тоже оказались не оптимизированы для парсинга. Мы столкнулись с дублями и артефактами типа «100000 тыс. тыс. чел в сутки», которые пришлось отыскивать и приводить к общему виду. Тем не менее, как уже упомянуто в разделе о качестве данных, отдельные показатели по станциям явно завышены и ошибочны. И эту проблему можно решить только уточнением из первоисточника.
2.7 Новые признаки и данные
Собрать числовые или строковые данные — мало. Эти данные важно уметь трактовать и выделять на их основе новые параметры или свойства. Поскольку наша гипотеза строилась на принадлежности объекта к ближайшему ТПУ, мы написали алгоритм поиска ближайших объектов и для каждого уникального объекта сопоставили:
Небольшой кусок датасета с бинарными признаками
2.8 Итоговый датасет
В результате объединения мы получили датасет размерностью 44 столбца и 78086 строк. В формате Pandas он занимает около 25,9+ MB. Если разбить столбцы на тематические сегменты, то в нём содержатся данные о:
2.9 Корреляционная матрица
Что можно сказать по полученной корреляционной матрице?
3. Немного визуализаций
3.1 Датасет на карте Москвы
Наконец-то мы дошли до самой интересной части любого датасета, своеобразный момент истины! Апогеем сбора является визуализация данных, где можно не только оценить качество данных, но и найти коллизии, ошибки и выбросы.
Для визуализации мы написали свою функцию, которая использует библиотеку Folium. Метод удобен тем, что достаточно гибко визуализирует практически любые выборки из общего датасета. Параметры функции позволяют гибко настраивать визуальные признаки объектов. Поскольку каждый объект в нашем случае — слой, мешающие группы объектов легко отключить и оставить лишь необходимые.
Для большей наглядности на карте реализованы слои в виде административного деления по районам. В нашем случае за стандартное отображение мы приняли плотность объектов на каждый район города.
Пример отображения районов по плотности размещения объектов
Транспортная схема Москвы: здесь отображаются только ТПУ
Пример отображения с объектами — в данной выборке всего 10000 объектов из более чем 78 000
Пример отображения объектов по выделенному адресу — описание сформировано в виде HTML-кода
3.2 (Не)много графиков
Графики — отличный инструмент для анализа. В качестве демонстрации мы подготовили ряд графиков, чтобы наглядно продемонстрировать статистику по наиболее интересным параметрам датасета.
Вот, например, 20 крупнейших торговых сетей Москвы:
А если посмотреть, какие типы объектов самые популярные?
По типам услуг всё не так интересно, зато понятно, сколько всего объектов каждого типа есть в городе.
Теперь чуть более интересные цифры — количество объектов при ТПУ.
Руки чешутся посмотреть на самый верхний ТПУ «Профсоюзная». Почему бы и да? На этом скриншоте размещаются больше 2000 объектов, для которых этот ТПУ ближайший.
Хорошо, как насчёт того, чтобы узнать, сколько из объектов в городе являются сетевыми? Получается красивый пирог с почти идеальной четвертью. Занятно. Пусть 1 и 0 вас не пугают, это как раз и есть пример бинарного признака, где 1 означает, что объект входит в какую-либо крупную сеть.
Раз уж мы решили строить топы, почему бы не узнать адрес, по которому располагается большее число объектов? Легко!
Найти его не так уж сложно. Список впечатляет:
И напоследок — немного более сложной экономической статистики. Что если поделить все ТПУ на группы от проектируемых до уже сданных в эксплуатацию? Какое стандартное отклонение (сигма), в рублях, за аренду торговых площадей или, скажем, при приобретении отдельно стоящих зданий будет в этих группах?
Судя по графикам, разброс цен на аренду и покупку недвижимости около уже построенных ТПУ заметно больше, рынок недвижимости стабильнее в районах со строящимися или проектируемыми ТПУ. Это можно использовать для оценки эффективности инвестиций в недвижимость.
Представленные графики — лишь малая часть потенциала датасета, который может быть расширен в дальнейшем.
4. Заключение
4.1 Варианты применения
Наш датасет включает в себя большое количество демографических, географических, экономических и описательных данных, которые расширяют представление об имеющихся объектах торговли и услуг.
Спектр применения этих данных очень широк. Они могут быть сегментированы или объединены в новые признаки, на основе которых можно строить модели машинного обучения. Наиболее очевидные варианты применения:
4.2 Целевая аудитория
Датасет может быть интересен:
4.3 Достоинства и недостатки
Недостатки нашего датасета обусловлены объективными причинами — многие информационные источники содержат неточные или неполные сведения, что невозможно нивелировать постобработкой. Часть сведений вообще невозможно найти в открытом доступе. Однако мы создали все условия, чтобы на практике данные можно было легко обновить или добавить новые.
При использовании датасета стоит учитывать наиболее проблемные участки, которые могут создать заметные шумы. Особое внимание стоит обратить на следующие нюансы:
4.4 Вместо резюме
Надеемся, что наши наработки не останутся без внимания и их будут использовать для обучения моделей и поиска инсайтов как в учебных целях, так и для решения проблем реального бизнеса.
Узнать больше про магистратуру можно на сайте data.misis.ru и в Telegram канале.
Участники команды Data SkyScrapers
Артем Филиппенко — Тимлид / Программирование / Автор статьи
Юлия Компаниец — Программирование / Алгоритмизация / Визуализация
Егор Петров — Программирование / Парсинг / Поддержка репозитория
Вячеслав Кандыбин — Парсинг / Поиск источников
Ильдар Габитов — Координация / Анализ
Сергей Гильдт — Помощь в составлении статьи
Мы хотели бы выразить благодарность кураторам, преподавателям и экспертам за организацию Дататона. Это был отличный опыт и возможность самостоятельно проявить себя в решении практических задач, а также получить развернутую оценку от профессиональных Дата-сайентистов.
Создаем свой датасет с пришельцами
Сегментацией людей с помощью нейронных сетей уже никого не удивишь. Есть много приложений, таких как Sticky Ai, Teleport Live, Instagram, которые позволяют выполнять такую сложную задачу на мобильном телефоне в реалтайме.
Итак, предположим планета Земля столкнулась с внеземными цивилизациями. И от пришельцев из звездной системы Альфа Центавра поступает запрос на разработку нового продукта. Им очень понравилось приложение Sticky Ai, которое позволяет вырезать людей и делать стикеры, поэтому они хотят портировать приложение на свой межгалактический рынок.
К сожалению, наша нейронная сеть, которая используется в приложении для сегментации, обучена только на изображениях человеческой расы, поэтому на пришельцах работает плохо. Срочно возникает потребность расширить наш датасет пришельцами.
Попросив у пришельцев несколько тысяч их изображений, мы приступаем к разметке.
Задача:
Есть изображения пришельцев, для каждого изображения надо создать черно-белую маску, в которой белым будет выделен пришелец, а черным фон.
Решение:
Первым делом нужно составить ТЗ для фрилансеров, которые будут размечать изображения. Так как нам нужно очень высокое качество, то будем размечать изображения в фотошопе.
Если очень хорошее качество нам не нужно, либо выделяемый объект очень простой, то такую разметку можно производить с помощью ломаных линий (polygon vertices). Такой тип разметки доступен на Amazon Mechanical Turk и Яндекс.Толоке, где рабочая сила очень дешевая.
Можно составить ТЗ в виде 10-ти страничного PDF документа, но:
Поэтому сейчас мы полностью отказались от ТЗ в виде PDF документа, а предоставляем задание в
виде обучающего видео. После такого нововведения:
Особое внимание надо уделить методу разметки в фотошопе. Фотошоп — очень гибкая программа, в которой производить разметку можно разными способами. Поэтому желательно заранее определить какое качество разметки вам нужно, изучить разные инструменты выделения, сравнить их между собой и выбрать тот, с помощью которого обработка изображения происходит быстрее всего.
Пример:
Есть два способа выделения:
Способ А занимает 5 мин на изображение.
Способ Б занимает 10 мин на изображение.
При способе А за час фрилансер размечает 12 изображений, поэтому цена за изображение будет 150 / 12 = 12.5 руб.
При способе Б за час фрилансер размечает 6 изображений, поэтому цена за изображение будет 150 / 6 = 25 руб.
Итак, мы нашли лучший способ выделения и записали видеоинструкцию, что дальше?
Осталось найти фрилансеров. Есть много бирж фрилансеров, таких как Fl.ru, Weblancer, Фриланс.ру.
Но в последнее время мы используем фриланс-биржу WORK-ZILLA, потому что:
Для того, чтобы создать задание:
Регистрируемся, пополняем баланс, нажимаем «Дать задание», выбираем «Дизайн»->»Обработка фото».
Заполняем заголовок и описание, определяем время на выполнение задания. Обработав несколько пришельцев, я заметил, что на одно изображение в среднем уходит 4 минуты. Т.е. за час выходит 15 изображений, поэтому устанавливаем цену за одно изображение 150 / 15 = 10 руб.
Сразу после публикации задания исполнители начинают предлагать свои услуги.
Выбираем самого красивого по аватарке опытного по отзывам и утверждаем в качестве исполнителя, выдаем изображения. Как видим, поиск фрилансера у нас занял менее 15 минут.
На следующее утро исполнитель прислал работу.
Как теперь ее проверить?
Конечно, можно каждое изображение открыть в фотошопе и посмотреть насколько хорошо все выделено, но что делать, если на тебя одновременно работает 20 человек, и каждый присылает по 40 изображений в день?
Автоматизировать! Для облегчения проверки мною был реализован на питоне такой скрипт:
Скрипт берет исходное изображение, маску, и делает из них коллаж, состоящий из оригинального изображения, вырезанного фона и вырезанного пришельца.









Просмотрев изображения, замечаем, что одно изображение исполнитель выделил не очень хорошо.
Просим подправить изображение.
После того, как фрилансер исправил все наши замечания, подтверждаем работу и расписываем благодарный отзыв фрилансеру.
Итог:
Предположим, что для обучения нейронной сети нужно будет 2000 изображений пришельцев.
Тогда, чтобы собрать такой датасет, надо будет потратить всего 2000 х 10 = 20000 руб, а если учесть, что в среднем один фрилансер обрабатывает по 40 изображений в день и одновременно над разметкой трудятся 10 человек, то создание датасета займет 2000 / (10 х 40) = 5 дней.
Как создать свой датасет с Киркоровым и Фейсом на Яндекс.Толоке
Нейронными сетями уже никого не удивишь. Практически каждый человек знает, что такое машинное обучение, линейная регрессия, random forest. Каждый год тысячи людей проходят курсы по машинному обучению на ODS и Coursera. Любой школьник за пару недель теперь может освоить keras и клепать нейроночки. Но в нейронных сетях, как и во всем машинном обучении, помимо создания хорошего алгоритма, необходимы данные, на которых алгоритм будет обучаться.
Разрешите представиться, меня зовут Куцев Роман. Я работаю в RnD команде в Prisma AI и занимаюсь созданием датасетов под наши задачи.
Итак, вдруг поступает продуктовый запрос: нам срочно нужна нейронка, которая будет отличать Киркорова от Фейсa (конечно, пример вымышленный, мы такой ерундой не занимаемся).
Спрашиваю у Антона (главный по нейронкам), в каком виде нужны данные, в ответ слышу: “Две папки, в одной изображения Фейсa, в другой Киркорова, желательно где-то по 500 изображений на класс, и чтобы 299х299 были”.
Очевидно, что никто раньше не занимался задачей классификации Киркорова и Фейса. Поэтому придется самим создать такой датасет.
Для скачивания воспользуемся Google Images Download.
(на самом деле все не так просто, за один запрос можно скачать только 100 изображений, поэтому приходится выкачивать с разными настройками)
Сразу ресайзнем изображения до размера 299х299, для этого я набросал такую функцию:
Посмотрев на изображения, видим, что в основном скачались нужные изображения, но местами присутствует мусор.
Отлично, первые два пункта готовы, остался третий.
Если вы до сих пор не знаете, что такое Яндекс Толока, то советую прочитать эту и эту статью.
В двух словах: Толока — фриланс биржа на стероидах, где заказчик создает задание, загружает данные и фрилансеры его выполняют. Конечно, есть и другие инструменты для разметки, но для данной задачи удобнее всего воспользоваться Толокой.
Как начать пользоваться Яндекс Толокой:
1. Регистрируемся на sandbox.toloka.yandex.ru и toloka.yandex.ru в качестве заказчика (sandbox — песочница, в которой вы создаете задания, проверяете на корректность со стороны фрилансеров, и, если все хорошо, переносите его в toloka.yandex.ru).
2. В личном кабинете toloka.yandex.ru пополняем свой баланс.
3. В sandbox.toloka.yandex.ru во вкладке «Проекты» выбираем «Создать проект».
4. Вам будут предложены готовые шаблоны. Из всех шаблонов нам лучше всего подходит шаблон «Категоризация изображений». Выбираем его.
5. Создаем инструкцию для фрилансеров и название проекта.
6. Во входных параметрах к заданию у нас будет URL на изображение. В выходных: строка output. Интерфейс задания пишется на html и javascript (это очень удобно, так как практически под любую задачу мы можем сверстать страничку, которая будет показываться исполнителям). Чуть-чуть изменяем шаблон html, и все готово. Сохраняем проект.
7. Проект готов. Теперь можно добавить пул заданий. В данной статье я не буду создавать пул обучения (надеясь на то, что фрилансеры способны сразу выполнить наше наисложнейшее задание). Но вы всегда создавайте в своем задании пул обучения. Это позволит:
Придумываем название пула (оно видно только нам). Задаем цену 0.01$ за страницу заданий. Жадный Яндекс берет комиссию 0.005$. Время на задание: 10 минут. Перекрытие: 3 (каждая наша фотография будет показываться трем разным людям). Включим «КОНТЕНТ ДЛЯ ВЗРОСЛЫХ», а то мало-ли что плохого мы из интернета могли скачать. И активируем «ОТЛОЖЕННАЯ ПРИЕМКА», чтобы не дать денег тем фрилансерам, которые будут плохо выполнять задание.
Далее идет пункт: «ТРЕБОВАНИЯ К ПОЛЬЗОВАТЕЛЯМ», в котором мы можем предъявить требования к исполнителям. В нашем случае исполнитель должен быть из России и владеть русским языком. Каждый исполнитель имеет свой рейтинг и мы можем выбрать исполнителей только с хорошим рейтингом. Выберем 80% лучших исполнителей.
Самым важным и самым сложным в плане освоения является блок контроля качества. Отдельное его описание потянет на целую статью, так что рекомендую ознакомиться с ним самостоятельно. В нашем проекте я выбрал ограничение на быстрые ответы. Если исполнитель 3 раза из 5 отвечает быстрее, чем за 40 секунд, то система его заблокирует.
Отлично, мы на финишной прямой, осталось чуть-чуть. Сохраняем пул.
8. В созданном пуле скачиваем пример загрузочного файла. Загружаем наши изображения на Яндекс Диск или к себе на сервер, чтобы они были доступны по ссылке. В поле «INPUT:image» вставляем URL на наши изображения. Пример:
Загружаем полученный tsv файл на Яндекс Толоку. Указываем сколько изображений будет показываться исполнителю за один раз.
Отлично, никаких ошибок не вылезло, значит мы все сделали правильно и можем запустить наш пул.
9. Теперь нам надо проверить, что со стороны исполнителя все отображается правильно. Для этого создаем новый аккаунт на sandbox.toloka.yandex.ru, только теперь в качестве исполнителя. В аккаунте заказчика выбираем вкладку «Пользователи» и добавляем наш новый аккаунт исполнителя в список доверенных пользователей.
Отлично, если наш пул запущен, то теперь из тестового аккаунта исполнителя доступно наше задание.
Нажимаем «Продолжить». Вот так будет выглядеть наша страничка для исполнителей:
Проверяем, что все работает правильно и никаких багов не возникает.
10. Если вы довольны результатом, то пора отпустить младенца в большой мир, т.е перенести наш проект из sandbox на основную Толоку. Для этого в аккаунте исполнителя во вкладке «Действия над проектом» выбираем «Экспортировать».
Заходим на toloka.yandex.ru и видим, что наш проект удачно экспортировался.
Открываем его, еще раз проверяем, что все верно. Как-то раз я допустил ошибку, неправильно сформировав задание и 2000 исполнителей, выполнив его, не смогли отправить результат (до сих пор неизвестно, сколько людей я убил).
11. Запускаем пул, ждем 20 мин и получаем результат:
Итого: у нас было 1159 фото. На одной страничке для фрилансера размещалось по 40 фото. Т.е. было 1159 / 40 = 29 наборов заданий. Но мы делали с перекрытием 3, значит всего было показано 29 x 3 = 87 страничек. За одну страничку мы платим 0.01$ + 0.005$. Следовательно, чтобы проверить 1159 фото, у нас ушло 1.3$ или 80 руб. При этом фрилансеры получили всего 0.87$ или 50 руб, приблизительно потратив 97 сек x 87 заданий = 2 часа 20 минут. А готовы ли вы работать за 25 руб в час?
12. Проверяем задания и скачиваем результат.
Открываем полученный файл в pandas, групируем по «INPUT:image»
Используя метод голосования, и считая, что на фото Киркоров, если хотя бы два исполнителя проголосовали за него, получили 634 + 57 = 691 фото.
Подводя итог, хочется сказать, что:
Из огромных минусов: нельзя на Толоке размечать персональные данные, так как с исполнителями не подписываются никакие NDA и это будет являеться нарушением 152-ФЗ и GDPR.
Если вам интересна тема по созданию датасетов, то ставьте плюсы и в следующей статье я расскажу, как создавать датасеты для приложения sticky-ai.



