Теперь место, где поставить новый банкомат, определяет система машинного обучения. Мы готовили её целый год: за 2-3 месяца сделали первое решение, а потом дорабатывали, оптимизировали и ждали новых данных по банкоматам, установленным уже с помощью системы. Под капотом я расскажу, как это происходило — и кто снимает много денег в безлюдных местах.
История вопроса и задача
Привет, Хабр! Меня зовут Елена Гоголева, я руководитель по аналитическим исследованиям и инновационным технологиям в ПСБ. Прошлой весной к нам обратились коллеги из департамента, занимающегося установкой банкоматов, с предложением помочь в решении проблемы data-driven выбора новых локаций.
Как они действовали раньше? Пристально смотрели на карту очередного города и выбирали на основе своего опыта точки, где можно поставить новые банкоматы ПСБ. После выбора точек предложение уходило на согласование. Часто получалось, что когда коллеги начинали звонить в выбранное место, то получали отказ («Нет места под аренду») или аренда оказывалась слишком дорогой. Сотрудники ПСБ проходили этот круг раз за разом и чувствовали, что время теряется, а издержки растут. В итоге обратились к дата-аналитикам банка Отдела внедрения проектов машинного обучения с пожеланием более оперативно и умно выбирать локации.
Мы с коллегами задумались, как автоматизировать поиск локации и откуда брать данные. Первое, что пришло на ум — это посмотреть на сервисы риелторов вроде Циана. Удобно, что в них содержалась информация о расположении и характеристиках возможного места (адрес, время работы, площадь и т. д.) и сразу давалась оценка стоимости аренды. Можно было организовать поиск нужных локаций по параметрам, как это раньше вручную делали коллеги из отдела по установке банкоматов.
Однако уже на этом этапе мы поняли, что даже для одного города локаций будет слишком много, и отдавать их все вместе коллегам на проработку будет неправильным. Скажем, если в городе есть 150 подходящих локаций, то казалось совершенно нерациональным, чтобы они начали все 150 адресов рассматривать, делать звонки арендодателям и договариваться об условиях.
Поэтому стала вырисовываться конкретная постановка задачи машинного обучения: не просто автоматизировать поиск подходящих мест под банкоматы, но и сразу ранжировать эти места по ожидаемым параметрам (в первую очередь — по обороту), чтобы брать в работу не все 150 адресов, а, скажем, топ-10 или топ-5 из них.
Также мы сразу предположили, что оформить результаты можно будет в виде «тепловой карты» (возможно, содержащей слои), чтобы ожидать и ускорения, и упрощения процесса выбора места под банкоматы, чтобы коллеги стали работать быстрее и меньше сил и времени тратить на подбор новых локаций.
Откуда берём данные
Тут сразу надо сказать, что клиенты, использующие банкоматы, делятся на несколько категорий:
зарплатный проект,
клиенты банка (вне локации юридического лица — клиента ПСБ),
клиенты других банков (просто прохожие).
С точки зрения рентабельности банкоматов наиболее важен последний тип клиентов, поскольку они платят серьезный процент за снятие наличных. К тому же выбирать локации для первых несравнимо проще, и коллеги успешно справлялись с этим и без нас. Им надо было просто посмотреть, где именно сосредоточены корпоративные клиенты банка, в то время как с выбором локаций для «просто прохожих» были проблемы.
Итак, мы начали с парсинга сервисов поиска коммерческой недвижимости, которые, с одной стороны, были очевидным и основным источником данных для будущей модели, поскольку содержали все ключевые параметры возможных локаций, но с другой стороны, были мало пригодными для поиска потока тех самых «прохожих», которые и должны будут дать банку выручку от установки банкоматов.
Поэтому второй путь получения исходных данных также предсказуемо должен был связываться с геоинформационными сервисами. Они должны поставлять такую информацию, как близость к жилой застройке, инфраструктуре, торговым и офисным центрам, банкоматам конкурентов, шиномонтажке и т. д. и т. п. Тогда, с одной стороны, у нас была бы обучающая выборка банкоматов ПСБ, наложенная на карту, а с другой — разнообразные характеристики места их установки. Тогда мы могли бы делать прогноз, что будет, если мы поставим новый банкомат в новую точку, для которой в геоинформационном сервисе имелся бы тот же набор данных, что и в обучающей выборке.
Мы решили не выдумывать сложных подходов в выборе геоинформационного сервиса и обратились к OpenStreetMap, открытому проекту, который содержит данные по городам: объекты городской среды, магазины, остановки общественного транспорта, автосервисы и т. д.
Третий блок данных, о котором мы подумали — это конкуренты. Мы подумали, что полезно будет знать и добавить в модель и отразить на картах информацию о том, где стоят банкоматы конкурентов, и каковы их основные характеристики. Сначала нам показалось, что найти такую информацию будет непросто, но потом мы нашли отличный ресурс в виде сайта Банки.ру, где как раз в удобном для нас формате была собрана интересующая нас информация по расположению установленных банкоматов.
Кроме этих трёх сервисов, которые представляют собой блок внешних данных — сайты о недвижимости, геоинформационные и банковские сервисы — у нас, конечно, были собственные данные из внутренних источников. В первую очередь, связанные с параметром, который нам предстояло прогнозировать — оборотом имеющихся банкоматов. Кроме того, имелись и другие сведения, например, по количеству юридических и физических лиц в городах и районах. В частности, мы имели подробные данные по клиентам ПСБ и структуре выручки существующих банкоматов: клиенты наших зарплатных проектов часто и много снимают наличные в банкоматах, которые близко расположены к месту их работы. Кстати, с этим наблюдением связан один из необычных результатов, с которым мы столкнулись, когда уже реализовали проект и стали смотреть на метрики качества прогноза. Но об этом чуть позже.
Признаки будущей модели
Итак, мы имели набор признаков для будущей модели (повторюсь: внешние данные мы парсили с трёх основных сайтов, а внутренние брали из собственных источников банка). При этом мы пробовали добавлять самые разные признаки установленных банкоматов, которые были нам доступны, например, способен ли он принимать валюту, предназначен ли данный банкомат только на приём или только на выдачу денег и т. д. В качестве результата модели, т. е. таргета или целевого признака, который мы должны прогнозировать, был выбран оборот банкомата.
На рисунке приведён пример исходных данных, которые включали, в частности, ID банкомата, новый или нет этот банкомат, его координаты, город, численность населения в нём, другие агрегированные данные.
Выборкой для обучения служила текущая сеть банкоматов в рассматриваемом городе, а тестовой выборкой были потенциальные локации новых банкоматов. По сути, мы решали задачу машинного обучения с учителем, ожидая на выходе получить ранжированный по ожидаемой выручке список потенциальных новых локаций.
Решение задачи
Сформулировав для себя задачу и выбрав источники информации, можно было переходить к её решению. Технически, оно было стандартным: сначала мы чистили данные, убирали выбросы, корректировали информацию по признакам, т. е. применения более тяжёлых и сложных методик не потребовалось. Мы написали код на Python, подбирая параметры и анализируя результаты, используя для проверки и последующей корректировки модели простую кросс-валидацию.
Нашей главной задачей было сокращение времени на анализ локаций, а базовой гипотезой то, что модель машинного обучения позволила бы спрогнозировать оборот у локаций, а затем их ранжировать, с тем, чтобы в итоге выбрать топ-10 или топ-20 мест для установки банкоматов. Мы договорились с коллегами, что ранжированный список мест мы отдадим им в виде отчёта.
За метрику качества мы выбрали среднюю абсолютную ошибку, а с моделью игрались именно в части выбора алгоритма: пробовали от обычной регрессии к более сложным алгоритмам. В итоге выбрали в качестве рабочего алгоритма случайный лес, т. к. он давал более стабильные результаты.
После того, как мы отладили модель, дальнейшая работа выглядела примерно так: коллеги из департамента давали нам список городов, где планировалась установка новых банкоматов, и ожидали от нас отчёта в виде географической карты с отмеченными точками потенциальных наиболее выгодных локаций. Обычно мы тратили около недели на анализ ситуации, адаптацию и запуск модели для нового города, и в итоге рисовали тепловые карты и отдавали их коллегам. Их дальнейшая работа, уже без какого-либо нашего участия, занимала, условно, несколько месяцев, которые уходили на согласование условий с арендодателями и, собственно, установку банкоматов.
Тепловая карта была нашим отдельным продуктом, предназначенным для визуализации имеющихся данных, чтобы коллеги видели районы концентрации юридических и физических лиц и тому подобную информацию в виде тепловых слоев на карте.
Только после того, как новые банкоматы были установлены и запущены, мы могли видеть, где именно их удалось разместить и, самое главное, получать данные об их работе, позволяющие оценить и скорректировать нашу модель. Как правило, реальная жизнь немного отличалась от наших первоначальных планов, потому что, позвонив, скажем, в 5 топовых (по нашему прогнозу) мест, с кем-то из арендодателей не получалось договориться, и коллеги вынуждены были спускаться по нашему списку ниже и ставить банкоматы в менее выгодных местах.
Короче говоря, проект растянулся на год, так как только после установки банкоматов в новые, рекомендованные нами локации, мы могли верифицировать модель и непредвзято оценить, насколько хорошо она работает. Если быть более точным, первая итерация проекта была весной прошлого года, когда к нам первый раз обратились коллеги, объяснили, чего они хотят, и мы согласовали детали проекта.
Первые результаты
Первые результаты мы получили весной этого (2022) года, когда у нас появились первые данные из новых банкоматов. В целом получилась радующая нас картина, когда фактические результаты хорошо ложились на наши прогнозы, причём в больших мегаполисах было всё совсем хорошо. Стоит, наверное, сказать и о неожиданностях в результатах, которые относились к малым городам. К нашему удивлению, в сравнении с мегаполисами они выглядели примерно так:
География | Рост средних оборотов |
Москва | 8% |
Санкт-Петербург | 45% |
Регионы | 12% |
В таблице приведены относительные значения, рассчитанные по формуле: рост средних оборотов = 1 - (ср. обороты (новый метод) / ср. обороты (старый метод)).
Напомню, что мы анализировали банкоматы как, проще говоря, «зарплатные» и «общедоступные», в зависимости от того, близко или далеко располагались адреса юридических лиц наших зарплатных проектов. «Зарплатные» банкоматы обычно располагаются в бизнес-центрах, где присутствуют наши корпоративные клиенты, или рядом с ними. Т. е. выглядит это так: компании выдают зарплату сотрудникам, а те потом спускаются вниз или проходят несколько минут по улице до банкомата и снимают свои деньги. В «общедоступные» могут прийти как клиенты нашего банка, так и клиенты других банков, причём выручку банк получает как раз со вторых, т. к. они платят комиссию за снятие наличных.
Повторюсь, что наш проект был заточен как раз на второй тип, т. е. на «общедоступные» банкоматы, прогнозировать локации для которых коллегам было наиболее трудно. Результаты, на которые мы смотрели в первую очередь, получив телеметрию с установленных по нашим рекомендациям банкоматов, относились как раз к «общедоступным» банкоматам. Понятно, что мы смотрели не только на оборот новых банкоматов, но и на прибыль, которые они генерировали, т. е. тот самый процент за снятие наличных, который платили клиенты других банков.
Так вот, если в больших городах результат мало отличался от прогноза, то кое-где в малых городах отличие было очень значительным.
Проще говоря, некоторые банкоматы, отмеченные коллегами в их результирующих данных по установленным банкоматам, которые они предоставили нам как «общедоступные», вели себя как «зарплатные»: в их обороте преобладали корпоративные клиенты ПСБ, в то время как мы ожидали больший процент «чужих» клиентов и большую прибыль. На «тепловой карте» выглядело это примерно так:
На это можно было бы закрыть глаза, если бы такая картина была единичной, а не систематической. Поэтому нам пришлось начать разбираться с причинами.
Поиск причины: некорректная работа
Когда мы начали сводить цифры, то поняли, что причина была в том, что в городах-миллионниках коллеги давали нам исходные данные, которые точно классифицировали, является ли установленный банкомат «зарплатным» или нет, а вот в случае малых городов, в регионах, они почему-то кое-где сильно ошибались. Согласно исходным сведениям, банкомат был классифицирован как «общедоступный», поскольку находится далеко от расположения клиентов-юридических лиц, но стоило присмотреться к такому банкомату на карте, становилось очевидным, что с одной стороны, находится он совсем не в таком уж людном месте, а с другой стороны, оборот у него был неожиданно очень высоким.
Мы стали копать дальше и выяснили, что оборот этот создавали именно зарплатные клиенты. Иными словами, данный банкомат, несмотря на удалённость от компаний-клиентов ПСБ, на самом деле был не «общедоступным», а самым что ни на есть «зарплатным», а ошибка в маркировке банкомата была найдена на этапе анализа результатов, а не создании ML-модели, и была связана с тем, что наша модель не классифицирует банкоматы, а прогнозирует оборот банкоматов (т. е. решает задачу не классификации, а регрессии).
Ну и в заключение подведу итог работы, которую мы проделали. Подбор локаций для банкоматов стал у коллег гораздо более быстрым, метрики качества улучшились. Куда мы планируем двигаться дальше? Во-первых, вводить полученные результаты в модель, чтобы дообучать её уже согласно данным по новым локациям. Во-вторых, пробовать добавлять дополнительные признаки. Например, по данным банковского приложения, установленного в смартфонах наших клиентов, которые на первом этапе мы не использовали.