Построение графика для GPR Co2

Beginner

This tutorial is from open-source community. Access the source code

Введение

Этот практикум представляет собой пошаговое руководство по проведению регрессии с использованием гауссового процесса (GPR) для данных о CO2 на Мауна-Лоа с использованием пакета scikit-learn. Данные состоят из месячных средних концентраций CO2 в атмосфере, собранных на обсерватории Мауна-Лоа в Гавайях в период с 1958 по 2001 год. Цель - построить модель зависимости концентрации CO2 от времени и провести экстраполяцию для годов после 2001 года.

Советы по работе с ВМ

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

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами при обучении, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Создание датасета

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

from sklearn.datasets import fetch_openml
import pandas as pd

co2 = fetch_openml(data_id=41187, as_frame=True, parser="pandas")
co2_data = co2.frame
co2_data["date"] = pd.to_datetime(co2_data[["year", "month", "day"]])
co2_data = co2_data[["date", "co2"]].set_index("date")
co2_data = co2_data.resample("M").mean().dropna(axis="index", how="any")

X = (co2_data.index.year + co2_data.index.month / 12).to_numpy().reshape(-1, 1)
y = co2_data["co2"].to_numpy()

Создание соответствующего ядра

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

from sklearn.gaussian_process.kernels import RBF, ExpSineSquared, RationalQuadratic, WhiteKernel

long_term_trend_kernel = 50.0**2 * RBF(length_scale=50.0)
seasonal_kernel = (
    2.0**2
    * RBF(length_scale=100.0)
    * ExpSineSquared(length_scale=1.0, periodicity=1.0, periodicity_bounds="fixed")
)
irregularities_kernel = 0.5**2 * RationalQuadratic(length_scale=1.0, alpha=1.0)
noise_kernel = 0.1**2 * RBF(length_scale=0.1) + WhiteKernel(
    noise_level=0.1**2, noise_level_bounds=(1e-5, 1e5)
)

co2_kernel = (
    long_term_trend_kernel + seasonal_kernel + irregularities_kernel + noise_kernel
)

Настройка модели и экстраполяция

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

from sklearn.gaussian_process import GaussianProcessRegressor
import datetime
import numpy as np
import matplotlib.pyplot as plt

y_mean = y.mean()
gaussian_process = GaussianProcessRegressor(kernel=co2_kernel, normalize_y=False)
gaussian_process.fit(X, y - y_mean)

today = datetime.datetime.now()
current_month = today.year + today.month / 12
X_test = np.linspace(start=1958, stop=current_month, num=1_000).reshape(-1, 1)
mean_y_pred, std_y_pred = gaussian_process.predict(X_test, return_std=True)
mean_y_pred += y_mean

plt.plot(X, y, color="black", linestyle="dashed", label="Measurements")
plt.plot(X_test, mean_y_pred, color="tab:blue", alpha=0.4, label="Gaussian process")
plt.fill_between(
    X_test.ravel(),
    mean_y_pred - std_y_pred,
    mean_y_pred + std_y_pred,
    color="tab:blue",
    alpha=0.2,
)
plt.legend()
plt.xlabel("Year")
plt.ylabel("Monthly average of CO$_2$ concentration (ppm)")
plt.title(
    "Monthly average of air samples measurements\nfrom the Mauna Loa Observatory"
)
plt.show()

Интерпретация гиперпараметров ядра

Теперь мы можем рассмотреть гиперпараметры ядра.

gaussian_process.kernel_

Таким образом, большая часть целевого сигнала, с вычтенным средним значением, объясняется долгосрочным восходящим трендом на ~45 ppm и масштабом длины ~52 года. Периодический компонент имеет амплитуду ~2,6 ppm, время затухания ~90 лет и масштаб длины ~1,5. Большое время затухания указывает на то, что у нас есть компонент, очень близкий к сезонной периодичности. Коррелированный шум имеет амплитуду ~0,2 ppm с масштабом длины ~0,12 года и вклад белого шума ~0,04 ppm. Таким образом, общий уровень шума очень мал, что указывает на то, что модель может очень хорошо объяснить данные.

Резюме

В этом практическом занятии показано, как выполнить регрессию с использованием гауссового процесса (GPR) для данных о CO2 с обсерватории Мауна-Лоа с использованием пакета scikit-learn. Данные представляют собой месячные средние концентрации атмосферного CO2, собранные на обсерватории Мауна-Лоа в Гавайях в период с 1958 по 2001 год. Цель состоит в том, чтобы моделировать концентрацию CO2 в зависимости от времени и экстраполировать ее на годы после 2001 года. Мы создали датасет, разработали соответствующее ядро, настроили модель и выполнили экстраполяцию. Наконец, мы проинтерпретировали гиперпараметры ядра.