Методология:

  1. Введение в проблему
  2. Данные
  3. EDA (исследовательский анализ данных)
  4. Подготовка данных
  5. Выбор функции
  6. Построение модели.
  7. Оценка модели
  8. Вывод

Введение

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

II. Данные

К счастью, нам не нужно искать или очищать собственные данные. Он предоставляется SPD (полицейским управлением Сиэтла) и регистрируется Traffic Records. Данные не имеют повторяющихся значений, состоят из 194673 коллизий и 37 (не считая индекса) атрибутов/столбцов с целевой/зависимой переменной/признаком «SEVERITYCODE» и 36 независимых переменных/признаков. План состоит в том, чтобы заполнить пропущенные значения или удалить столбцы с большим количеством пропущенных значений. После того, как данные будут должным образом подготовлены, мы закодируем категориальные признаки и нормализуем их вместе с числовыми признаками перед проверкой их соответствия целевой переменной «SEVERITYCODE». Последним шагом будет выбор нескольких соответствующих функций и передача их в модель. Но без внимательного изучения данных очень сложно точно сказать, что мы можем сделать, поэтому давайте начнем с изучения наших данных.

III. EDA (исследовательский анализ данных)

Разделив наши данные на части, мы заметили несколько вещей.

Хотя метаданные диктуют, что есть 5 возможных значений (0–3, 2b), которые может принимать наша целевая переменная, столбец состоит только из 2: 1 (136486) или 2 (58188). Это проблема классификации. Это означает, что каждая независимая переменная будет использоваться для классификации того, относятся ли они к «SEVERITYCODE» 1 или 2. Отлично, сразу же, EDA освещает нам цель, давайте посмотрим, что будет дальше.

Как гласит старая китайская поговорка: «Чтобы застрелить врага, сначала застрелите лошадь. Чтобы поймать бандитов, сначала захватите их короля». Итак, давайте посмотрим на целевую переменную, которую мы пытаемся предсказать.

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

Объекты с более чем 75 000 пропущенных значений и следующие объекты будут удалены.

  • Я исключил «SEVERITYDESC», «ST_COLDESC» и «SDOT_COLDESC», поскольку они являются просто описаниями «SEVERITYCODE», «ST_COLDCODE» и «SDOT_COLDCODE» соответственно.
  • Я исключил «INTKEY», потому что он имеет более 7000 уникальных значений.
  • поскольку кадр данных pd поставляется с уникальным идентификатором, нам не нужны уникальные ключи, такие как «OBJECTID», «COLDETKEY» и «INCKEY», которые поставляются с данными.
  • Я также удалил «некоторые избыточные значения, такие как SEVERITYCODE.1», «INCDATE» и «LOCATION».
  • В метаданных нет документации по «REPORTNO», поэтому я ее опускаю.
  • Более 90% слов «INTKEY», «CROSSWALKKEY» и «SEGLANEKEY» принимают однозначные значения 0 или меньше единицы, поэтому я отбрасываю оба варианта.

Теперь у нас есть отсутствующие значения (каламбур), давайте перейдем к подготовке данных.

IV. Подготовка данных

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

Здравый смысл подсказывает мне, что существует некоторая связь между местом аварии и тем, что это за авария.

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

Обе функции «JUNCTIONTYPE» и «COLLISIONTYPE» являются хорошими представителями функций с сильной связью с «SEVERITYCODE».

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

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

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

Если вы думаете, что я потратил на это свое время, вы не ошиблись, потому что я так и сделал. После большого объема работы эта функция, кажется, ни к чему не приводит. Но причина, по которой я указал на это, состоит в том, чтобы показать вам, что среди 36 функций 1/3 похожи на эту, поэтому нам не нужно проходить через другие, подобные этой.

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

После «горячего кодирования» всех номинальных категориальных признаков мы получили 88 столбцов.

V. Выбор функций

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

Есть несоответствие, график на этапе подготовки данных показал нам, что «ДАТА» не является хорошим индикатором для кода серьезности. Но одномерный метод отбора говорит нам, что это самая важная особенность. Мы проверим это и посмотрим, кто прав.

Еще один интересный результат. Хотя «DATE» была заменена на «Y» как самая важная функция, она по-прежнему занимает второе место. И хотя «Y» кажется умеренным индикатором кода серьезности, я бы не сказал, что это самая важная функция для прогнозирования кода серьезности. Два метода бросают вызов моему наблюдению, давайте посмотрим, что говорят модели.

Построение модели VI

Поскольку мы имеем дело с прогнозным моделированием классификации, я выбрал KNN, дерево решений, линейный SVM и логистическую регрессию. Поскольку процедурные шаги и результаты более или менее похожи, я покажу только результаты, полученные от KNN, потому что я также использую другой блок кода для поиска лучшего n (параметр в KNN).

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

VII. Оценка модели

Я использовал Jaccard, F1-score и LogLoss для оценки моделей, и результаты следующие.

Конечно, все модели показали лучшие результаты в данных перекрестной проверки, чем в тестовых данных, хотя и ненамного: они колеблются от 0,70–0,75 до 0,58–0,71. Дерево решений кажется здесь наиболее многообещающей моделью, поэтому я не удивлюсь, если настройка модели случайного леса может еще больше увеличить оценку.

VIII. Вывод

В начале этого путешествия мы глубоко погрузились в страну данных, предоставленных SPD (полицейское управление Сиэтла), и обнаружили, что плаваем среди океана функций. Одни кажутся многообещающими, другие не очень. Первоначально такие функции, как погода, X (долгота), Y (широта), UNDERINFL (под воздействием), «HITPARKEDCAR», «ROADCOND» и «LIGHTCOND», казались многообещающими, в то время как произвольные функции, такие как ST_COLCODE, SDOT_COLCODE, STATUS, казались несвязанными или имеет в лучшем случае слабые связи. Оказывается, моя первоначальная интуиция не была ни верна, ни ошибочна. В конце концов, я думаю, именно это делает хорошие результаты в области статистики: удивительными, но не диковинными.

Несмотря на то, что говорит мне метод выбора признаков «Важность признаков», я потратил много времени только на то, чтобы понять, что долгота и широта на самом деле не имеют большого значения. Первый молоток ударил меня по голове, когда я использовал библиотеку folium для отображения автомобильных аварий с помощью кластеров маркеров (метод, который объединяет огромное количество тегов в плотных областях в один круг). После того, как я заполнил все отсутствующие значения/значения NA и чуть не сломал свой ноутбук только для того, чтобы найти небольшую закономерность между местоположением и кодом серьезности, я упорствовал в выборе функций и даже в обучении моделей. Я получил многообещающие результаты от первоначальной интуиции с «расстоянием», показывающим, что такие функции, как «JUNCTIONTYPE» и «ROADCOND», имеют хорошие корреляции, но не такие, как хотелось бы.

Вернемся к чертежной доске и посмотрим, чего нам не хватает. Ага, «distplot» снова спас положение, сообщив нам, что «ST_COLCODE» и «SDOT_COLCODE» имеют огромную разницу в коде серьезности 1 и 2. Хотя я удалил их, потому что не знал, что с ними делать для большая половина моего проекта. Но это не имеет значения, потому что теперь мы осознаем свои ошибки, и как только мы добавим эту магию в нашу модель, мы получим уровень точности 99%, хлопаем шампанским, празднуем, верно? Нет, оба метода выбора функций (Univariate_feature и feature_Importance) показывают только «ST_COLCODE», а «SDOT_COLCODE» имеют среднюю корреляцию, а тепловая карта показывает их важность даже ниже средней. Моя настойчивость снова подверглась испытанию. Поэтому я вернулся к разработке функций и кодированию, надеясь, что на этот раз эти две функции поднимутся на вершину, как феникс. Этого не произошло, на самом деле он упал ниже, чем раньше, и практически не изменился на тепловой карте (лицо ладони). На данный момент, даже если точность модели увеличится на 10%, это того стоит. Я получил некоторые результаты смешивания; в то время как SDOT_SOLCODE давал изменчивые результаты, ST_COLCODE последовательно рекомендуется всеми тремя методами выбора функций, да, это не пустая трата времени.

Так что, если это не сверхочевидные особенности и не сверхъестественные особенности, тогда что? Оказывается, ответ всегда был передо мной (прямо как в кино). «ST_COLCODE», «PEDCOUNT», «ROADCON», «COLLISIONTYPE», «JUNCTIONTYPE» и некоторые другие оказались незаменимыми функциями для моделей обучения. Они не являются супер очевидными или тайными. Так что здравый смысл все-таки возобладал, в форме «PEDCOUNT»...и т.д. Но это мало помогло оправдать такие функции, как «ST_COLCODE» или «HITPARKEDCAR». Но постойте, разве не имеет смысла, что «COLLISIONTYPE» в слове «припаркованная машина» также означает больший материальный ущерб? Потому что это буквально сказало "припаркованная машина"? Или случаи с ST_COLCODE, в которых буквально прописан характер аварии (например, наезд на велосипедиста), сопровождаются высоким уровнем травматизма? Ну да, это так, просто звучит не слишком захватывающе. Однако здравый смысл победил, и я бы сказал, что он всегда должен побеждать. Иногда информация скрыта в такой форме, что нам нужны технологии для очистки кластеров шумов, чтобы наш здравый смысл мог видеть вещи более ясно. В этом проекте такой информацией является ST_COLCODE. Местоположение, погода и время мало что дали нам для определения кода серьезности. То, что на самом деле произошло в записи, такой как «ST_COLCODE» и «JUNCTIONTYPE», дало нам самую большую подсказку. Спасибо за чтение.