Gráfico de Regressão por Processo Gaussiano (GPR) de CO2

Beginner

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

Introdução

Este laboratório é um tutorial passo a passo sobre como realizar Regressão por Processo Gaussiano (GPR) nos dados de CO2 de Mauna Loa utilizando o pacote scikit-learn. Os dados consistem em concentrações atmosféricas médias mensais de CO2 coletadas no Observatório Mauna Loa no Havaí entre 1958 e 2001. O objetivo é modelar a concentração de CO2 como função do tempo e extrapolá-la para anos após 2001.

Dicas da Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Criar o Conjunto de Dados

O primeiro passo é criar o conjunto de dados, derivando-o das amostras de ar coletadas no Observatório Mauna Loa. Estamos interessados em estimar a concentração de CO2 e extrapolá-la para anos futuros. Carregamos o conjunto de dados original disponível no OpenML e pré-processamos o conjunto de dados calculando a média mensal e removendo os meses sem medições.

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()

Projetar o Kernel Adequado

Para projetar o kernel a ser usado com o nosso processo gaussiano, podemos fazer algumas suposições sobre os dados em questão. Observamos que eles possuem várias características: vemos uma tendência de crescimento de longo prazo, uma variação sazonal pronunciada e algumas irregularidades menores. Podemos usar diferentes kernels apropriados que capturariam essas características.

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
)

Ajustamento e Extrapulação do Modelo

Agora, estamos prontos para usar um regressor de processo gaussiano e ajustar os dados disponíveis. Para seguir o exemplo da literatura, subtrairemos a média do alvo. Criaremos dados sintéticos de 1958 até o mês atual e usaremos o processo gaussiano para prever nos dados de treinamento para inspecionar a adequação do ajuste e dados futuros para ver a extrapolação feita pelo modelo.

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="Medidas")
plt.plot(X_test, mean_y_pred, color="tab:blue", alpha=0.4, label="Processo Gaussiano")
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("Ano")
plt.ylabel("Média mensal da concentração de CO$_2$ (ppm)")
plt.title(
    "Medidas de média mensal de amostras de ar\ndo Observatório Mauna Loa"
)
plt.show()

Interpretação dos Hiperparâmetros do Kernel

Agora, podemos analisar os hiperparâmetros do kernel.

gaussian_process.kernel_

Assim, a maior parte do sinal alvo, com a média subtraída, é explicada por uma tendência de crescimento de longo prazo de ~45 ppm e uma escala de comprimento de ~52 anos. O componente periódico tem uma amplitude de ~2,6 ppm, um tempo de decaimento de ~90 anos e uma escala de comprimento de ~1,5. O tempo de decaimento longo indica que temos um componente muito próximo a uma periodicidade sazonal. O ruído correlacionado tem uma amplitude de ~0,2 ppm com uma escala de comprimento de ~0,12 anos e uma contribuição de ruído branco de ~0,04 ppm. Portanto, o nível geral de ruído é muito baixo, indicando que os dados podem ser muito bem explicados pelo modelo.

Resumo

Este laboratório demonstrou como realizar Regressão por Processo Gaussiano (GPR) em dados de CO2 de Mauna Loa utilizando o pacote scikit-learn. Os dados consistem em concentrações atmosféricas médias mensais de CO2 coletadas no Observatório Mauna Loa no Havaí entre 1958 e 2001. O objetivo é modelar a concentração de CO2 como função do tempo e extrapolá-la para anos após 2001. Construímos o conjunto de dados, projetamos o kernel apropriado, ajustamos o modelo e realizamos a extrapolação. Finalmente, interpretamos os hiperparâmetros do kernel.