Нелинейная прогностическая модель с использованием Гауссовского процесса

Beginner

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

Введение

Регирессия гауссовского процесса - это статистическая модель, используемая для предсказания результата целевой переменной на основе входных переменных. Эта модель представляет распределение целевой переменной в виде гауссовского процесса, который представляет собой совокупность случайных переменных, любое конечное количество которых имеет совместное гауссовское распределение. Эта техника особенно полезна в случаях, когда связь между входными и целевыми переменными является нелинейной.

В этом практическом занятии мы научимся использовать регрессию гауссовского процесса с оценкой уровня шума в Python с использованием библиотеки scikit-learn.

Советы по использованию ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку 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="Expected signal")
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="Expected signal")
plt.scatter(
    x=X_train[:, 0],
    y=y_train,
    color="black",
    alpha=0.4,
    label="Observations",
)
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="Expected signal")
plt.scatter(x=X_train[:, 0], y=y_train, color="black", alpha=0.4, label="Observations")
plt.errorbar(X, y_mean, y_std)
plt.legend()
plt.xlabel("X")
plt.ylabel("y")
_ = plt.title(
    (
        f"Initial: {kernel}\nOptimum: {gpr.kernel_}\nLog-Marginal-Likelihood: "
        f"{gpr.log_marginal_likelihood(gpr.kernel_.theta)}"
    ),
    fontsize=8,
)

Логарифмическая маргинальная правдоподобие

В этом шаге мы исследуем Логарифмическую маргинальную правдоподобие (LML) GaussianProcessRegressor для различных гиперпараметров, чтобы понять, где находятся локальные минимумы.

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("Length-scale")
plt.ylabel("Noise-level")
plt.title("Log-marginal-likelihood")
plt.show()

Заключение

В этом практическом занятии мы научились использовать регрессию Гауссовского процесса с оценкой уровня шума в Python с использованием библиотеки scikit - learn. Мы сгенерировали некоторые данные с одной характеристикой с использованием синусоидальной функции, добавили некоторый шум к сгенерированным данным, чтобы создать более реалистичный набор данных для обучения, и визуализировали сгенерированные данные. Мы создали регрессор Гауссовского процесса с использованием аддитивного ядра, добавляя ядра RBF и WhiteKernel, и визуализировали предсказания, сделанные регрессором Гауссовского процесса. Мы также исследовали Логарифмическую маргинальную правдоподобие (LML) GaussianProcessRegressor для различных гиперпараметров, чтобы понять, где находятся локальные минимумы.

Резюме

Поздравляем! Вы завершили практическое занятие по регрессии Гауссовского процесса. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.