sklearn scikit method learn fit biblioteca python regression gaussian

python - scikit - sklearn documentation



¿Cómo usar correctamente el Proceso Gaussiano de scikit-learn para una entrada 2D, regresión de salida 1D? (2)

Antes de publicar hice muchas búsquedas y encontré esta pregunta que podría ser exactamente mi problema. Sin embargo, intenté lo que se propone en la respuesta, pero desafortunadamente esto no lo solucionó, y no pude agregar un comentario para solicitar una explicación adicional, ya que soy un miembro nuevo aquí.

De todos modos, quiero usar los procesos gaussianos con scikit-learn en Python en un caso simple pero real para comenzar (utilizando los ejemplos proporcionados en la documentación de scikit-learn). Tengo un conjunto de entrada 2D (8 parejas de 2 parámetros) llamado X. Tengo 8 salidas correspondientes, reunidas en la matriz 1D y .

# Inputs: 8 points X = np.array([[p1, q1],[p2, q2],[p3, q3],[p4, q4],[p5, q5],[p6, q6],[p7, q7],[p8, q8]]) # Observations: 8 couples y = np.array([r1,r2,r3,r4,r5,r6,r7,r8])

Definí un espacio de prueba de entrada x :

# Input space x1 = np.linspace(x1min, x1max) #p x2 = np.linspace(x2min, x2max) #q x = (np.array([x1, x2])).T

Luego hago una instancia del modelo de GP, lo adapto a mis datos de entrenamiento (X, y) y hago la predicción 1D y_pred en mi espacio de entrada x :

from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C kernel = C(1.0, (1e-3, 1e3)) * RBF([5,5], (1e-2, 1e2)) gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=15) gp.fit(X, y) y_pred, MSE = gp.predict(x, return_std=True)

Y luego hago una trama 3D:

fig = pl.figure() ax = fig.add_subplot(111, projection=''3d'') Xp, Yp = np.meshgrid(x1, x2) Zp = np.reshape(y_pred,50) surf = ax.plot_surface(Xp, Yp, Zp, rstride=1, cstride=1, cmap=cm.jet, linewidth=0, antialiased=False) pl.show()

Esto es lo que obtengo:

Cuando modifico los parámetros del kernel obtengo algo como esto, similar a lo que obtuvo el póster que mencioné anteriormente:

Estas parcelas ni siquiera coinciden con la observación de los puntos de entrenamiento originales (la respuesta más baja se obtiene para [65.1,37] y la más alta para [92.3,54]).

Soy bastante nuevo en GPs en 2D (también comenzó Python no hace mucho), así que creo que me estoy perdiendo algo aquí ... Cualquier respuesta sería útil y muy apreciada, ¡gracias!


Estás usando dos características para predecir una tercera. En lugar de una gráfica 3D como plot_surface , generalmente es más claro si utiliza una gráfica 2D que puede mostrar información sobre una tercera dimensión, como hist2d o pcolormesh . Aquí hay un ejemplo completo usando datos / código similar al de la pregunta:

from itertools import product import numpy as np from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C X = np.array([[0,0],[2,0],[4,0],[6,0],[8,0],[10,0],[12,0],[14,0],[16,0],[0,2], [2,2],[4,2],[6,2],[8,2],[10,2],[12,2],[14,2],[16,2]]) y = np.array([-54,-60,-62,-64,-66,-68,-70,-72,-74,-60,-62,-64,-66, -68,-70,-72,-74,-76]) # Input space x1 = np.linspace(X[:,0].min(), X[:,0].max()) #p x2 = np.linspace(X[:,1].min(), X[:,1].max()) #q x = (np.array([x1, x2])).T kernel = C(1.0, (1e-3, 1e3)) * RBF([5,5], (1e-2, 1e2)) gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=15) gp.fit(X, y) x1x2 = np.array(list(product(x1, x2))) y_pred, MSE = gp.predict(x1x2, return_std=True) X0p, X1p = x1x2[:,0].reshape(50,50), x1x2[:,1].reshape(50,50) Zp = np.reshape(y_pred,(50,50)) # alternative way to generate equivalent X0p, X1p, Zp # X0p, X1p = np.meshgrid(x1, x2) # Zp = [gp.predict([(X0p[i, j], X1p[i, j]) for i in range(X0p.shape[0])]) for j in range(X0p.shape[1])] # Zp = np.array(Zp).T fig = plt.figure(figsize=(10,8)) ax = fig.add_subplot(111) ax.pcolormesh(X0p, X1p, Zp) plt.show()

Salida:

Un poco simple, pero también lo eran mis datos de ejemplo. En general, no debe esperar obtener resultados particularmente interesantes con estos pocos puntos de datos.

Además, si desea el trazado de superficie, simplemente puede reemplazar la línea pcolormesh con lo que originalmente tenía (más o menos):

ax = fig.add_subplot(111, projection=''3d'') surf = ax.plot_surface(X0p, X1p, Zp, rstride=1, cstride=1, cmap=''jet'', linewidth=0, antialiased=False)

Salida:


También soy bastante nuevo utilizando el proceso gaussiano scikit-learn. Pero después de un poco de esfuerzo, logré implementar una regresión del proceso gaussiano tridimensional con éxito. Hay muchos ejemplos de regresión 1-d pero nada en dimensiones de entrada más altas.

Quizás puedas mostrar los valores que estás usando.

Encontré que a veces el formato en el que se envían las entradas puede generar algunos problemas. Intente formatear la entrada X como:

X = np.array([param1, param2]).T

y formatea la salida como:

gp.fit(X, y.reshape(-1,1))

Además, como entendí, la implementación asume una función media m = 0. Si la salida que está tratando de retroceder presenta un valor promedio que difiere significativamente de 0, debe normalizarlo (eso probablemente resolverá su problema). Estandarizar el espacio de parámetros también ayudará.