Exemple de normalisation des données de sortie pour une régression non linéaire avec les processus Gaussien en python avec scikit-learn ?

Published: 13 juillet 2020

Tags: Python; Machine learning; Scikit Learn; Gaussian Processes;

DMCA.com Protection Status

Exemple d'impact de la normalisation des données de sortie pour une régression non linéaire avec les processus Gaussien en python avec scikit-learn:

Régression non linéaire avec les processus Gaussien

Importer les modules nécessaires:

from sklearn import preprocessing
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF
from sklearn.gaussian_process.kernels import DotProduct, ConstantKernel as C
from pylab import figure

import matplotlib.pyplot as plt
import numpy as np

Données d'entraînement:

x = np.arange(0.0,12.0,1.0)
x = x[:, np.newaxis]

y = np.array([0.9995577,  0.999717,   0.9997348,  0.99975765, 0.99978703, 0.99980724, 0.9998182,  0.99982077, 0.99981844, 0.99981105, 0.99980015, 0.9997869 ])
y = y[:, np.newaxis]

Apprentissage:

kernel = C(1.0, (0.1, 10.0)) * RBF([0.1], (1e-2, 1e2))

gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=20)

mymodel = gp.fit(x,y)

Prédiction:

fig = figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')

plt.scatter(x,y)

x = np.arange(0,11.1,0.1)
x = x[:, np.newaxis]

y = mymodel.predict(x)

plt.plot(x,y,color='red')

plt.ylim(np.min(y)-0.00001,np.max(y)+0.00001)

plt.grid()

plt.show()

donne:

Impact de la normalisation des données de sortie pour une régression non linéaire  avec les processus Gaussien en python avec scikit-learn ?
Impact de la normalisation des données de sortie pour une régression non linéaire avec les processus Gaussien en python avec scikit-learn ?

Avec normalisation des données de sortie

Dans cet exemple les données y sont très petites et proches l'unes de l'autres . On peut alors essayer de normaliser des données pour améliorer le modèle avec:

scaler = preprocessing.StandardScaler().fit(y)
y = scaler.transform(y)

puis revenir dans l'échelle de départ avec:

y = scaler.inverse_transform(y)

Code complet:

x = np.arange(0.0,12.0,1.0)
x = x[:, np.newaxis]

y = np.array([0.9995577,  0.999717,   0.9997348,  0.99975765, 0.99978703, 0.99980724, 0.9998182,  0.99982077, 0.99981844, 0.99981105, 0.99980015, 0.9997869 ])
y = y[:, np.newaxis]

scaler = preprocessing.StandardScaler().fit(y)
y = scaler.transform(y)

kernel = C(1.0, (0.1, 10.0)) * RBF([0.1], (1e-2, 1e2))

gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=20)

mymodel = gp.fit(x,y)

fig = figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')

y = scaler.inverse_transform(y)

plt.scatter(x,y)

x = np.arange(0,11.1,0.1)
x = x[:, np.newaxis]

y = mymodel.predict(x)

y = scaler.inverse_transform(y)

plt.plot(x,y,color='red')

plt.ylim(np.min(y)-0.00001,np.max(y)+0.00001)

plt.grid()

plt.title(r'Gaussian Processes (without target data scaling)')
plt.xlabel('x')
plt.ylabel('y')

plt.savefig("gp_with_scaling_target.png", bbox_inches='tight')

plt.show()

Impact de la normalisation des données de sortie pour une régression non linéaire  avec les processus Gaussien en python avec scikit-learn ?
Impact de la normalisation des données de sortie pour une régression non linéaire avec les processus Gaussien en python avec scikit-learn ?

Références

Image

of