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

Классификация сообщений о бедствиях представляет собой серьезную проблему для распределения ресурсов:

  • Соответствующие сообщения должны быть отправлены разным организациям, которые позаботятся о различных частях одного и того же бедствия, таких как вода и медикаменты;
  • Быстро подключите нужный уровень помощи к людям, у которых есть более высокий приоритет.

Данные, представленные на Рисунке 8, содержат более 30000 реальных сообщений, отправленных организациям реагирования на стихийные бедствия во время крупных бедствий, включая землетрясение на Гаити в 2010 году, землетрясение в Чили в 2010 году, наводнение в Пакистане в 2010 году, ураган Сэнди в США в 2012 году, а также множество сообщений, охватывающих более 100 различных бедствий. Сообщения были собраны, объединены и переименованы таким образом, чтобы соответствовать разным бедствиям, что позволяет нам исследовать различные тенденции и строить контролируемые модели на основе машинного обучения.

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

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

Вы можете найти репозиторий проекта на моем GitHub.

Структура проекта

Мы делим этот проект на три части:

Обработка данных: я построю конвейер ETL (извлечение, преобразование и загрузка), который обрабатывает сообщения и данные категорий из файла CSV, и загружаю их в базу данных SQLite, которую затем наш конвейер ML будет считывать из файла в создать и сохранить модель контролируемого обучения с несколькими выходами.

Конвейер машинного обучения: я разделю данные на обучающий набор и тестовый набор. Затем создайте конвейер машинного обучения, который использует NLTK и GridSearchCV для вывода окончательной модели, которая прогнозирует классификации сообщений для 36 категорий (классификация с несколькими выходами).

Веб-разработка. На последнем этапе я покажу окончательные результаты в веб-приложении Flask, которое классифицирует сообщения в режиме реального времени.

Конвейер ETL

Данные, представленные на рисунке 8, разделены на два файла csv:

  • катастрофа_categories.csv: Категории сообщений
  • катастрофа_messages.csv: многоязычное сообщение реагирования на стихийное бедствие

Этапы конвейера:

  1. Объедините два набора данных, используя общий идентификатор
  2. Разделить категории на 36 отдельных столбцов категорий
  3. Перебирать столбцы категорий и преобразовывать значения категорий в двоичные
  4. Замените столбец категорий в df столбцами новых категорий.
  5. Удалить дубликаты
  6. Сохраните чистый набор данных в базе данных SQLite

В конце конвейера ETL мы получаем таблицу SQL, содержащую сообщения и закодированные по 36 категориям.

Конвейер машинного обучения - моделирование данных

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

Компоненты, которые я буду использовать в конвейере машинного обучения:

CountVectorizer: Преобразует коллекцию текстовых документов в матрицу счетчиков токенов [1]

TfidfTransformer Преобразует матрицу подсчета в нормализованное представление tf или tf-idf, которое должно отражать, насколько важно слово для документа в наборе текстов. Tf означает частоту термина, она вычисляется путем деления количества раз, когда термин встречается в документе, на общее количество терминов в документе. tf-idf означает частоту термина, умноженную на обратную частоту документа, и вычисляется путем деления логарифмического числа общего количества документов в корпусе на количество документов, в которых встречается термин. [2]

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

Шаги следующие:

  1. Загружает данные из базы данных SQLite
  2. Извлеките переменные X (сообщения) и y (категории) из данных для моделирования.
  3. Используйте nltk библиотеку для нормализации, лемматизации, токенизации текста и удаления игнорируемых слов, чтобы снизить нагрузку на модель.

4. Создайте модель машинного обучения, которая принимает столбец сообщения в качестве входных и выходных результатов классификации по другим 36 категориям в наборе данных.

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

Точность - это отношение правильно предсказанных положительных наблюдений к общему количеству предсказанных положительных наблюдений. Из всех сообщений, которые, по прогнозам, попадают в одну из 36 категорий, сколько на самом деле попало в нужную категорию? Высокая точность связана с низким уровнем ложных срабатываний.

Напомнить - это соотношение правильных положительных прогнозов из всех возможных положительных прогнозов, которое указывает на пропущенные положительные прогнозы.

Оценка F1 - это гармоническое среднее для точности и отзыва и является мерой точности модели, так что максимально возможное значение равно 1, что указывает на идеальную точность и отзывчивость, а также минимально возможное. значение равно 0.

Вы можете найти дополнительные сведения о метриках оценки классификации здесь.

6. Настройте модель: используйте GridSearchCV поиск, чтобы найти лучшие параметры. GridSearchCV - это инструмент, который позволяет вам определять сетку параметров или набор значений для проверки, автоматизируя процесс проверки всех возможных комбинаций значений. [4]

7. Протестируйте настроенную модель с classification_report

8. Оцените результаты.

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

Наконец мы:

8. Экспортируйте окончательную модель как файл рассола.

Развертывание веб-приложения Flask

Веб-приложение было разработано как пользовательский интерфейс. Когда пользователь вводит сообщение в приложение и нажимает кнопку «Классифицировать сообщение», приложение показывает, как сообщение классифицируется, выделяя категории зеленым цветом. По предложенному сообщению «нас на улице больше 50 человек. Пожалуйста, помогите нам найти палатку и еду », мы получим следующие категории:

Лицензирование и Благодарности

Спасибо Figure Eight за набор данных.

Используемые библиотеки, набор данных и подробное описание кода доступны на моем GitHub: https://github.com/OliviaCrrbb/Disaster-Response-Pipeline-Webapp