El objeto ‘CompoundKernel’ no tiene el atributo ‘k1’ – error del kernel compuesto en el proceso gaussiano dentro del aprendizaje por conjunto.
Estoy tratando de utilizar un clasificador/regresor de GaussianProcess en un clasificador/regresor de bagging en conjunto. El kernel gaussiano funciona correctamente fuera del flujo de trabajo de conjunto, pero en cuanto se implementa en el modelo de conjunto (aquí bagging), genera un error relacionado con su kernel, indicando que el objeto ‘CompoundKernel’ no tiene el atributo ‘k1’. Generé el error usando el siguiente código más simple:
import numpy as np
import pandas as pd
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import CompoundKernel, WhiteKernel, RBF
from sklearn.ensemble import BaggingRegressor
X1 = np.random.exponential(range(0,10), size=10)
X2 = np.random.poisson(range(0,10), size=10)
y = np.random.normal(size=10)
df = pd.DataFrame()
df["X1"] = X1
df["X2"] = X2
df["y"] = y
df1 = df.iloc[:,0:2]
df2 = df.iloc[:,2]
kernel = CompoundKernel([WhiteKernel(noise_level=2), RBF(length_scale=3)])
gaus = GaussianProcessRegressor(kernel=kernel)
bag = BaggingRegressor(n_estimators=10, base_estimator=gaus)
bag.fit(df1, df2) # executing this line generates the error
Este es el error que se produce:
AttributeError Traceback (most recent call last)
<ipython-input-32-af2dcdf3f94c> in <module>
2 gaus = GaussianProcessRegressor(kernel=kernel)
3 bag = BaggingRegressor(n_estimators=10, base_estimator=gaus)
----> 4 bag.fit(df1, df2)
...
...
--> 542 k_dims = self.k1.n_dims
543 for i, kernel in enumerate(self.kernels):
544 kernel.theta = theta[i * k_dims:(i + 1) * k_dims]
AttributeError: 'CompoundKernel' object has no attribute 'k1'
Por favor, tenga en cuenta que cambiar el kernel compuesto a un solo kernel (por ejemplo, RBF) resuelve el problema, pero quiero usar un kernel híbrido en mi modelo. ¿Tiene alguna idea de cómo puedo manejar este problema?
davy.ai
Parece que hay un problema con la implementación de GaussianProcessRegressor en scikit-learn cuando se utiliza como un estimador base en un modelo de tipo BaggingRegressor. Específicamente, el error está relacionado con el acceso al atributo “k1” del objeto CompoundKernel utilizado en el estimador GaussianProcessRegressor.
Una posible solución alternativa para este problema podría ser envolver GaussianProcessRegressor dentro de un objeto Pipeline y utilizar este pipeline como estimador base en BaggingRegressor. De esta manera, el objeto pipeline puede manejar el objeto kernel y exponerlo a BaggingRegressor como un estimador regular.
Aquí tienes un ejemplo de cómo se puede hacer esto:
Esto debería permitirte utilizar CompoundKernel en BaggingRegressor sin ningún problema. Ten en cuenta que también puedes agregar otros pasos de preprocesamiento al pipeline si es necesario, como escalado o selección de características.
Alternativamente, también podrías probar a utilizar un modelo de conjunto diferente que admita estimadores personalizados con estructuras internas complejas, como GradientBoostingRegressor o StackingRegressor. Estos modelos podrían ser más adecuados para tu caso de uso, ya que te permiten construir modelos más complejos combinando múltiples estimadores.