GPR の CO2 をプロットする

Beginner

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

はじめに

この実験は、scikit-learn パッケージを使用してモナロアの CO2 データに対してガウス過程回帰(GPR)を実行する方法に関する手順を追ったチュートリアルです。データは、1958 年から 2001 年の間にハワイのモナロア天文台で収集された月平均大気 CO2 濃度で構成されています。目的は、CO2 濃度を時間の関数としてモデル化し、2001 年以降の年に対して外挿することです。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、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_

したがって、平均を引いた後の目的信号の大部分は、約 45ppm の長期的な上昇傾向と約 52 年の長さスケールによって説明されます。周期成分は、振幅が約 2.6ppm、減衰時間が約 90 年、長さスケールが約 1.5 です。長い減衰時間は、私たちが季節周期に非常に近い成分を持っていることを示しています。相関ノイズは、振幅が約 0.2ppm、長さスケールが約 0.12 年、ホワイトノイズの寄与が約 0.04ppm です。したがって、全体的なノイズレベルは非常に小さく、データがモデルによって非常にうまく説明できることを示しています。

まとめ

この実験では、scikit-learn パッケージを使用して、モナロアの CO2 データに対してガウス過程回帰(GPR)を行う方法を示しました。データは、1958 年から 2001 年までの間にハワイのモナロア天文台で収集された月平均大気 CO2 濃度で構成されています。目的は、CO2 濃度を時間の関数としてモデル化し、2001 年以降の数年間にわたって外挿することです。私たちは、データセットを作成し、適切なカーネルを設計し、モデルにフィッティングし、外挿を行いました。最後に、カーネルのハイパーパラメータを解釈しました。