Оценка риска для пешеходов на уровне микрорайона на основе данных о реальных инцидентах.
Делиться

Мотивация
После ужина в центре Сан-Франциско я попрощался с друзьями и достал телефон, чтобы придумать, как добраться домой. Было около 23:30, и расчетное время в пути на Uber было необычно долгим. Я открыл Google Maps и посмотрел пешеходные маршруты. Маршруты были похожи по расстоянию, но я засомневался — не из-за того, сколько времени займет прогулка, а потому что не был уверен, как будут ощущаться разные участки маршрута в это время суток. Google Maps мог показать мне самый быстрый путь домой, но он не мог помочь ответить на мой главный вопрос: как отфильтровать маршрут, чтобы он проходил через более безопасные кварталы, а не был самым быстрым?

Определение формулировки проблемы
Имея начальное и конечное местоположение, день недели и время, как можно предсказать ожидаемый риск на данном пешеходном маршруте? Например, если я хочу пройти пешком от паромного терминала до Нижнего Ноб-Хилла, Google Maps покажет мне следующий маршрут(ы):

В общих чертах, задача, которую я хотел решить, заключалась в следующем: имея начальное и конечное местоположение, время суток и день недели, как можно оценить ожидаемый риск на пешеходном маршруте?
Например, если я хочу пройти пешком от Чайнатауна до пересечения улиц Маркет и Ван Несс, Google Maps предлагает несколько вариантов маршрута, каждый из которых занимает примерно 40 минут. Хотя сравнение расстояния и продолжительности полезно, оно не помогает ответить на более контекстный вопрос: какие участки этих маршрутов выглядят по-разному в зависимости от времени прогулки? Как один и тот же маршрут выглядит в 9 утра во вторник и в 11 вечера в субботу?
По мере того как прогулки становятся длиннее — или проходят через районы с совершенно иными историческими моделями активности — на эти вопросы становится сложнее ответить интуитивно. Хотя Сан-Франциско не является уникально опасным городом по сравнению с другими крупными городами, общественная безопасность по-прежнему остается важным фактором, особенно при прогулках по незнакомым районам или в непривычное время. Моя цель состояла в том, чтобы создать инструмент для местных жителей и туристов, который бы добавлял контекст к этим решениям — используя исторические данные и машинное обучение, чтобы показать, как риск меняется в пространстве и времени, не сводя город к упрощенным ярлыкам.
Получение данных + предварительная обработка
Получение исходного набора данных
Департаменты города и округа Сан-Франциско ежедневно публикуют отчеты о происшествиях, связанных с действиями полиции, через портал открытых данных Сан-Франциско. Набор данных охватывает период с 1 января 2018 года по настоящее время и включает структурированную информацию, такую как категория происшествия, подкатегория, описание, время и местоположение (широта и долгота).

Классификация зарегистрированных инцидентов
Одна из непосредственных проблем с этими данными заключается в том, что не все инциденты представляют одинаковый уровень или тип риска. Равномерное отношение ко всем сообщениям размыло бы значимые различия — например, сообщение о незначительном вандализме не должно иметь тот же вес, что и сообщение о насильственном инциденте. Чтобы решить эту проблему, я сначала извлек все уникальные комбинации категории инцидента, подкатегории и описания, в результате чего получил чуть более 800 различных троек инцидентов.
Вместо прямой оценки отдельных инцидентов, я использовал LLM для присвоения баллов тяжести каждому уникальному типу инцидента. Это позволило мне нормализовать семантические различия в данных, сохраняя при этом согласованность и интерпретируемость оценок. Каждый тип инцидента оценивался по трем отдельным параметрам, каждый по шкале от 0 до 10:
- Оценка вреда : потенциальный риск для безопасности людей и прохожих.
- Оценка имущества : потенциальный риск повреждения или утраты имущества.
- Показатель нарушения общественного порядка : степень, в которой инцидент нарушает нормальную общественную жизнь.
Эти три показателя впоследствии были объединены для формирования общего сигнала о серьезности каждого инцидента, который затем можно было агрегировать в пространственном и временном отношении. Такой подход позволил моделировать риск таким образом, чтобы он отражал как частоту, так и характер зарегистрированных инцидентов, а не полагался только на необработанные данные.
Геопространственное представление
Предоставление необработанных данных о широте и долготе не принесет большой пользы модели машинного обучения, поскольку мне необходимо группировать агрегированный контекст инцидентов на уровне квартала и района. Мне нужен был метод сопоставления квартала или района с фиксированным индексом, чтобы упростить разработку признаков и построить согласованное пространственное отображение. Перейдем к основополагающему инженерному блогу, опубликованному Uber — H3 .
В блоге H3 компании Uber описывается, как проецирование икосаэдра (20-гранного многогранника) на поверхность Земли и иерархическое разбиение его на шестиугольные фигуры (и 12 стратегически расположенных пятиугольников) может помочь создать мозаику на всей карте. Шестиугольники особенны тем, что являются одним из немногих правильных многоугольников, образующих правильные мозаики, и их центр находится на равном расстоянии от центров соседних многоугольников, что упрощает сглаживание градиентов.

Сайт https://clupasq.github.io/h3-viewer/ — это интересный эксперимент, позволяющий узнать, какой H3-индекс характерен для вашего местоположения!

Временное представление
Время так же важно, как и местоположение, при моделировании риска, связанного с ходьбой. Однако наивное кодирование часа и дня целыми числами приводит к разрывам — 23:59 и 00:00 численно сильно отличаются друг от друга, хотя в реальности разница составляет всего одну минуту.
Для решения этой проблемы я закодировал время суток и день недели с помощью синусоидальных и косинусоидальных преобразований, которые представляют циклические значения на единичной окружности. Это позволяет модели понять, что поздний вечер и раннее утро находятся в непосредственной близости друг от друга во времени, и что дни недели естественным образом перетекают из субботы в воскресенье.
Кроме того, я сгруппировал инциденты в трехчасовые временные интервалы . Более короткие интервалы были слишком разреженными, чтобы давать надежные сигналы, в то время как более длинные интервалы скрывали существенные различия (например, ранний вечер против поздней ночи). Трехчасовые интервалы обеспечили баланс между детализацией и стабильностью, что привело к появлению интуитивно понятных периодов, таких как раннее утро, день и поздний вечер.

Итоговое представление характеристик
После предварительной обработки каждая точка данных состояла из:
- Индекс H3, обозначающий местоположение.
- Циклически закодированные характеристики часа и дня
- Сводная информация о степени серьезности инцидентов, полученная на основе данных о произошедших событиях.
Затем модель была обучена прогнозировать ожидаемый риск для данной клетки H3 в заданное время суток и день недели. На практике это означает, что когда пользователь открывает приложение и указывает местоположение и время, система обладает достаточным контекстом, чтобы оценить, как меняется риск пеших прогулок в соседних кварталах.
Обучение модели с использованием XGBoost
Почему именно XGBoost?
Имея на руках геопространственные и временные характеристики, я понял, что мне нужна модель, способная улавливать нелинейные закономерности в наборе данных, обеспечивая при этом низкую задержку для выполнения вывода на нескольких сегментах маршрута. XGBoost идеально подходил по нескольким причинам:
- Модели на основе деревьев решений обладают естественной устойчивостью к моделированию гетерогенных данных — категориальные пространственные индексы, циклические временные характеристики и разреженные входные данные могут сосуществовать без значительного масштабирования или нормализации признаков.
- Влияние признаков лучше поддается интерпретации, чем в глубоких нейронных сетях, которые, как правило, вносят излишнюю непрозрачность в табличные данные.
- Гибкость в целях и регуляризация позволили моделировать риски таким образом, чтобы это соответствовало структуре проблемы.
Хотя я рассматривал альтернативы, такие как линейные модели, случайные леса и нейронные сети, они оказались неудовлетворительными из-за неспособности улавливать нюансы данных, высокой задержки во время вывода или чрезмерной сложности для табличных данных. XGBoost обеспечивает наилучший баланс между производительностью и практичностью.
Моделирование ожидаемого риска
Прежде чем двигаться дальше, важно уточнить, что моделирование ожидаемого риска не является задачей Гаусса. При моделировании частоты инцидентов в городе я заметил, что для каждой ячейки [H3, время]:
- В нескольких ячейках количество инцидентов равно 0 и/или общий риск равен 0.
- В нескольких клетках зафиксировано всего 1–2 инцидента.
- небольшое количество клеток имеет инциденты много инцидентов (> 1000)
- Экстремальные события случаются, но редко.
Это признаки того, что моя модель не симметрична и точки данных не будут группироваться вокруг фиксированного среднего значения. Эти свойства сразу же исключают распространенные предположения, такие как нормальное распределение ошибок.
Именно здесь на помощь приходит регрессия Твиди .
Что такое регрессия Твиди?

Проще говоря, регрессия Твиди гласит: «Ваше значение — это сумма случайных событий , где количество событий является случайным , а каждое событие имеет положительный случайный размер». Это идеально подходит для модели анализа преступных инцидентов.
Регрессия Твиди объединяет процессы распределения Пуассона и гамма-распределения для моделирования количества инцидентов и величины (оценки риска) каждого инцидента. В качестве примера:
- Пуассоновский процесс: сколько инцидентов произошло в интервале с 18:00 до 21:00 10 декабря 2025 года в индексе H3 89283082873ffff ?
- Гамма-распределение: насколько серьёзным было каждое событие, произошедшее в интервале с 18:00 до 21:00 10 декабря 2025 года в индексе H3 89283082873ffff ?
Почему это важно?
Конкретный пример из имеющихся данных иллюстрирует важность такой формулировки.
В Пресидио произошёл один редкий инцидент высокой степени тяжести, который получил оценку около 9/10. В отличие от этого, на квартале возле дома 300 по Хайд-стрит в районе Тендерлойн за всё время произошли тысячи инцидентов, но со средней степенью тяжести. Твиди объясняет это так:
Ожидаемый риск = E[количество инцидентов] × E[тяжесть] # Пресидио E[количество] ≈ ~0 E[тяжесть] = высокий → Ожидаемый риск ≈ все еще ~0 # Тендерлойн E[количество] = высокий E[тяжесть] = средний → Ожидаемый риск = высокий
Следовательно, если события высокого риска происходят чаще в Пресидио, система соответствующим образом скорректирует ожидаемый риск и повысит выходные баллы. Tweedie обрабатывает распределение целевого объекта с преобладанием нулей и правосторонней асимметрией, а входные характеристики, которые мы обсуждали ранее, лишь объясняют вариативность этого целевого объекта.
Формулирование результата
В результате получается модель, которая прогнозирует ожидаемый риск , а не условную степень тяжести или бинарные обозначения безопасности. Это различие имеет значение. Оно позволяет избежать чрезмерной реакции на редкие, но экстремальные события, одновременно отражая устойчивые закономерности, которые проявляются с течением времени.
Заключительные этапы + Развертывание
Чтобы воплотить модель в жизнь, я использовал API Google Maps для создания веб-сайта, который интегрирует карты, маршруты и пользовательский интерфейс для навигации, на который я могу накладывать цвета в зависимости от оценок риска. Я раскрасил сегменты, взяв процентное распределение в моих данных, то есть оценка ≤ P50 = зеленый (безопасно), оценка ≤ P75 = желтый (умеренно безопасно), оценка ≤ P90 = оранжевый (умеренно рискованно), иначе красный (рискованно). Я также добавил логику для перенаправления пользователя по более безопасному маршруту, если отклонение не превышает 15% от первоначальной продолжительности. Это можно доработать, но пока я оставил как есть, поскольку в случае с холмами Сан-Франциско отклонение на 15% может быть очень значительным.

Я также развернул бэкенд на Render и фронтенд на Vercel.
Применяем принципы StreetSense на практике!
А теперь вернемся к первому примеру, который мы рассматривали — пути из Чайнатауна в район Маркет-стрит и Ван-Несс-стрит, но теперь с нашей новой моделью и приложением, которые мы разработали!
Вот как выглядит прогулка в 9 утра во вторник и в 11 вечера в субботу:


На первом изображении участки Чайнатауна, отмеченные зеленым цветом, имеют меньшее количество инцидентов и тяжесть последствий по сравнению с участками, отмеченными красным, и данные это подтверждают. Интересно, что на втором изображении пользователь автоматически перенаправляется по более безопасному маршруту в 23:00 в субботу вечером. Именно такой контекстный подход к принятию решений я изначально и хотел использовать — и именно это послужило мотивацией для создания StreetSense.
Заключительные мысли и возможные улучшения
Хотя существующая система фиксирует пространственные и временные закономерности исторических событий, есть очевидные области для улучшения:
- включение сигналов в реальном времени
- использование дополнительных данных для проверки и обучения
(а) если инцидент был оценен как кража с риском 4/10, и мы можем узнать из базы данных Сан-Франциско, что был произведен арест, мы можем повысить оценку до 5/10. - Сделайте индекс H3 чувствительным к соседним ячейкам — Внешний Ричмонд ~ Центральный Ричмонд, чтобы модель могла определять близость, а контекстная информация частично передавалась.
- Расширьте набор пространственных характеристик за пределы идентификатора H3 (агрегирование соседей, расстояние до горячих точек, характеристики землепользования).
- Более глубокое изучение различных методов обработки данных об инцидентах и их оценки.
(а) проведите эксперимент с различными целевыми функциями XGBoost, такими как псевдо-функция потерь Хубера.
(b) Используйте методы оптимизации гиперпараметров и оцените различные комбинации значений.
(c) эксперимент с нейронными сетями - Расширение модели за пределы одного города сделало бы её более надёжной.
Как и любая модель, построенная на исторических данных, StreetSense отражает прошлые закономерности, а не предсказывает индивидуальные результаты, и её следует использовать как инструмент для понимания контекста, а не для получения полной уверенности. В конечном итоге, цель состоит не в том, чтобы навешивать ярлыки «безопасные» или «небезопасные» на какие-либо места, а в том, чтобы помочь людям принимать более обоснованные и учитывающие ситуацию решения при перемещении по городу.
Источник: towardsdatascience.com



























