Следующий проект в моем путешествии по науке о данных в Udacity

Введение

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

Следующий проект был частью Data Scientist Nanodegree компании Udacity, а данные были предоставлены Рисунок восемь. Проект можно разделить на три разные части:

  1. Создание конвейера ETL, который берет два CSV-файла, объединяет и очищает их, а результат сохраняет в базе данных SQLite.
  2. Создание конвейера машинного обучения, который берет данные из базы данных, обрабатывает текст и выполняет классификацию с несколькими выходами. Сценарий использует NLTK, конвейер от scikit-learn и GridSearchCV.
  3. Использование обученной модели в веб-приложении Flask, где новое сообщение можно классифицировать по разным категориям.

Извлечение, преобразование и загрузка (ETL)

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

Предоставляемые данные состоят из двух CSV-файлов: данных сообщения и данных категории. С пандами read_csv мы просто считываем их в блокнот и проводим дальнейшее исследование.

# load messages/categories dataset
messages = pd.read_csv('../data/disaster_messages.csv')
categories = pd.read_csv('../data/disaster_categories.csv')

На данный момент можно сделать следующие наблюдения:

  • В двух фреймах данных нет отсутствующих данных.
  • Кадры данных могут быть объединены по атрибуту «id».
  • Категории в основном правильно сформированы, но нуждаются в дополнительной обработке, чтобы стать бинарными (0 или 1).

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

Поскольку категория «связанные» состоит из нескольких выходных данных (0, 1, 2), 2 необходимо преобразовать в 1, чтобы сделать ее двоичной (это один из способов справиться с этим, другой — игнорировать строки):

df['related'] = df['related'].replace(2,1)

Во-вторых, нам нужно соединить два фрейма данных по общему признаку «id»:

df = pd.concat([df, categories_df], axis=1)

Наконец, нам нужно удалить дубликаты из фрейма данных:

df = df.drop_duplicates()

Результирующий фрейм данных df теперь готов для следующего конвейера машинного обучения. Для этого мы храним его в базе данных SQLite.

engine = create_engine('sqlite:///DisasterResponse.db')
df.to_sql('disaster_respond', engine, if_exists='replace',index=False)

Конвейер машинного обучения

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

Чтобы получить подходящие данные для модели ML, мы выполняем следующие преобразования данных сообщения:

  • CountVectorizer (tokenize = tokenizer *)
  • ТфидфТрансформер()

* Следующая функция используется для преобразования введенного текста в токены нормализованных и лемматизированных символов.

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

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

Чтобы улучшить нашу классификацию, мы делаем настройку параметров с помощью GridSearchCV. Обучение модели теперь занимает гораздо больше времени, чем раньше. Чтобы получить дополнительную скорость, мы разделяем работу между всеми доступными процессорами с помощью «n_jobs=-1».

Для оценки модели мы используем classification_report для предсказанной переменной y_pred. Подробнее об отчете можно узнать здесь.

Последняя часть конвейера — сохранить модель в файле pickle:

with open(model_filepath, 'wb') as f:
    pickle.dump(model, f)

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

Вы можете найти соответствующий репозиторий GitHub здесь:

https://github.com/jonastheiler/disaster-respond-pipeline

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

Я доволен результатом и полнофункциональным веб-приложением. Хотя все работает, места для доработок еще достаточно:

  • Тестирование различных оценщиков для оптимизации классификации (в этом проекте использовался RandomForestClassifier()).
  • Установка расширенного списка параметров для GridSearchCV для оптимизации модели (проблемы с длительным временем выполнения)
  • Использование FeatureUnion для расширения конвейера другими преобразованиями для достижения лучших результатов. Например, в НЛП можно было бы использовать различные преобразования.
  • Кроме того, веб-приложение можно было развернуть в Heroku (или аналогичном провайдере) для быстрого доступа к результату.

Заключение

Модель имеет хорошую точность и хорошую точность. Оптимизация с помощью GridSearchCV является хорошим дополнением к классификатору и делает конвейер более стабильным. В общем, конвейеры имеют возможность постоянно повторять процесс шаг за шагом. Создание конвейера ETL/ML — отличная возможность попрактиковаться в базовых навыках Python и научиться правильно обрабатывать данные.

Кроме того, я хотел бы поблагодарить команду Udacity за огромную поддержку и мощную программу Nanodegree.