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.475 секунды)

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 на наборе данных Мауна-Лоа с помощью регрессии с гауссовскими процессами (GPR)

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

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

Spec-Zone.ru

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