Я думаю, что многие компании B2B получают сегодня (независимо от отрасли) от клиентов, которые хотят начать с ними дела, очень распространенный вопрос: откуда я знаю, что это будет успешным?

В команде Mobility Intelligence в door2door мы пытаемся ответить на этот вопрос нашим потенциальным партнерам по Ridepooling. Мы делаем это путем анализа и визуализации ряда показателей (например, Покрытие общественного транспорта) и моделирования возможных сценариев Ridepooling на основе существующих данных о спросе для получения KPI, которые помогают клиентам проектировать свои услуги.

Но что, если у нас нет данных о спросе для данного региона? Что тогда?

Мы могли бы попробовать моделировать со случайным спросом (и мы это делаем), но на самом деле о чем это нам говорит? Нам нужно было что-то более прочное. Что-то лучше, чем случайное, чтобы придать нам больше уверенности в наших симуляциях.

Существующие данные о спросе

То, что мы определяем как «данные спроса», на самом деле является данными о движении. Куда люди хотят переехать и когда. Один из наших источников данных о спросе - это поисковые запросы из существующих сервисов Ridepooling. Ничего особенного. Каждый поиск состоит из:

  • location_from: откуда человек хочет уйти.
  • location_to: куда человек хочет пойти.
  • отметка времени: когда был произведен поиск.

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

  • cell_from: из какой ячейки началось путешествие.
  • cell_to: в какую ячейку попадает поездка.
  • time_id: 1-часовой интервал в неделю, когда произошла поездка.
  • вес: в среднем, сколько рейсов происходит из / в одни и те же ячейки в одном и том же 1-часовом интервале.

Что мы хотим предсказать

Идея состоит в том, чтобы предсказать, как люди хотят перемещаться по региону в целом. Но более конкретно, мы хотим спрогнозировать, как они перемещаются между ячейками Insights (и в какие часы / дни недели). Поэтому мы хотим сделать прогноз в совершенно новом регионе, где у нас еще нет данных поиска:

Для каждой комбинации cell_from, cell_to и time_id: сколько поездок в среднем произойдет (вес)?

Как мы сделаем эти прогнозы?

Процесс получения прогноза состоит из трех основных этапов:

  1. Определите, что имеет или в ячейке, что способствует принятию решения о поездке в нее или из нее («Возможности»). Сюда входит количество достопримечательностей, количество людей, проживающих в нем, и т. Д.
  2. Обучите алгоритм, который мы пишем, для преобразования этих функций в несколько поисковых запросов (вес) в определенный момент времени («Обучение»).
  3. Основываясь на двух предыдущих шагах, спрогнозируйте, как будут выглядеть поисковые запросы в новом регионе.

Функции

Что может иметь или быть в данной ячейке, чтобы способствовать принятию решения о поездке в нее или из нее? На данный момент мы свели это к определенным POI (достопримечательностям) и плотности населения. Набор функций, которые мы используем прямо сейчас:

  • Плотность населения: количество жителей на квадратный километр (без учета демографических данных, таких как возрастное распределение и т. д.).
  • Поддержание: количество ресторанов / баров и т. д., существующих в данной ячейке.
  • Жилые здания: количество зданий, помеченных как «жилые» в данной ячейке.
  • Магазины: количество магазинов в данной ячейке.
  • Офисы: количество офисов в данной ячейке.
  • Развлечения: количество развлекательных объектов (кинотеатров, театров и т. д.) в данной ячейке.

Все эти данные (кроме данных о населении) мы получаем из OpenStreetMap.

Мы учитываем эти особенности как для cell_to, так и для cell_from.

Обучение

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

  • Подготовка набора данных для обучения на основе результатов поиска по нашим операциям по организации поездок в Берлине.
  • Подача этого набора данных в модель, которая затем сопоставляет характеристики ячеек в Берлине с количеством поисковых запросов Ridepooling, которые у нас есть, и предлагает способ преобразования функций в поисковые запросы.

Подготовка набора (обучающих) данных

Мы добавляем две новые функции для каждого подключения:

  • Во-первых, это функция под названием target_value (= вес поисков по Ridepooling в этом соединении) на основе реальных данных, а также
  • time_category: указывает, в какой интервал времени выполнялись эти поисковые запросы.

Подождите. «Категория времени»?

Для целей этого прогноза мы подумали, что 1-часовой интервал может быть слишком детальным. Мы хотели, чтобы эта информация была помещена в более широкие корзины, и именно здесь появляется time_category. Мы разделили день на более крупные корзины (например, «утро», «день», «вечер» и «ночь»). Поэтому вместо этого мы также будем прогнозировать в этих больших ячейках и предположим, что внутри каждой time_category поездки распределяются равномерно между отдельными часами.

Масштабирование данных

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

  • В Берлине проживает 3,7 миллиона человек. Следовательно, если в ячейке A находится 3,7 миллиона человек, это означает, что 100% населения (= 1 по шкале от 0 до 1). Если у него половина, то это 0,5 по шкале от 0 до 1 и так далее.
  • В Дуйсбурге проживает 500 тыс. Человек. Следовательно, если в ячейке B находится 500 000 человек, это означает 100% населения (= 1 при продаже от 0 до 1).
  • При масштабировании ячейки A (Берлин) и B (Дуйсбург) равны. Они обе представляют собой очень высокую плотность (100% -ную плотность) людей в этом районе.

Это также относится к другим функциям, например, к магазинам. 20 магазинов в Берлине могут быть сопоставимы только с 5 в Дуйсбурге из-за того, как магазины распределены в регионе. Это дает нам возможность анализировать / прогнозировать на основе относительных характеристик, потому что каждый регион отличается.

Примечание. когда мы впервые прогнозируем значение для поиска, мы получаем значение от 0 до 1, а затем масштабируем это значение, умножая его на максимальное количество Поиски, которые мы могли бы провести в соединении, чтобы снова получить реальное / абсолютное значение.

Поиск подходящей модели

У каждого типа модели есть свой алгоритм (= способ преобразования характеристик в значения). Существует множество моделей, которые потенциально можно использовать для решения этого типа проблем: прогнозирование числового целевого значения на основе набора функций.

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

Мы также пробовали использовать Deep Learning с использованием Neural Network с разными конфигурациями, но это не дало результатов, которые нас устраивают.

Но как вообще измерять результаты?

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

  • Среднеквадратичная ошибка:
    Для каждого прогноза мы сравниваем predicted_searches с ridepooling_searches (фактические поисковые запросы). Мы вычисляем квадрат разницы (Квадратная ошибка) = (прогнозируемое - фактическое) ². Затем мы получаем среднее значение всех квадратных ошибок и квадратный корень из этого среднего значения, чтобы получить среднюю ошибку для всего набора данных. Если мы получаем, например, фактическое среднеквадратичное значение 0,2, это означает, что в среднем мы прогнозируем поисковые запросы, которые составляют +/- 0,2 от фактических поисков.
  • Распределение значений.
    Мы наносим фактические и прогнозируемые значения на диаграмму, где каждая точка на оси x представляет собой связь, а каждое значение на ось Y - количество поисков. Затем мы визуально сравниваем распределение значений между связями (прогнозируемое и фактическое).
  • Пространственное распределение:
    Мы наносим фактические и прогнозируемые значения в / из определенной ячейки на (тепловую) карту и визуально сравниваем распределения. Это помогает нам понять, правильно ли мы прогнозируем спрос в таких местах, как, например, городские центры или сельские районы.

Полученные результаты

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

После обучения выбранной модели мы проанализировали важность функций POI по количеству фактических поисков (поисковые запросы) в регионе обучения (Берлин):

Большой. Теперь мы успешно предсказали поисковые запросы. Мы можем использовать это везде и принимать с его помощью абсолютные решения, верно?

Эээ ..

Ограничения

Поскольку мы используем набор обучающих данных, мы ограничены его ограничениями. Поскольку наш набор данных для обучения - это команда Ridepooling в Берлине, наши ограничения:

  • Период работы. Мы не сможем предсказать поисковые запросы за пределами этого периода работы, потому что мы просто не знаем, как люди ведут себя в остальную часть дня.
  • Функции в рабочей области. Если разные комбинации функций дают разные результаты, мы не узнаем. Лучшее, что мы можем сделать, - это сравнить новый регион с районом операций Берлина и попытаться на основе этого сделать прогноз.
  • Сама услуга: цены, реклама и т. д. - все это влияет на то, сколько людей используют услугу для переезда. Если разные службы имеют разные модели, которые могут повлиять на то, кто их использует, мы не можем обнаружить эту разницу или принять ее во внимание.

Существующие исследования и исследования

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

Заключение

В параллельной вселенной это было бы намного проще: просто найдите кого-нибудь, кто может заглянуть в будущее, обучите его эффективному сбору данных и наймите его, чтобы он возвращался с точными прогнозами. На данный момент мы застряли на математике. Но, хотя у него есть свои ограничения, особенно с ограниченным набором данных, он, безусловно, дает нам довольно хорошее понимание (ха!) Одного из многих возможных вариантов будущего.