Прогнозирование временных рядов с помощью Vertex AI и BigQuery ML

1. Обзор

В этой лабораторной работе вы научитесь создавать модель прогнозирования временных рядов с помощью TensorFlow, а затем развернете эти модели с помощью Vertex AI .

Чему вы научитесь

Вы научитесь:

  • Преобразовать данные таким образом, чтобы их можно было использовать в модели машинного обучения.
  • Визуализируйте и анализируйте данные.
  • Используйте BigQuery ML для создания модели прогнозирования временных рядов.
  • Создайте модель прогнозирования временных рядов с помощью TensorFlow, используя архитектуры LSTM и CNN.

2. Введение в прогнозирование временных рядов

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

Данные временных рядов

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

85af6a1ff05c69f2.png

Компоненты

Временной ряд можно разложить на компоненты:

  • Тренд : движение вверх или вниз по достаточно предсказуемой траектории.
  • Сезонный : повторяется в течение определенного периода, например, дня, недели, месяца, сезона и т. д.
  • Случайные : остаточные флуктуации

Сезонность может иметь несколько уровней. Например, в колл-центре может наблюдаться закономерность в объеме звонков в определенные дни недели, а также в определенные месяцы. Остаточная величина может быть объяснена другими переменными, помимо времени.

6e8d45bbbbc388ec.png

Стационарность

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

Например, приведенный ниже график концентрации CO2 демонстрирует повторяющуюся годовую закономерность с тенденцией к росту. ( Источник )

ab82857e2e7d0b89.png

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

c936381ab1095528.png

Использование данных временных рядов для машинного обучения

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

d667a941dbd470f5.png

Теперь, когда мы рассмотрели некоторые основы, давайте начнем изучать данные и прогнозирование!

3. Настройте среду Notebook.

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

Шаг 1: Включите API.

Коннектор BigQuery использует API хранилища BigQuery. Найдите API хранилища BigQuery в консоли и включите его, если он в данный момент отключен.

9895a2fd3cdf8f8c.png

Шаг 2: Создайте блокнот Vertex AI Workbench.

Перейдите в раздел Vertex AI Workbench в вашей облачной консоли и нажмите «Новый блокнот» . Затем выберите последний тип блокнота TensorFlow Enterprise 2.x без графических процессоров :

4e7b73eabf2bc061.png

Используйте параметры по умолчанию, а затем нажмите «Создать ». После создания экземпляра выберите «Открыть JupyterLab» :

18c9f3c462aafaee.png

Затем создайте блокнот Python 3 в JupyterLab:

58523671a252b95a.png

Шаг 3: Загрузите материалы для лабораторной работы.

Создайте новое окно терминала в интерфейсе JupyterLab: Файл -> Создать -> Терминал.

Затем клонируйте исходный материал с помощью следующей команды:

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

4. Изучение и визуализация данных

В этом разделе вы узнаете:

  • Создайте запрос, который группирует данные во временной ряд.
  • Заполните пропущенные значения
  • Визуализация данных
  • Разложите временной ряд на трендовую и сезонную составляющие.

Шаг 1

В Vertex AI Workbench перейдите в папку training-data-analyst/courses/ai-for-time-series/notebooks и откройте 01-explore.ipynb .

Шаг 2

Очистите все ячейки в блокноте (Редактировать > Очистить все выходные данные), измените параметры региона, проекта и сегмента в одной из первых нескольких ячеек, а затем запускайте ячейки по одной.

Шаг 3

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

55839e7bc0427915.png

5. Создайте модель с использованием прогнозирования временных рядов в BigQuery.

В этом разделе вы узнаете:

  • Импортируйте входные данные временных рядов в таблицу BigQuery.
  • Создайте модель временного ряда, используя синтаксис BQML.
  • Узнайте, как оценивать параметры и точность вашей модели.
  • Сделайте прогноз, используя вашу модель.

Шаг 1

Мы собираемся создать таблицу BigQuery с исходными данными из CSV-файла, который мы только что рассмотрели. Давайте начнем с загрузки CSV-файла из среды Notebook.

В каталоге training-data-analyst/courses/ai-for-time-series/notebooks/data щелкните правой кнопкой мыши на cta_ridership.csv и загрузите его в свою локальную среду.

Шаг 2

Далее мы загрузим эти данные в таблицу BigQuery.

Перейдите в консоль и найдите BigQuery (с помощью поиска или этой ссылки ):

649e7ab1c44b75e8.png

Вы можете добавить таблицу в новый или существующий набор данных, который группирует связанные таблицы. Если вы еще не создали набор данных, щелкните по своему проекту в левом нижнем углу, а затем выберите «Создать набор данных» в правом нижнем углу.

281b97020cd52f29.png

Выберите имя по своему усмотрению, например, demo , примите значения по умолчанию и продолжите.

Выбрав этот набор данных, выберите «Создать таблицу» в правом нижнем углу, чтобы создать новую таблицу.

ad47810d44cfb289.png

Для выбора параметров создания таблицы выберите:

  • Создать таблицу из: Загрузка
  • Выберите файл: cta_ridership.csv
  • Название таблицы: cta_ridership
  • Схема: Установите флажок для автоматического определения схемы и входных параметров.

213e4177e9e79544.png

Шаг 3

Теперь пришло время создать нашу модель! BigQuery ML предоставляет простой синтаксис, похожий на SQL, который позволяет создавать самые разнообразные типы моделей.

В редакторе запросов вставьте/введите следующий запрос, заменив при необходимости слово demo на имя вашего набора данных в обоих местах:

CREATE OR REPLACE MODEL
  `demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
    TIME_SERIES_TIMESTAMP_COL='service_date',
    TIME_SERIES_DATA_COL='total_rides',
    HOLIDAY_REGION='us') AS
SELECT
  service_date, total_rides
FROM
  `demo.cta_ridership`

Для лучшего понимания рассмотрим ключевые элементы синтаксиса:

CREATE OR REPLACE MODEL
demo.cta_ridership_model

Эта инструкция создает модель. Существуют варианты этой инструкции, например, CREATE MODEL , но здесь мы решили заменить существующую модель с тем же именем.

OPTIONS(MODEL_TYPE='ARIMA' ... )

Здесь мы определяем параметры модели, причем первый параметр — это тип модели. Выбор ARIMA создаст модель прогнозирования временных рядов.

TIME_SERIES_TIMESTAMP_COL='service_date'

Столбец с информацией о дате/времени.

TIME_SERIES_DATA_COL='total_rides'

Столбец данных

HOLIDAY_REGION='us'

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

AS SELECT ... FROM ...

В этом разделе выбираются входные данные, которые мы будем использовать для обучения модели.

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

Шаг 4

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

SELECT
  *
FROM
  ML.EVALUATE(MODEL `demo.cta_ridership_model`)

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

Вы сможете увидеть параметры p, d и q модели ARIMA , а также сезонность, обнаруженную в модели. В данном случае, лучшая модель включает как недельную, так и годовую сезонность.

5b5b1e129c70a340.png

Шаг 5

Теперь мы готовы к прогнозированию с помощью функции ML.FORECAST !

Вставьте/введите следующее (заменив слово "demo" при необходимости):

SELECT
  *
FROM
  ML.FORECAST(MODEL `demo.cta_ridership_model`,
    STRUCT(7 AS horizon))

Этот запрос просто делает прогноз на 7 дней вперед, используя нашу модель! Ниже мы видим семь возвращенных строк. Прогноз также включает доверительный интервал, по умолчанию равный 0,95, но который можно настроить в запросе.

b8a7f22657dc2d27.png

Отличная работа: мы создали модель временных рядов всего с помощью нескольких BQML-запросов.

6. Создайте собственную модель прогнозирования.

В этом разделе вы узнаете:

  • Удалите выбросы из данных.
  • Выполняйте многошаговое прогнозирование
  • Включение дополнительных функций в модель временных рядов
  • Узнайте об архитектурах нейронных сетей для прогнозирования временных рядов: LSTM и CNN.
  • Изучите статистические модели, включая экспоненциальное сглаживание Холта-Винтерса.
  • Ансамблевые модели

Шаг 1

В Vertex AI Workbench перейдите в папку training-data-analyst/courses/ai-for-time-series/notebooks и откройте файл 02-model.ipynb .

Шаг 2

Очистите все ячейки в блокноте (Редактировать > Очистить все выходные данные), измените параметры региона, проекта и сегмента в одной из первых нескольких ячеек, а затем запускайте ячейки по одной.

Шаг 3

В блокноте вы изучили несколько архитектур моделей: LSTM, CNN и статистические модели. Для каждой модели вы можете увидеть, как она работает на тестовых данных:

a528df58f4e6d372.png

7. Обучение и прогнозирование в облаке.

В этом разделе вы узнаете:

  • Подготовка данных и моделей для обучения в облаке.
  • Обучите свою модель и отслеживайте ход выполнения задачи с помощью AI Platform Training.
  • Прогнозирование с использованием модели на платформе AI Platform Predictions

Шаг 1

В Vertex AI Workbench перейдите в папку training-data-analyst/courses/ai-for-time-series/notebooks и откройте файл 03-cloud-training.ipynb .

Шаг 2

Очистите все ячейки в блокноте (Редактировать > Очистить все выходные данные), измените параметры региона, проекта и сегмента в одной из первых нескольких ячеек, а затем запускайте ячейки по одной.

Шаг 3

В предыдущем разделе мы обучили модель и выполнили с её помощью прогнозирование, всё это в блокноте Workbench. В этом разделе мы продемонстрировали, как использовать Python SDK для Vertex AI прямо из вашего блокнота, чтобы использовать сервисы Vertex AI для обучения и развертывания.

a3f6b5dc895a24fb.png

8. Вызов

В этом разделе вы попробуете применить изученные концепции к новому набору данных!

Мы не будем давать подробных инструкций, только несколько подсказок (если они вам понадобятся!).

Цель состоит в том, чтобы спрогнозировать количество обращений в службу 311 от города Нью-Йорка. К таким обращениям, не связанным с чрезвычайными ситуациями, относятся жалобы на шум, проблемы с уличным освещением и т. д.

Шаг 1

Начнём с понимания набора данных.

Сначала получите доступ к набору данных запросов в службу 311 города Нью-Йорка .

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

  • Каково количество запросов по номеру 311, связанных с фургонами с мороженым?
  • В какие дни поступает больше всего запросов в службу 311, связанных с вечеринками?

В пользовательском интерфейсе BigQuery выберите «Создать запрос», чтобы узнать, как получить доступ к набору данных. Обратите внимание, что оператор SELECT запрашивает данные из bigquery-public-data.new_york_311.311_service_requests .

Шаг 2

Мы готовы начать. В этом разделе внесите изменения в блокнот «Исследование и визуализация» , чтобы работать с этими данными.

Подсказки

  • Скопируйте блокнот 01-explore.ipynb и начните работать с ним.
  • Для анализа данных попробуйте выполнить следующий запрос:
from google.cloud import bigquery as bq

sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""

client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()

df.head()
  • Чтобы получить количество инцидентов по месяцам, используйте следующий запрос:
SELECT
  COUNT(unique_key) as y,
  DATE_TRUNC(DATE(created_date), month) as ds  
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
  • Обновите переменные столбцов в разделе констант. В приведенном выше запросе целевой столбец — y , а столбец с датами — ds . Дополнительных функций нет.
  • Рекомендуем изменить имя файла, в который вы экспортируете данные, для следующей лабораторной работы.
  • Экспортируйте данные, используя: df.to_csv(YOUR-EXPORT-FILENAME, index=False)

Шаг 3

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

Подсказки:

  • Скопируйте блокнот 02-model.ipynb и начните работать с него.
  • Обновите параметры набора данных:
  • Обновите параметры target_col и ts_col в соответствии с вашим новым набором данных.
  • Обновите параметры модели:
  • Периодичность – ежемесячно (код начала месяца – 'MS')
  • Шаги ввода: 12 (период ретроспективного анализа составляет 12 месяцев)
  • Шаги вывода: 3 (прогноз на 3 месяца вперед)
  • Сезонов: 12 (сезонность составляет 12 месяцев)
  • Измените имя входного файла, если вы изменили его в предыдущем блокноте.
  • Если выполнить запрос в середине месяца, итоговая сумма за последний месяц будет намного ниже ожидаемой. Поэтому для целей этой лабораторной работы давайте удалим последний месяц из набора данных, используя: df = df[:-1]
  • В данных, по всей видимости, нет явных выбросов, поэтому пропустите или закомментируйте эти ячейки.
  • Для этой новой модели необходимо настроить блоки LSTM, фильтры CNN и размер ядра.

9. Уборка

Если вы хотите продолжить использование этого блокнота, рекомендуется выключать его, когда он не используется. В пользовательском интерфейсе Workbench в вашей облачной консоли выберите блокнот, а затем выберите «Остановить» :

57213ef2edad9257.png

Если вы хотите удалить все ресурсы, созданные в этой лабораторной работе, просто удалите блокнот рабочей среды, а не останавливайте его.

В консоли Cloud Console, используя меню навигации, перейдите в раздел «Хранилище» и удалите оба созданных вами сегмента для хранения ресурсов вашей модели (ВНИМАНИЕ: делайте это только в том случае, если вы создали новые сегменты специально для этой лабораторной работы).