1. Обзор
В этой лабораторной работе вы научитесь создавать модель прогнозирования временных рядов с помощью TensorFlow, а затем развернете эти модели с помощью Vertex AI .
Чему вы научитесь
Вы научитесь:
- Преобразовать данные таким образом, чтобы их можно было использовать в модели машинного обучения.
- Визуализируйте и анализируйте данные.
- Используйте BigQuery ML для создания модели прогнозирования временных рядов.
- Создайте модель прогнозирования временных рядов с помощью TensorFlow, используя архитектуры LSTM и CNN.
2. Введение в прогнозирование временных рядов
В этом практическом занятии основное внимание уделяется применению методов прогнозирования временных рядов с использованием платформы Google Cloud Platform. Это не общий курс по прогнозированию временных рядов, но краткий обзор основных концепций может быть полезен для наших пользователей.
Данные временных рядов
Во-первых, что такое временной ряд? Это набор данных, записанных через регулярные интервалы времени. Набор данных временного ряда содержит как время, так и как минимум одну переменную, зависящую от времени.

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

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

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

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

Теперь, когда мы рассмотрели некоторые основы, давайте начнем изучать данные и прогнозирование!
3. Настройте среду Notebook.
Теперь, когда мы кратко ознакомились с данными, давайте настроим среду разработки модели.
Шаг 1: Включите API.
Коннектор BigQuery использует API хранилища BigQuery. Найдите API хранилища BigQuery в консоли и включите его, если он в данный момент отключен.

Шаг 2: Создайте блокнот Vertex AI Workbench.
Перейдите в раздел Vertex AI Workbench в вашей облачной консоли и нажмите «Новый блокнот» . Затем выберите последний тип блокнота TensorFlow Enterprise 2.x без графических процессоров :
Используйте параметры по умолчанию, а затем нажмите «Создать ». После создания экземпляра выберите «Открыть JupyterLab» :

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

Шаг 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
В этом разделе вы импортировали данные и визуализировали различные их параметры. Теперь, когда у вас есть более четкое представление о данных, вы готовы перейти к моделированию машинного обучения с использованием этих данных.

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 (с помощью поиска или этой ссылки ):

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

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

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

Шаг 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`
Для лучшего понимания рассмотрим ключевые элементы синтаксиса:
| Эта инструкция создает модель. Существуют варианты этой инструкции, например, |
| Здесь мы определяем параметры модели, причем первый параметр — это тип модели. Выбор ARIMA создаст модель прогнозирования временных рядов. |
| Столбец с информацией о дате/времени. |
| Столбец данных |
| Этот необязательный параметр позволяет нам включить в модель праздничные дни. Поскольку анализ данных на предыдущем этапе показал, что пассажиропоток в праздничные дни был ниже, а данные получены из Чикаго, штат Иллинойс, США, мы включаем в модель праздники США. |
| В этом разделе выбираются входные данные, которые мы будем использовать для обучения модели. |
В запрос можно добавить ряд других параметров, например, определить столбец, если у вас несколько временных рядов, или выбрать, следует ли автоматически определять параметры модели ARIMA. Более подробную информацию можно найти в справочнике по синтаксису оператора CREATE MODEL для моделей временных рядов .
Шаг 4
Давайте узнаем больше о нашей модели. После завершения обучения выполним еще один запрос, при необходимости снова заменив демонстрационный пример :
SELECT * FROM ML.EVALUATE(MODEL `demo.cta_ridership_model`)
Давайте интерпретируем результаты. В каждой строке вы увидите модель-кандидат с ее параметрами и статистическими данными оценки. Результаты представлены в порядке возрастания AIC, или информационного критерия Акаике , который служит относительным показателем качества модели. Таким образом, модель в первой строке имеет наименьший AIC и считается лучшей моделью.
Вы сможете увидеть параметры p, d и q модели ARIMA , а также сезонность, обнаруженную в модели. В данном случае, лучшая модель включает как недельную, так и годовую сезонность.

Шаг 5
Теперь мы готовы к прогнозированию с помощью функции ML.FORECAST !
Вставьте/введите следующее (заменив слово "demo" при необходимости):
SELECT
*
FROM
ML.FORECAST(MODEL `demo.cta_ridership_model`,
STRUCT(7 AS horizon))
Этот запрос просто делает прогноз на 7 дней вперед, используя нашу модель! Ниже мы видим семь возвращенных строк. Прогноз также включает доверительный интервал, по умолчанию равный 0,95, но который можно настроить в запросе.

Отличная работа: мы создали модель временных рядов всего с помощью нескольких BQML-запросов.
6. Создайте собственную модель прогнозирования.
В этом разделе вы узнаете:
- Удалите выбросы из данных.
- Выполняйте многошаговое прогнозирование
- Включение дополнительных функций в модель временных рядов
- Узнайте об архитектурах нейронных сетей для прогнозирования временных рядов: LSTM и CNN.
- Изучите статистические модели, включая экспоненциальное сглаживание Холта-Винтерса.
- Ансамблевые модели
Шаг 1
В Vertex AI Workbench перейдите в папку training-data-analyst/courses/ai-for-time-series/notebooks и откройте файл 02-model.ipynb .
Шаг 2
Очистите все ячейки в блокноте (Редактировать > Очистить все выходные данные), измените параметры региона, проекта и сегмента в одной из первых нескольких ячеек, а затем запускайте ячейки по одной.
Шаг 3
В блокноте вы изучили несколько архитектур моделей: LSTM, CNN и статистические модели. Для каждой модели вы можете увидеть, как она работает на тестовых данных:

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 для обучения и развертывания.

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 в вашей облачной консоли выберите блокнот, а затем выберите «Остановить» :

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