Прогноз осадков на 10 дней в Сингапуре с использованием методов машинного обучения.

Введение

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

В этой статье мы исследуем прогнозирование осадков за 10 дней в Сингапуре на основе ежедневного масштаба. Мы экспериментировали с несколькими базовыми моделями (например, lightGBM, одиночный LSTM) и пробовали различные методы оптимизации (например, Adam и AdamW), но мы рассмотрим только архитектуру модели с наилучшим результатом.

Цель этой статьи двояка:

  1. Продемонстрируйте модель Sequence-to-Sequence (Seq2seq) с использованием двунаправленной долговременной кратковременной памяти (Bi-LSTM) и механизма внимания Luong [1] для прогнозирования осадков в течение 10 дней.
  2. Объясните, как мы подошли к процессу настройки гиперпараметров такой сложной архитектуры модели, учитывая, что в большинстве исследований такая важная процедура не объясняется в деталях.

Полный репозиторий GitHub можно найти здесь. В этой статье мы рассмотрим только модель Seq2seq (с использованием Bi-LSTM + Luong), хотя другие эксперименты можно найти в папке hpc в репозитории GitHub.

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

Оглавление

Область исследования

Область нашего исследования будет сосредоточена вокруг Сингапура, недалеко от экватора. Степень сетки наших наборов данных перепрогноза и повторного анализа GEFSv12 составляет 0,25 ° на 0,25 °, что эквивалентно примерно 27,75 км. Пространственное среднее значение 4 красных точек на рисунке ниже используется для обучения модели (т. е. средние точки данных следующих координат: (1,5, 103,75), (1,25, 103,75), (1,5, 104,0), (1,25). , 104.0)).

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



Наземная правда и входные данные

Наземные достоверные данные (повторный анализ)

Из набора данных реанализа GEFSv12 мы выбрали переменную общего количества осадков (tp) в качестве единственной переменной для прогнозирования. В следующем коде показано, как мы очищали файл combined-reanalysis.nc и передискретизировали его для ежедневных данных (т. е. сумма данных 06, 12, 18, 00 эквивалентна выборке за полный день).

Сначала мы создаем таблицу pandas Multi-Index, которая содержит измерения широты и долготы, а также переменную tp и время выполнения. Поскольку мы пытаемся спрогнозировать время выполнения от 1 до 10 на основе времени выполнения повторного анализа дня 0, у нас будет только 1 единственное время выполнения для повторного анализа.

Затем мы приступаем к некоторой очистке данных (пропущено значение 2013-09-20), преобразуем временную переменную в согласованный формат и передискретизируем их в ежедневные. Мы объединяем 4 значения координат в одно значение.

После экспорта файла CSV наш окончательный набор данных повторного анализа выглядит так:

Исходные данные (прогноз)

Из набора данных перепрогноза GEFSv12 мы выбрали пять переменных, которые помогут в прогнозировании осадков. Они есть:

  1. t2m: 2-метровая температура (K)
  2. tp: общее количество осадков
  3. H: удельная влажность на высоте 2 метра
  4. C: общая облачность (%) в среднем
  5. E: доступная конвективная потенциальная энергия

Структура нашей модели будет следующей:

Как и в случае с набором данных повторного анализа, мы сначала создаем таблицу панд с несколькими индексами, которая содержит параметры широты и долготы, а также пять метеорологических переменных, упомянутых выше, и время выполнения 10 дней (с 1 по 10 день).

Затем мы добавляем 10 значений времени опережения для каждой переменной (в приведенном ниже коде показаны только данные о накидке) в таблицу при повторной выборке до ежедневной с учетом дубликатов и отсутствующих значений. Затем мы объединяем 4 значения координат в одно значение.

После экспорта файла CSV наш окончательный набор данных перепрогноза выглядит так:

Преобразование журнала и масштабирование минимум-максимум

Временные рамки набора обучающих данных будут с 01.01.2000 по 31.12.2016, а временные рамки набора данных для тестирования будут с 01.01.2017 по 31.12.2019. Поскольку мы используем перекрестную проверку временных рядов, нам не нужен конкретный набор данных проверки, поскольку проверка будет выполняться с использованием части самого набора обучающих данных. Это связано с тем, что наши общие выборки невелики, поскольку мы передискретизировали их в ежедневные выборки, а выполнение перекрестной проверки временных рядов на большем наборе обучающих данных поможет сохранить достаточно большие выборки для настройки гиперпараметров.

Чтобы учесть асимметричное распределение осадков, мы провели логарифмическое преобразование наборов данных, содержащих переменные осадков (т. е. tp), и нормализовали их по минимуму-максимуму.

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

Перекрестная проверка временных рядов

Перекрестная проверка временных рядов будет использоваться для процесса настройки гиперпараметров позже.

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

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

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

  1. Поезд на образцах 2000–2001 гг. для испытаний в 2002–2003 гг.
  2. Поезд на образцах 2004–2005 гг., которые будут испытаны в 2006–2007 гг.
  3. Поезд на образцах 2008–2009 гг., которые будут испытаны в 2010–2011 гг.
  4. Поезд на образцах 2012–2013 гг., которые будут испытаны в 2014–2015 гг.

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

Примечание. Функция get_xy предназначена для обеспечения того, чтобы ввод в модель соответствовал требованиям стандартной архитектуры LSTM с временным шагом 10 дней и функциями 5.

Архитектура модели

Прежде чем перейти к тому, как мы выполнили процесс настройки гиперпараметров, давайте рассмотрим используемую нами архитектуру модели — модель Seq2seq с использованием двунаправленного LSTM и механизма внимания Luong.

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

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

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

Резюме нашей модели и график модели показаны следующим образом:

Функция потерь и настройка гиперпараметров

Взвешенная потеря MSE

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

Код Python для реализации пользовательской функции потерь, как показано выше:

Настройка гиперпараметров

Теперь мы углубимся в то, как именно мы подходим к настройке гиперпараметров нашей модели Seq2seq.

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

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

Во-первых, мы можем определить класс mylstm, где мы инициализируем гиперпараметры. Затем мы используем self (как для статических гиперпараметров, так и для оптимизации гиперпараметров) для представления экземпляра этого класса. После этого мы добавляем полную архитектуру модели и определяем некоторые другие функции, которые может использовать GridSearchCV (т. е. подгонка, прогнозирование и оценка).

Любой будущий процесс настройки гиперпараметров сложных моделей может использовать приведенный ниже код:

Результаты GridSearchCV и лучший результат для тестирования

Затем мы установим полное пространство параметров для поиска, как показано в строке 2 ниже, и передадим их через ‘clf.fit’, как показано в строке 5.

Наилучший результат настройки, который оказывается «tanh», 128 нейронов, весовым коэффициентом 2 для MSE и оптимизатором Adam, затем снова проходит через модель для тестового набора данных. Мы использовали эпохи и размер партии 160 и 64 соответственно, что ровно в 8 раз больше, чем в процессе перекрестной проверки временных рядов. Это связано с тем, что выборки примерно в 8 раз больше в тестовом наборе данных по сравнению с одиночным разделением перекрестной проверки (обучение и набор тестов в одном разделении при перекрестной проверке временных рядов).

Результаты и обсуждение

Мы будем использовать «model.predict», чтобы получить прогнозируемое значение осадков для всех 10 заблаговременностей. После этого мы выполним inverse_transformation и обратное логарифмическое преобразование, чтобы получить исходный коэффициент переменной tp.

Мы построили показатель R2 для всех 10 периодов выполнения заказа:

Многоклассовая матрица путаницы

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

Базовые модели

Как упоминалось ранее, мы также экспериментировали с некоторыми другими базовыми моделями, такими как одиночная модель LSTM Seq2seq, LightGBM, LSTM без механизма внимания и так далее. Мы исключили результаты для моделей механизма отсутствия внимания, потому что механизм внимания значительно помог повысить точность прогнозирования.

Поэтому мы сравнили два оптимизатора: Adam и AdamW, одиночную модель LSTM Seq2seq с вниманием Luong и двунаправленную модель LSTM Seq2seq с вниманием Luong и, наконец, модель LightGBM.

Вот результаты MAE, RMSE и R2:

Единой наилучшей модели не существует, но двунаправленная-LSTM (оптимизатор Адама) с механизмом внимания Luong,модель, которую мы рассмотрели выше, по-видимому, лучше всего работает как в RMSE, так и в R2, а также во втором лучший по показателю MAE (проигрывает Bidirectional-LSTM (оптимизатор AdamW)). Возможно, более строгий поиск гиперпараметров для скорости обучения и снижения веса для оптимизатора AdamW может быть более полезным.

Я надеюсь, что эта статья даст вам некоторое представление о процессе климатического прогнозирования.

Рекомендации

[1] https://levelup.gitconnected.com/building-seq2seq-lstm-with-luong-attention-in-keras-for-time-series-forecasting-1ee00958decb