Tracer la régression GPR pour le CO2

Machine LearningMachine LearningBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Ce laboratoire est un tutoriel étape par étape sur la manière de réaliser une régression par processus gaussien (GPR) sur les données de CO2 de Mauna Loa à l'aide du package scikit-learn. Les données sont constituées des concentrations mensuelles moyennes de CO2 atmosphérique recueillies à l'Observatoire de Mauna Loa à Hawaii entre 1958 et 2001. L'objectif est de modéliser la concentration de CO2 en fonction du temps et de l'extrapoler pour les années postérieures à 2001.

Conseils sur la VM

Une fois le démarrage de la VM terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder à Jupyter Notebook pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session, et nous résoudrons rapidement le problème pour vous.

Construire l'ensemble de données

La première étape consiste à construire l'ensemble de données en le dérivant de l'Observatoire de Mauna Loa qui a collecté des échantillons d'air. Nous sommes intéressés à estimer la concentration de CO2 et à l'extrapoler pour les années suivantes. Nous chargeons l'ensemble de données original disponible sur OpenML et prétraitons l'ensemble de données en prenant la moyenne mensuelle et en éliminant les mois pour lesquels aucune mesure n'a été collectée.

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

Construire le noyau approprié

Pour concevoir le noyau à utiliser avec notre processus gaussien, nous pouvons faire quelques hypothèses concernant les données disponibles. Nous observons qu'elles présentent plusieurs caractéristiques : une tendance à la hausse à long terme, une variation saisonnière prononcée et quelques irrégularités plus petites. Nous pouvons utiliser différents noyaux appropriés qui captureront ces caractéristiques.

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
)

Ajustement et extrapolation du modèle

Maintenant, nous sommes prêts à utiliser un régresseur par processus gaussien et à ajuster les données disponibles. Pour suivre l'exemple de la littérature, nous allons soustraire la moyenne de la variable cible. Nous créons des données synthétiques de 1958 jusqu'au mois actuel et utilisons le processus gaussien pour prédire sur les données d'entraînement pour vérifier la qualité de l'ajustement et sur les données futures pour voir l'extrapolation effectuée par le modèle.

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

Interprétation des hyperparamètres du noyau

Maintenant, nous pouvons examiner les hyperparamètres du noyau.

gaussian_process.kernel_

Ainsi, la majeure partie du signal cible, avec la moyenne soustraite, est expliquée par une tendance à la hausse à long terme d'environ 45 ppm et une échelle de longueur d'environ 52 ans. La composante périodique a une amplitude d'environ 2,6 ppm, un temps de décroissance d'environ 90 ans et une échelle de longueur d'environ 1,5. Le long temps de décroissance indique qu'il existe une composante très proche d'une périodicité saisonnière. Le bruit corrélé a une amplitude d'environ 0,2 ppm avec une échelle de longueur d'environ 0,12 ans et une contribution de bruit blanc d'environ 0,04 ppm. Ainsi, le niveau global de bruit est très faible, ce qui indique que les données peuvent être très bien expliquées par le modèle.

Sommaire

Ce laboratoire a démontré comment effectuer une régression par processus gaussien (GPR) sur les données de CO2 de Mauna Loa à l'aide du package scikit-learn. Les données consistent en les concentrations mensuelles moyennes de CO2 atmosphérique collectées à l'Observatoire de Mauna Loa à Hawaii entre 1958 et 2001. L'objectif est de modéliser la concentration de CO2 en fonction du temps et de l'extrapoler pour les années après 2001. Nous avons construit l'ensemble de données, conçu le noyau approprié, ajusté le modèle et effectué une extrapolation. Enfin, nous avons interprété les hyperparamètres du noyau.