Введение

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

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

Бизнес-проблема

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

ML формулировка

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

Ограничения бизнеса

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

Информация о наборе данных

Для обучения модели мы будем использовать данные из открытых источников, предоставленные Национальным институтом геофизики и вулканологии. Данные можно найти по этой ссылке. Эти данные содержат различные сегменты данных датчика вместе с их временем до извержения. Каждый сегмент содержит данные от 10 различных датчиков, расположенных в разных местах вокруг вулканов. Данные каждого датчика в каждом сегменте содержат 60 000 показаний, отмеченных для одного и того же датчика. Согласно источникам, каждый из сегментов содержит 10-минутные логи, записанные датчиками. Объединенные данные обучения и тестирования занимают около 29 ГБ+ в файловой системе.

Метрика производительности

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

Исследовательский анализ данных

В конкурсе kaggle для предсказания извержения вулкана вы найдете один zip-файл, который содержит все данные обучения и тестирования, а также файлы sample_subbmission.csv и train.csv. Здесь файл train.csv содержит два столбца: segment_id и time_to_eruption. В соответствии с каждым идентификатором segment_id, представленным в этом файле, в папке train/ присутствует один файл csv. Этот файл представляет собой сегмент. Как было сказано ранее, каждый сегмент представляет собой 10-минутные журналы/чтения с 10 различных датчиков, расположенных вокруг вулканов. Время до извержения, представленное в файле train.csv, является целевым значением, которое нам нужно предсказать с учетом сегмента, то есть файла csv с 10 столбцами и 60001 строкой.

Анализ целевого значения

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

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

Анализ выборки сегментов

Давайте проверим несколько выборочных сегментов, чтобы получить представление о том, с каким типом датчика и данными сигнала мы работаем. Мы будем использовать pyplot matplotlib, чтобы просмотреть все датчики в файле csv, т.е. перейти столбец за столбцом в кадре данных pandas.

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

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

Анализ отсутствующих значений

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

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

Также давайте проверим, есть ли какие-то определенные группы датчиков, которые часто отсутствуют.

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

Из графиков очень ясно, что некоторые датчики довольно часто отсутствуют. И, как мы подозревали ранее, отсутствуют группы датчиков, такие как датчик 2 и датчик 8. На данный момент все еще неясно, какой метод вменения даст лучшие результаты, мы можем проверить это, проводя некоторые эксперименты во время моделирования.

Разработка функций

Теперь наступает лучшая часть, художественная часть цикла. Данные, которые у нас есть, — это данные датчиков, т. е. заметки о показаниях датчиков во времени, данные временных рядов. Мы не можем предоставить полную серию или сегмент в качестве входных данных для модели. Если мы это сделаем, он будет очень многомерным, при таком подходе нам понадобится (60K * 10) размерный вектор для представления одной точки данных, что не будет эффективно использовать память, потребует очень дорогих вычислительных ресурсов и, конечно же, проклятие размерности. Но хорошие люди уже давно провели много исследований, чтобы охарактеризовать временные ряды. Таким образом, существует множество вариантов отображения временных рядов. Tsfresh — одна из очень полезных библиотек Python, которая может помочь с любым типом проблем с временными рядами, она очень эффективна и масштабируема. Но сначала мы начнем с основных функций, а затем, в зависимости от производительности модели по этим основным функциям, мы добавим дополнительные функции.

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

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

Быстрое преобразование Фурье считается одним из самых важных алгоритмов в истории математики. FFT является сердцем большинства современных систем обработки сигналов. Самое простое объяснение БПФ состоит в том, что он берет один комплексный сигнал и делит его на сумму синусоидальной и косинусоидальной волн. Да.. Звучит волшебно, верно.. Но по своей сути это очень простое и красивое сочетание математики, исчисления и физики. Подробнее читайте по этим ссылкам (ссылка1, ссылка2). Использование коэффициента быстрого преобразования Фурье в качестве характеристики модели действительно может помочь модели добиться очень хороших результатов.

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

Моделирование

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

Чтобы проверить предположение о том, что проблемы возникают из-за размерности, я использовал PCA для уменьшения размерности, а затем попробовал линейные модели, но существенного улучшения производительности модели по-прежнему не произошло. Отсюда следует логическая последовательность: если линейные модели не работают, выберите нелинейные модели, и, наиболее популярный выбор, проверьте ансамблевые модели, но перед использованием случайного леса или деревьев решений с градиентным усилением следует проверить, как работают деревья решений. на данные. Если дерево решений работает достаточно хорошо, то мы, безусловно, можем выбрать ансамблевые модели и ожидать от них хорошей производительности. Но если дерево решений полностью не работает с данными, очень мало шансов, что деревья решений случайного леса или повышения градиента будут работать хорошо. Это также помогает в настройке гиперпараметров, таких как max_depth, количество оценок и т. д.

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

Мы можем выполнить простой случайный поиск по гиперпараметрам лучшей модели gbdt.

Результаты

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

Развертывание

Я также развернул лучшую модель gbdt с колбой на героку. Такую же вы можете найти по этой ссылке. Это веб-приложение позволяет пользователям загружать CSV-файл, то есть сегменты на сервере. Приложение проверяет файл, файл должен соответствовать структуре сегмента. С прогнозированием времени до извержения приложение также предоставляет наиболее важные функции, учитываемые моделью для прогнозирования, а также важность и расчетное значение этой функции в предоставленном сегменте.

Выводы и тематическая работа

По сравнению с таблицей лидеров kaggle для этой задачи я смог получить очень хороший результат как в публичной, так и в частной таблице лидеров с самыми основными функциями. Ранее я говорил о tsfresh для разработки функций, но из-за ограничений моих вычислительных ресурсов я не мог использовать функции tsfresh. По моим оценкам, для обработки всех данных обучения с помощью tsfresh на очень мощном оборудовании потребуется более 3 дней. Я планирую сделать это с помощью Google Cloud или AWS. Я только начинаю заниматься глубоким обучением и думаю, что модели глубокого обучения со слоями lstm действительно могут значительно повысить производительность благодаря богатым функциям, созданным с помощью tsfresh.

использованная литература

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

  1. Использование машинного обучения для анализа и прогнозирования вулканической активности — https://scholarworks.utep.edu/cs_techrep/1053/
  2. ТСФРЕШ — https://tsfresh.readthedocs.io/en/latest/
  3. INGV — Прогноз извержения вулкана. ЭДА. Моделирование — https://www.kaggle.com/isaienkov/ingv-volcanic-eruption-prediction-eda-modeling

Особая благодарность курсу прикладного ИИ (https://www.appliedaicourse.com/) за замечательный курс и команде курса прикладного ИИ.

Спасибо за прочтение, вы можете найти меня на linkedin.

Вот ссылка на блокнот github и colab.