Следующий проект в моем путешествии по науке о данных в Udacity
Введение
Представьте себе экологическую катастрофу, которая затрагивает часть мира, где проживает много людей. Некоторым из них действительно нужна помощь в виде лекарств, еды, техники и т. д. Чтобы привлечь внимание, они, скорее всего, рассылают экстренные сообщения в надежде, что сообщение будет прочитано и будут приняты правильные меры. Этот проект предоставляет механизм, который классифицирует эти сообщения о бедствиях по различным категориям, чтобы сделать процесс организации помощи тем, кто действительно в ней нуждается, максимально эффективным.
Следующий проект был частью Data Scientist Nanodegree компании Udacity, а данные были предоставлены Рисунок восемь. Проект можно разделить на три разные части:
- Создание конвейера ETL, который берет два CSV-файла, объединяет и очищает их, а результат сохраняет в базе данных SQLite.
- Создание конвейера машинного обучения, который берет данные из базы данных, обрабатывает текст и выполняет классификацию с несколькими выходами. Сценарий использует NLTK, конвейер от scikit-learn и GridSearchCV.
- Использование обученной модели в веб-приложении 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.