소개
가우스 프로세스 회귀는 입력 변수를 기반으로 목표 변수의 결과를 예측하는 통계 모델링 기법입니다. 이 기법은 목표 변수의 분포를 가우스 프로세스로 모델링합니다. 가우스 프로세스는 임의 변수의 집합으로, 임의의 유한 개의 변수는 공동 가우스 분포를 갖습니다. 이 기법은 입력 변수와 목표 변수 간의 관계가 비선형인 경우에 특히 유용합니다.
이 실습에서는 Python 의 scikit-learn 라이브러리를 사용하여 노이즈 수준 추정이 포함된 가우스 프로세스 회귀를 배우게 됩니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습용 Jupyter Notebook에 접근합니다.
때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화될 수 없습니다.
학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.
데이터 생성
이 단계에서는 사인 함수를 사용하여 단일 특징을 가진 데이터를 생성합니다.
import numpy as np
def target_generator(X, add_noise=False):
target = 0.5 + np.sin(3 * X)
if add_noise:
rng = np.random.RandomState(1)
target += rng.normal(0, 0.3, size=target.shape)
return target.squeeze()
X = np.linspace(0, 5, num=30).reshape(-1, 1)
y = target_generator(X, add_noise=False)
데이터 시각화
이 단계에서는 생성된 데이터를 시각화합니다.
import matplotlib.pyplot as plt
plt.plot(X, y, label="예상 신호")
plt.legend()
plt.xlabel("X")
_ = plt.ylabel("y")
노이즈 추가
이 단계에서는 생성된 데이터에 노이즈를 추가하여 더욱 현실적인 학습 데이터셋을 만듭니다.
rng = np.random.RandomState(0)
X_train = rng.uniform(0, 5, size=20).reshape(-1, 1)
y_train = target_generator(X_train, add_noise=True)
데이터 시각화
이 단계에서는 예상 신호와 함께 노이즈가 추가된 학습 데이터셋을 시각화합니다.
plt.plot(X, y, label="예상 신호")
plt.scatter(
x=X_train[:, 0],
y=y_train,
color="black",
alpha=0.4,
label="관측값",
)
plt.legend()
plt.xlabel("X")
_ = plt.ylabel("y")
가우시안 프로세스 회귀
이 단계에서는 덧셈 커널을 사용하여 가우시안 프로세스 회귀 모델을 생성합니다. 덧셈 커널은 RBF 커널과 WhiteKernel 커널을 포함합니다. WhiteKernel 커널은 데이터에 존재하는 노이즈의 양을 추정하는 데 사용되며, RBF 커널은 데이터와 목표 변수 사이의 비선형성을 적합하는 데 사용됩니다.
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, WhiteKernel
kernel = 1.0 * RBF(length_scale=1e-1, length_scale_bounds=(1e-2, 1e3)) + WhiteKernel(
noise_level=1e-2, noise_level_bounds=(1e-10, 1e1)
)
gpr = GaussianProcessRegressor(kernel=kernel, alpha=0.0)
gpr.fit(X_train, y_train)
y_mean, y_std = gpr.predict(X, return_std=True)
데이터 시각화
이 단계에서는 가우시안 프로세스 회귀 모델이 예측한 결과를 시각화합니다.
plt.plot(X, y, label="예상 신호")
plt.scatter(x=X_train[:, 0], y=y_train, color="black", alpha=0.4, label="관측값")
plt.errorbar(X, y_mean, y_std)
plt.legend()
plt.xlabel("X")
plt.ylabel("y")
_ = plt.title(
(
f"초기: {kernel}\n최적: {gpr.kernel_}\n로그 - 주변확률밀도: "
f"{gpr.log_marginal_likelihood(gpr.kernel_.theta)}"
),
fontsize=8,
)
로그 - 주변확률밀도
이 단계에서는 GaussianProcessRegressor 의 로그 - 주변확률밀도 (LML) 를 다양한 하이퍼파라미터에 대해 조사하여 국소 최소값을 파악합니다.
from matplotlib.colors import LogNorm
length_scale = np.logspace(-2, 4, num=50)
noise_level = np.logspace(-2, 1, num=50)
length_scale_grid, noise_level_grid = np.meshgrid(length_scale, noise_level)
log_marginal_likelihood = [
gpr.log_marginal_likelihood(theta=np.log([0.36, scale, noise]))
for scale, noise in zip(length_scale_grid.ravel(), noise_level_grid.ravel())
]
log_marginal_likelihood = np.reshape(
log_marginal_likelihood, newshape=noise_level_grid.shape
)
vmin, vmax = (-log_marginal_likelihood).min(), 50
level = np.around(np.logspace(np.log10(vmin), np.log10(vmax), num=50), decimals=1)
plt.contour(
length_scale_grid,
noise_level_grid,
-log_marginal_likelihood,
levels=level,
norm=LogNorm(vmin=vmin, vmax=vmax),
)
plt.colorbar()
plt.xscale("log")
plt.yscale("log")
plt.xlabel("길이척도")
plt.ylabel("잡음 수준")
plt.title("로그 - 주변확률밀도")
plt.show()
결론
이 실험에서는 Python 의 scikit-learn 라이브러리를 사용하여 노이즈 수준 추정이 포함된 가우시안 프로세스 회귀를 수행하는 방법을 배웠습니다. 사인 함수를 사용하여 단일 특징을 가진 데이터를 생성하고, 생성된 데이터에 노이즈를 추가하여 더욱 현실적인 학습 데이터셋을 만들었습니다. 생성된 데이터를 시각화했으며, RBF 커널과 WhiteKernel 커널을 더한 덧셈 커널을 사용하여 가우시안 프로세스 회귀자를 만들고, 가우시안 프로세스 회귀자가 만든 예측을 시각화했습니다. 또한, 다양한 하이퍼파라미터에 대한 가우시안 프로세스 회귀자의 로그 - 주변확률밀도 (LML) 를 조사하여 국소 최소값을 파악했습니다.
요약
축하합니다! 가우시안 프로세스 회귀 실험을 완료했습니다. LabEx 에서 더 많은 실험을 통해 기술을 향상시킬 수 있습니다.