마우나 로아 CO2 데이터 GPR 플롯

Beginner

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

소개

이 실습은 scikit-learn 패키지를 사용하여 마우나 로아 CO2 데이터에 대한 가우시안 프로세스 회귀 (GPR) 를 단계별로 수행하는 방법에 대한 자습서입니다. 이 데이터는 1958 년부터 2001 년까지 하와이 마우나 로아 천문대에서 수집된 월 평균 대기 CO2 농도로 구성됩니다. 목표는 시간의 함수로 CO2 농도를 모델링하고 2001 년 이후의 연도에 대해 외삽하는 것입니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 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("연도")
plt.ylabel("CO$_2$ 농도의 월 평균 (ppm)")
plt.title(
    "마우나 로아 천문대의 공기 샘플 측정치의 월 평균"
)
plt.show()

커널 하이퍼파라미터 해석

이제 커널의 하이퍼파라미터를 살펴볼 수 있습니다.

gaussian_process.kernel_

따라서, 평균을 뺀 대부분의 목표 신호는 약 45 ppm 의 장기적인 상승 추세와 약 52 년의 길이 스케일로 설명됩니다. 주기적 성분은 약 2.6ppm 의 진폭, 약 90 년의 감쇠 시간 및 약 1.5 의 길이 스케일을 갖습니다. 긴 감쇠 시간은 계절적 주기성에 매우 가까운 성분임을 나타냅니다. 상관된 노이즈는 약 0.2 ppm 의 진폭, 약 0.12 년의 길이 스케일 및 약 0.04 ppm 의 백색 노이즈 기여도를 갖습니다. 따라서 전체적인 노이즈 수준은 매우 작아서 데이터가 모델로 매우 잘 설명될 수 있음을 나타냅니다.

요약

이 실험에서는 scikit-learn 패키지를 사용하여 마우나 로아 CO2 데이터에 대한 가우시안 프로세스 회귀 (GPR) 를 수행하는 방법을 보여주었습니다. 이 데이터는 1958 년부터 2001 년까지 하와이 마우나 로아 천문대에서 수집된 월 평균 대기 CO2 농도로 구성됩니다. 목표는 시간의 함수로 CO2 농도를 모델링하고 2001 년 이후의 연도에 대해 외삽하는 것입니다. 우리는 데이터 세트를 구축하고 적절한 커널을 설계하고, 모델을 맞추고, 외삽을 수행했습니다. 마지막으로 커널 하이퍼파라미터를 해석했습니다.