Мы все видели некоторые из недавних заголовков. Будь то недавние наводнения на Среднем Западе Америки или ураган Мария в Пуэрто-Рико, глобальное потепление ощущается в полной мере. Наша зависимость человечества от неустойчивых источников энергии ведет нас по этому опасному склону.

Что касается меня лично, то я был свидетелем ужасных лесных пожаров в Британской Колумбии этим прошедшим летом (установив рекорд в 13 000 квадратных километров разрушений). Независимо от события, эти бедствия имеют реальные последствия.

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

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

Введите набор данных реагирования на стихийные бедствия Рисунок восемь. Этот набор данных содержит около 26 000 сообщений, которые были отправлены во время стихийных бедствий и впоследствии были отнесены к одной из 36 категорий реагирования на стихийные бедствия. Итак, я решил создать веб-приложение, которое использует конвейеры данных, чтобы помочь быстро классифицировать сообщения для групп реагирования на стихийные бедствия.

Превращение сообщений в математику

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

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

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

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

Создание конвейера машинного обучения

Итак, мы начинаем с маркировки наших текстовых данных. Что это значит? Ну, это как-то не так звучит. Подумайте, как мы, люди, пытаемся распространять информацию. Мы часто предпочитаем, чтобы информация отображалась в виде коротких и информативных маркеров. Ну машины вроде одинаковые. Чтобы уменьшить шум и сохранить как можно больше полезной информации, мы удаляем знаки препинания, токенизируем (создаем массив слов для каждого сообщения), удаляем стоп-слова («the», «a», «an», «in» и т. д.) и лемматизируем каждое сообщение. сообщение («происходит» -> «происходит»).

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

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

# Setting up a linear pipeline to avoid data leakage and ease of model creation and prediction
pipeline = Pipeline([('cvect', CountVectorizer(tokenizer = tokenize)),
                     ('tfidf', TfidfTransformer()),
                     ('clf', RandomForestClassifier())
                     ])
# Splitting our data into testing and training
X_train, X_test, y_train, y_test = train_test_split(X, Y)
# Fitting our model to the training data
pipeline.fit(X_train, y_train)

Примечание. Обычно это вычислительно затратная задача, зависящая от размера вашего набора данных.

Чтобы закончить все это, я настроил параметры классификатора RandomForest, используя функцию GridSearchCV, которая использовала перекрестную проверку для оптимизации словаря параметров, которые я передал.

Реагирование на стихийные бедствия: модельная критика

Увы, я предварительно обработал и разработал модель с точностью около 93%. Немного поработав над внешним и внутренним интерфейсом (с помощью Flask, sqlalchemy и Plotly), я смог создать веб-приложение, которое могло бы получать сообщения и расшифровывать их с помощью современных аналитических инструментов, чтобы помочь службам экстренного реагирования.

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

Почему? Что ж, распределение данных по каждой категории классификации сильно различается. Большинство сообщений были классифицированы как «связанные» в данных выборки, а 13 категорий составляют менее 1% от общего объема данных, что затрудняет прогнозирование таких случаев.

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

Именно по этой причине Data Scientist по всему миру постоянно ищут лучшие наборы данных для обучения своих моделей.

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