Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу, чтобы загрузить весь пример кода. или запустить этот пример в браузере через JupyterLite или Binder

Регрессия Гауссовых процессов: базовый вводный пример

Простой пример регрессии в одном измерении, вычисленный двумя различными способами:

  1. Случай без шума
  2. Случай с шумом, с известным уровнем шума на точку данных

В обоих случаях параметры ядра оцениваются с помощью принципа максимального правдоподобия.

Рисунки иллюстрируют интерполирующую способность модели Гауссового процесса, а также ее вероятностную природу в виде точечного 95%-ного доверительного интервала.

Обратите внимание, что alpha — параметр, контролирующий силу регуляризации Тихонова на матрице ковариаций предполагаемых точек обучения.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Генерация набора данных

Начнем с генерации синтетического набора данных. Истинный генеративный процесс определяется как \(f(x) = x \sin(x)\).

import numpy as np

X = np.linspace(start=0, stop=10, num=1_000).reshape(-1, 1)
y = np.squeeze(X * np.sin(X))
import matplotlib.pyplot as plt

plt.plot(X, y, label=r"$f(x) = x \sin(x)$", linestyle="dotted")
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("True generative process")
True generative process

Мы будем использовать этот набор данных в следующем эксперименте, чтобы проиллюстрировать работу регрессии Гауссового процесса.

Пример с целевой функцией без шума

В этом первом примере мы будем использовать истинный генеративный процесс без добавления шума. Для обучения регрессии Гауссового процесса мы выберем лишь несколько образцов.

rng = np.random.RandomState(1)
training_indices = rng.choice(np.arange(y.size), size=6, replace=False)
X_train, y_train = X[training_indices], y[training_indices]

Теперь мы подгоняем гауссовский процесс к этим немногим тренировочным образцам. Мы будем использовать ядро радиальных базисных функций (RBF) и постоянный параметр для подгонки амплитуды.

from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF

kernel = 1 * RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e2))
gaussian_process = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=9)
gaussian_process.fit(X_train, y_train)
gaussian_process.kernel_
5.02**2 * RBF(length_scale=1.43)

После подгонки нашей модели мы видим, что гиперпараметры ядра были оптимизированы. Теперь мы будем использовать наше ядро для вычисления среднего прогноза всего набора данных и построения 95%-ного доверительного интервала.

mean_prediction, std_prediction = gaussian_process.predict(X, return_std=True)

plt.plot(X, y, label=r"$f(x) = x \sin(x)$", linestyle="dotted")
plt.scatter(X_train, y_train, label="Observations")
plt.plot(X, mean_prediction, label="Mean prediction")
plt.fill_between(
    X.ravel(),
    mean_prediction - 1.96 * std_prediction,
    mean_prediction + 1.96 * std_prediction,
    alpha=0.5,
    label=r"95% confidence interval",
)
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("Gaussian process regression on noise-free dataset")
Gaussian process regression on noise-free dataset

Мы видим, что для прогноза, сделанного в точке данных, близкой к точке из обучающего набора, 95%-ный доверительный интервал имеет малую амплитуду. Когда образец находится далеко от обучающих данных, точность прогноза модели снижается, и точность прогноза модели уменьшается (возрастает неопределенность).

Пример с шумными целевыми значениями

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

Мы добавляем некоторый случайный гауссовский шум к целевому значению с произвольным стандартным отклонением.

noise_std = 0.75
y_train_noisy = y_train + rng.normal(loc=0.0, scale=noise_std, size=y_train.shape)

Мы создаем аналогичную модель Гауссового процесса. В дополнение к ядру, на этот раз мы задаем параметр alpha, который можно интерпретировать как дисперсию гауссовского шума.

gaussian_process = GaussianProcessRegressor(
    kernel=kernel, alpha=noise_std**2, n_restarts_optimizer=9
)
gaussian_process.fit(X_train, y_train_noisy)
mean_prediction, std_prediction = gaussian_process.predict(X, return_std=True)

Давайте построим средний прогноз и область неопределенности, как и раньше.

plt.plot(X, y, label=r"$f(x) = x \sin(x)$", linestyle="dotted")
plt.errorbar(
    X_train,
    y_train_noisy,
    noise_std,
    linestyle="None",
    color="tab:blue",
    marker=".",
    markersize=10,
    label="Observations",
)
plt.plot(X, mean_prediction, label="Mean prediction")
plt.fill_between(
    X.ravel(),
    mean_prediction - 1.96 * std_prediction,
    mean_prediction + 1.96 * std_prediction,
    color="tab:orange",
    alpha=0.5,
    label=r"95% confidence interval",
)
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("Gaussian process regression on a noisy dataset")
Gaussian process regression on a noisy dataset

Шум влияет на прогнозы, близкие к тренировочным образцам: предсказательная неопределённость вблизи тренировочных образцов больше, потому что мы явно моделируем заданный уровень шума целевой функции, независимый от входной переменной.

Общее время выполнения скрипта: (0 минут 0,469 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_gpr_noisy_targets.ipynb

Download Python source code: plot_gpr_noisy_targets.py

Download zipped: plot_gpr_noisy_targets.zip

Связанные примеры

Сравнение регрессии с ядром гребня и регрессии Гауссового процесса

Возможность регрессии Гауссового процесса (GPR) оценить уровень шума данных

Прогнозирование уровня CO2 по набору данных Mona Loa с помощью регрессии Гауссового процесса (GPR)

Предсказательные интервалы для регрессии с градиентным бустингом

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/gaussian_process/plot_gpr_noisy_targets.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API