Здесь я описываю создание и развертывание интерактивного предсказателя дорожно-транспортных происшествий с использованием scikit-learn Google Maps API, Dark Sky API, Flask и PythonAnywhere.

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

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

К счастью, несколько таких записей об авариях общедоступны! Например, правительство Великобритании опубликовало подробные записи о дорожно-транспортных происшествиях в стране, начиная с 2002 года. С помощью этого набора данных я и мои товарищи по команде создали и развернули модель машинного обучения, которая с высокой точностью предсказывает когда и где могут произойти аварии в Большом Лондоне.

В этой статье я проведу вас через процесс завершения этого проекта. Полный код можно найти в моем репозитории GitHub, а доступ к реальной модели можно найти на этом сайте.



Задача

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

  • Разрешите пользователям вводить пункт отправления и пункт назначения (оба должны находиться в большом Лондоне) и находить лучший маршрут, который соединяет их.
  • Позвольте пользователю выбрать дату / время, когда они планируют совершить поездку, и определить участки маршрута, которые особенно подвержены авариям в пределах этого временного окна.

Шаги, которые мы предприняли для достижения этой цели, показаны на диаграмме ниже. Я подробно остановлюсь на них в следующих разделах.

Сбор данных

Определив цель, мы приступили к поиску необходимых данных. В итоге мы выбрали два набора данных:

Kaggle

Основным набором данных, который мы использовали для этого проекта, был подробный отчет об авариях, опубликованный правительством Великобритании и размещенный на Kaggle. T его набор данных содержит подробную информацию о 1,6 миллиона дорожно-транспортных происшествий, произошедших в Великобритании в период с 2000 по 2014 год. Он состоит из 33 столбцов, в которых фиксируются такие детали, как место, время, серьезность происшествий, а также различные метеорологические данные. и фоны трафика. В этом проекте мы ограничились анализом дорожно-транспортных происшествий в Большом Лондоне в период с 2012 по 2014 год.

Темное небо

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

  • Предполагается, что погода постоянная в течение дня. Если вы когда-нибудь были в Лондоне, то знаете, почему это предположение является сомнительным - погода там меняется очень часто!
  • Он содержит только исторические записи погоды (очевидно!). Чтобы использовать weather_condition в качестве предсказателя будущих аварий, нам нужен способ получить прогноз погоды .

По этим причинам вместо этого мы решили использовать метеорологические данные, предоставленные американской компанией Dark Sky, специализирующейся на прогнозировании погоды. Dark Sky предоставляет как прошлые записи, так и прогноз погоды на будущее, обновляемые каждые полчаса, что идеально соответствует нашей цели.

Обработка данных

Кластеризация DBSCAN

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

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

Мы использовали алгоритм DBSCAN для выполнения этой кластеризации. DBSCAN был выбран из-за его скорости, способности находить кластеры произвольной формы и устойчивости к выбросам. Аварийные пятна, которые находятся за пределами кластеров, были расценены как выбросы и были исключены из нашего последующего анализа.

На этапе кластеризации DBSCAN было обнаружено 473 горячих точки аварий. Эти горячие точки были визуализированы ниже с помощью ArcGIS, программного обеспечения для географического анализа. Мы видим, что горячие точки сосредоточены на основных дорогах Лондона, таких как A11 и A13.

Отрицательная выборка

На тот момент у нас было несколько сотен очагов аварий. Я должен уточнить одну вещь - эти горячие точки не всегда подвержены авариям. Например, аварийные точки вдоль основных артерий Лондона могут быть опасными в часы пик, но относительно безопасными в более спокойное время. С другой стороны, горячие точки на крутом повороте могут быть довольно безобидными в яркий солнечный день, но могут стать смертельными в снежный или дождливый день.

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

Однако наших данных на тот момент было недостаточно для создания модели классификации! Для обучения классификатора требуются как положительные, так и отрицательные образцы, но у нас были только положительные (т. Е. Записи, is_accident целевая метка которых равна 1). Таким образом, нам нужен был способ генерировать отрицательные образцы (то есть записи о «неаварийных происшествиях»).

Создание отрицательных образцов с использованием положительных образцов было описано ранее. Мы использовали метод, описанный Юань и др. ¹ По сути, этот метод влечет за собой случайное создание трех отрицательных образцов для каждой положительной выборки в кластере. Например, если бы у нас был кластер, расположенный на Эбби-роуд, в котором произошло 15 несчастных случаев, мы бы случайным образом синтезировали 45 записей об отсутствии происшествий для этого самого места. За исключением их местоположения, случайным образом были выбраны другие прогностические характеристики этих отрицательных образцов, такие как дата и время неаварийных событий. Были приняты меры предосторожности, чтобы эти случайно синтезированные отрицательные образцы не совпадали случайно с реальными положительными образцами.

Разведка и наблюдение

Изучив наш очищенный набор данных, мы сделали несколько интересных наблюдений. Некоторые из наиболее интересных наблюдений подробно описаны ниже.

В какие месяцы чаще всего происходят дорожно-транспортные происшествия?

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

В какое время суток чаще всего происходят дорожно-транспортные происшествия?

На тепловой карте выше показано, сколько дорожно-транспортных происшествий произошло за каждый час в каждый день недели. Мы заметили, что неудивительно, что большинство несчастных случаев происходит в утренний час пик с 8 до 9 часов и вечерний час пик с 15 до 19 часов (фиолетовые блоки). Пятница особенно плохая.

Сколько автомобилей попадает в аварию?

На гистограмме выше показано распределение аварий в зависимости от количества задействованных транспортных средств. Это указывает на то, что в большинстве аварий участвует один или два автомобиля. Это интуитивно понятно; большинство аварий происходит в результате съезда с дороги и / или столкновения двух автомобилей.

В каких районах города чаще всего происходят дорожно-транспортные происшествия?

Гистограмма выше показывает, сколько аварий происходит в разных районах Лондона. Мы видим, что Вестминстер занимает первое место, а Кингстон-апон-Темза занимает последнее место с наименьшим количеством дорожно-транспортных происшествий. На приведенной ниже карте та же информация представлена ​​в другом виде: подверженные авариям районы выделены более темными оттенками пурпурного.

Контролируемое обучение

С вышеупомянутыми этапами предварительной обработки мы наконец-то были готовы перейти к этапу моделирования! Мы разделили наш набор данных в соотношении 70:30 на набор данных для обучения и тестирования.

Библиотека Python scikit-learn использовалась для обучения и оценки моделей. Мы попытались использовать общие модели классификации, такие как SVM, логистическая регрессия и случайный лес. Относительные характеристики моделей измерялись и сравнивались с использованием точности и площади кривой рабочих характеристик приемника (AUC-ROC). Результаты наших шагов моделирования приведены в таблице ниже.

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

Развертывание

Затем мы упаковали нашу модель scikit-learn в веб-приложение, используя Flask, веб-фреймворк Python. Внешний вид веб-сайта был построен на основе бесплатного шаблона, взятого с веб-сайта HTML5UP. Все коды html, javascript и CSS были интегрированы в приложение Flask.

Затем приложение было размещено в сети с помощью PythonAnywhere, службы веб-хостинга, ориентированной на Python. Вы можете посетить сайт kteo7.pythonanywhere.com. Вот скриншот сайта:

Теперь я хотел бы подробнее рассказать о работе приложения Flask.

Во внешнем интерфейсе есть поля, в которых пользователь может ввести исходную и конечную точки по своему выбору. Эти текстовые поля оснащены API Google Адресов с функцией автозаполнения. Также есть раскрывающееся меню, с помощью которого пользователь может выбрать дату / время (может быть прошлым, настоящим или в пределах 48 часов в будущем).

После того, как эти входные данные сделаны, в бэкэнд-фреймворк отправляется POSTrequest. Здесь эти входные данные действуют как аргументы функции call_google. Учитывая исходную и конечную точки, эта функция вызовет API Карт Google, который вернет лучший маршрут, соединяющий их. В частности, функция возвращает широту и долготу путевых точек маршрута, которые представляют собой равномерно распределенные точки вдоль маршрута.

Широта и долгота служат входными данными для другой функции, называемой calc_distance. Эта функция «рисует» воображаемые круги радиусом 50 метров от этих путевых точек и проверяет, есть ли какие-либо аварийные горячие точки, которые попадают в эти путевые точки.

Для каждого кластера, попадающего в круги, еще одна функция, call_darksky, делает запрос к Dark Sky API. Эта функция вернет прогноз погоды для места в указанное время.

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

На гифке ниже показана наша интерактивная модель в действии. Здесь я выбрал дату и время в будущем (18:00 в субботу, 12 октября), выбрал пункт отправления (Гайд-парк) и пункт назначения (Кингс-Кросс). Мы видим, что модель выбрала маршрут, который проходит через Глостер-Плейс и A501, и пометила оживленный перекресток между этими двумя дорогами как потенциальное место аварии.

Опять же, вы можете получить доступ к этой модели на kteo7.pythonanywhere.com. Я рекомендую вам поиграть с ним, пока он еще активен (он будет активен до начала 2020 года).

Надеюсь, вам понравилась эта статья! Если у вас есть какие-либо вопросы / комментарии по поводу статьи или вы хотите связаться со мной, не стесняйтесь отправить мне письмо по адресу meraldo.antonio AT gmail DOT com. Вы можете узнать обо мне больше, проверив мой профиль в LinkedIn, указанный ниже:



Этот проект был частью курса «Данные и визуальная аналитика», который я прошел в рамках моей магистерской программы по аналитике в Технологическом институте Джорджии. Особая благодарность моим товарищам по команде в этом проекте - Катання, Роджер, Сью Ли и Йок! Ребята, молодцы!