Ajustar Modelo de Regressão por Processo Gaussiano

Beginner

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

Introdução

Neste laboratório, aprenderemos a utilizar a regressão por Processo Gaussiano para ajustar um modelo a um conjunto de dados. Geraremos um conjunto de dados sintético e utilizaremos a regressão por Processo Gaussiano para ajustar um modelo a ele. Usaremos a biblioteca scikit-learn para realizar a regressão por Processo Gaussiano.

Dicas da Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para si.

Geração de Dados

Vamos gerar um conjunto de dados sintético. O verdadeiro processo gerador é definido como f(x) = x sen(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("Verdadeiro processo gerador")

Alvo Sem Ruído

Neste passo, utilizaremos o verdadeiro processo gerador sem adicionar qualquer ruído. Para treinar a regressão por Processo Gaussiano, selecionaremos apenas algumas amostras.

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]

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_

Predições e Intervalos de Confiança

Após ajustar o nosso modelo, vemos que os hiperparâmetros do kernel foram otimizados. Agora, usaremos o nosso kernel para calcular a previsão média de todo o conjunto de dados e traçar o intervalo de confiança de 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="Observações")
plt.plot(X, mean_prediction, label="Previsão média")
plt.fill_between(
    X.ravel(),
    mean_prediction - 1.96 * std_prediction,
    mean_prediction + 1.96 * std_prediction,
    alpha=0.5,
    label=r"Intervalo de confiança de 95%",
)
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("Regressão por processo gaussiano em conjunto de dados sem ruído")

Alvos com Ruído

Podemos repetir um experimento semelhante adicionando um ruído adicional ao alvo desta vez. Isso permitirá ver o efeito do ruído no modelo ajustado.

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

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="Observações",
)
plt.plot(X, mean_prediction, label="Previsão média")
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"Intervalo de confiança de 95%",
)
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("Regressão por processo gaussiano em um conjunto de dados com ruído")

Resumo

Neste laboratório, aprendemos como usar a regressão por processo gaussiano para ajustar um modelo a um conjunto de dados. Geramos um conjunto de dados sintético e usamos a regressão por processo gaussiano para ajustar um modelo a ele. Usamos a biblioteca scikit-learn para realizar a regressão por processo gaussiano e plotamos as previsões médias e os intervalos de confiança de 95%.