Einführung
In diesem Lab werden wir lernen, wie wir die Gaussian Process Regression verwenden, um ein Modell an einen Datensatz anzupassen. Wir werden einen synthetischen Datensatz generieren und die Gaussian Process Regression verwenden, um ein Modell an ihn anzupassen. Wir werden die scikit-learn-Bibliothek verwenden, um die Gaussian Process Regression durchzuführen.
VM-Tipps
Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.
Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.
Datensatzgenerierung
Wir werden einen synthetischen Datensatz generieren. Der wahre Generierungsprozess ist definiert als 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")
Rauschfreies Ziel
In diesem Schritt werden wir den wahren Generierungsprozess verwenden, ohne irgendeinen Rausch hinzuzufügen. Für das Training der Gaussian Process Regression werden wir nur einige wenige Stichproben auswählen.
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_
Vorhersagen und Konfidenzintervalle
Nachdem wir unser Modell angepasst haben, sehen wir, dass die Hyperparameter des Kerns optimiert wurden. Nun werden wir unseren Kern verwenden, um die mittlere Vorhersage des gesamten Datensatzes zu berechnen und das 95%-Konfidenzintervall zu plotten.
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="Beobachtungen")
plt.plot(X, mean_prediction, label="Mittlere Vorhersage")
plt.fill_between(
X.ravel(),
mean_prediction - 1.96 * std_prediction,
mean_prediction + 1.96 * std_prediction,
alpha=0.5,
label=r"95%-Konfidenzintervall",
)
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("Gaussian process regression on noise-free dataset")
Rauschbehaftete Ziele
Wir können ein ähnliches Experiment wiederholen und diesmal zusätzlichen Rausch zum Ziel hinzufügen. Dadurch können wir den Effekt des Rauschs auf das angepasste Modell sehen.
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="Beobachtungen",
)
plt.plot(X, mean_prediction, label="Mittlere Vorhersage")
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%-Konfidenzintervall",
)
plt.legend()
plt.xlabel("$x$")
plt.ylabel("$f(x)$")
_ = plt.title("Gaussian process regression on a noisy dataset")
Zusammenfassung
In diesem Lab haben wir gelernt, wie man die Gaussian Process Regression verwendet, um ein Modell an einen Datensatz anzupassen. Wir haben einen synthetischen Datensatz generiert und die Gaussian Process Regression verwendet, um ein Modell an ihn anzupassen. Wir haben die scikit-learn-Bibliothek verwendet, um die Gaussian Process Regression durchzuführen und die mittleren Vorhersagen und die 95%-Konfidenzintervalle geplottet.