Привет, меня зовут Роман Симановский, я Junior Data Scientist в команде Геоаналитики Альфа-Банка. Сегодня поделюсь опытом того, как мы работаем с пространственными данными, преобразовывая их в гео-признаки. С их помощью мы улучшаем модели машинного обучения, добавляя в них информацию об окружающем мире. На самом деле, это не так уж сложно, поэтому статья будет короткой.
Для начала соберём пространственные данные
Мы берём данные из множества источников, расскажу о двух основных.
№1. OpenStreetMap (OSM)
Отличный открытый источник геоданных, поддерживаемый пользователями со всего мира. Мы активно используем OSM при построении своих моделей. Например, мы можем получить информацию про супермаркеты (и поставить в каком-нибудь банкомат), аптеки или сервисы авторемонта и их координаты.
А ещё интереснее то, что из OSM можно извлечь информацию о дорогах, например, расстояние до остановок общественного транспорта, станций метро или главной дороги. Важно отметить, что OSM позволяет нам не просто вычислять расстояние между двумя точками на карте, но и учитывать реальные маршруты при вычислении.
№2. Транзакции
Мы собираем информацию о том, сколько было совершенно транзакций в определённой области (об этом позже). Не только общее количество транзакций, но и суммы по различным категориям и доли от общего числа транзакций, например, для таких категорий как «Фастфуд» или «Аптеки.
Просто собирать данные о транзакциях не так интересно — важно учитывать их привязку к локации. Например, если у нас есть 10 транзакций в категории «Фастфуд» от одного клиента, это не означает, что он питается только фастфудом. Мы поймем это, когда узнаем, что 9 из 10 покупок — это утренние булочки и кофе в кофейне, а только одна — в бывшем Маке.
Вот чтобы это знать, нам нужны пространственные данные — данные об объектах, у которых есть указание на их место в пространстве. В нашем случае таким местоположением выступают координаты широты и долготы, что указывают на точное расположение объекта на земной поверхности.
На этом можно было бы закончить, если бы не тот факт, что работа с широтой и долготой не всегда удобна. Координаты указывают только конкретную точку, не учитывая окружение. Именно поэтому их сложно напрямую использовать в моделях.
В качестве анализа мы рассматриваем некоторую область на карте, о которой мы хотим сделать ряд выводов. В таких случаях отличным решением становится библиотека h3, которая позволяет разбивать карту на области и упрощает анализ пространственных данных.
Подключаем h3
В первую очередь стоит дать определение от компании Uber, которая и разработала этот инструмент.
«h3 — это система геопространственной индексации, использующая гексагональную сетку, которая может быть (приблизительно) разделена на всё более мелкие гексагональные сетки»
Проще говоря, это библиотека, которая разбивает мир на шестиугольники.
Эта библиотека предоставляет следующий функционал:
Удобный API для индексации координат в шестиугольной сетке с точностью до квадратного метра.
Быстрое объединение и агрегация индексированных данных с разной степенью точности.
Набор алгоритмов и оптимизаций на основе сетки, включая «ближайших соседей», «кратчайший путь», сглаживание градиента и другие.
Также библиотека преобразует географические координаты (широта и долгота) в идентификаторы h3, а уже их можно использовать в моделях.
Создаём географические признаки
Для создания признаков возьмём карту из первого примера и отобразим гексагональную сетку. При этом стоит отметить, что каждый гексагон имеет идентификатор. Для клетки, выделенной красным, он будет 89283082e73ffff, а для зелёной — 8944d551077ffff.
Теперь мы для каждой категории объектов отдельно подсчитаем количество объектов этой категории в каждом гексагоне и получим три слоя: с аптеками, с авторемонтными сервисами и с продуктовыми магазинами.
Все гео-признаки мы храним по слоям, где каждой клетке гексагональной сетки соответствует только один тип информации, например, количество продуктовых магазинов, количество транзакций, о которых говорилось выше (да, «областью» был гексагон), или расстояние до главной дороги.
Храним в Geo Feature Store
Чтобы упростить использование гео-признаков, мы решили создать Geo Feature Store. В статьях Альфа-банка уже упоминалось, что в компании есть инструмент, который позволяет оптимизировать процесс сбора данных и подготовки фичей — Feature Store.
Возьмем определение из статьи.
«Feature Store — это управляемое специализированное хранилище, предназначенное для безопасного хранения, обновления, публикации и совместного использования ML-признаков (фичей)».
Также упоминалось, что все эти признаки содержат информацию о клиенте или компании. С момента выпуска статьи добавилось большое количество дополнительных признаков, но суть осталось прежней — там всё ещё информация, собранная для клиентов и компаний, а у нас есть пространственные признаки, которые мы хотим сделать полезными не только для гео-моделей.
Мы создали в Feature Store процесс, который каждый месяц рассчитывает гео-слои. А также связали гексагоны с клиентами и компаниями.
Как связать клиента и пространственные признаки?
Для каждого клиента подбираем гексагон, который будет ему соответствовать. В банке есть информация про адрес клиента, который указывается в заявке. Но эти данные не всегда подходят, именно поэтому с помощью специальных правил на основе транзакций мы подбираем более подходящий гексагон.
Используем индекс Морана
Как понять, смогут ли гео-признаки улучшить разделяющую способность модели? И стоит ли на это рассчитывать, добавляя в модель различные слои?
Для этого существует несколько подходов.
Первый и самый очевидный способ — это проанализировать таргет.
Если ваш таргет — доход клиента, то жизненный опыт подсказывает, что он будет зависеть от района, в котором проживает человек.
Но что, если таргет — это склонность клиента к продукту? В этом случае всё сложнее.
Именно поэтому для анализа таргета мы используем индекс Морана, который помогает выявить пространственную корреляцию. Он даёт понять, стоит ли добавлять гео-слои для улучшения метрик модели.
Немного формальностей — определение индекса и пространственной корреляции:
Индекс Морана представляет собой статистический показатель, предназначенный для оценки общей структуры данных, используемый при определении пространственной автокорреляции.
Пространственная автокорреляция отражает степень пространственной зависимости, связи или корреляции между значением переменной пространственного объекта и значениями той же переменной у соседних объектов. Важно отметить, что пространственная корреляция не обязательно указывает на наличие причинно-следственной связи, она лишь подразумевает ассоциацию.
Для примера рассмотрим таргет «доход» и проведём расчёт индекса Морана для Москвы. Мы наблюдаем выделение центра: красный цвет указывает на районы с высоким доходом, окруженные аналогичными территориями. Индекс Морана составляет 0.74. И можно предположить, что в данной задаче гео-признаки помогут улучшить результат.
Итого
В рамках Feature Store мы реализовали возможность сбора для клиента геопространственных данных, тем самым позволяя под каждую задачу подобрать оптимальный набор. Так, например, у нас есть два слоя, количество супермаркетов и количество транзакций в гексагоне. На основе соотношения клиента и гексагона мы можем использовать эту информацию для него, обогащая текущие признаки информацией о внешней среде.
Мы активно развиваем и тестируем возможности Geo Feature Store в статусе пилотного проекта. На данный момент наша цель — успешно интегрировать гео-признаки в модели и оценить их практическую ценность для решения бизнес-задач банка. Мы вернёмся с результатами и выводами позже, чтобы поделиться опытом и рассказать о первых успехах.