I'm trying to fit a GP using a GaussianProcessRegressor, and I notice that my hyperparameters are still at their initial values. I did some stepping in gpr.py, but wasn't able to pinpoint the exact reason for this. Prediction with the initial values yields a zero line.
My data consists 5400 samples, each having 12 features, mapped to a single output variable. Even though the design might not be that well, I still would expect some learning.
Required files:
import pandas as pd
import numpy as np
import time
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel,WhiteKernel
designmatrix = pd.read_csv('features.txt', index_col = 0)
y = pd.read_csv('output.txt', header=None, index_col = 0)
# The RBF kernel is a stationary kernel. It is also known as the “squared exponential” kernel.
# It is parameterized by a length-scale parameter length_scale>0, which can either be a scalar (isotropic variant of the kernel)
# or a vector with the same number of dimensions as the inputs X (anisotropic variant of the kernel).
#
# The ConstantKernel can be used as part of a product-kernel where it scales the magnitude of the other factor (kernel) or as
# part of a sum-kernel, where it modifies the mean of the Gaussian process.
#
# The main use-case of the White kernel is as part of a sum-kernel where it explains the noise-component of the signal.
# Tuning its parameter corresponds to estimating the noise-level: k(x_1, x_2) = noise_level if x_1 == x_2 else 0
kernel = ConstantKernel(0.1, (1e-23, 1e5)) *
RBF(0.1*np.ones(designmatrix.shape[1]), (1e-23, 1e10) ) + WhiteKernel(0.1, (1e-23, 1e5))
gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=0)
print('Training')
t = time.time()
gp = gp.fit(designmatrix, y)
elapsed = time.time() - t
print(elapsed)
score = gp.score(designmatrix, y)
print(score)
print("initial params")
params = gp.get_params()
print(params)
print("learned kernel params")
print(gp.kernel_.get_params())
The result is the following:
initial params
{'alpha': 1e-10, 'copy_X_train': True, 'kernel__k1': 1**2, 'kernel__k2': RBF(len
gth_scale=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), 'kernel__k1__constant_value': 1
.0, 'kernel__k1__constant_value_bounds': (1e-05, 100000.0), 'kernel__k2__length_
scale': array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]), 'ke
rnel__k2__length_scale_bounds': (1e-05, 100000.0), 'kernel': 1**2 * RBF(length_s
cale=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), 'n_restarts_optimizer': 0, 'normaliz
e_y': False, 'optimizer': 'fmin_l_bfgs_b', 'random_state': None}
learned kernel params
{'k1': 1**2, 'k2': RBF(length_scale=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]), 'k1__
constant_value': 1.0, 'k1__constant_value_bounds': (1e-05, 100000.0), 'k2__lengt
h_scale': array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]), '
k2__length_scale_bounds': (1e-05, 100000.0)}
So, the kernel parameters are unchanged...
Is there a way to check for warnings?
Am I doing something wrong, or is there something I could check?
Any help would be really appreciated...
Ben
print("initial params\n") print(gp.kernel.get_params()) gp.fit(X, y) print("\nlearned kernel params") print(gp.kernel_.get_params())Sorry for the hideous formatting, but I don't have an answer yet!get_params()returns only the hyper-parameters of the classification, not the learned attributes. Hyper-parameters are not changed. See the documentation underattributessection to know what will be changed.kernel_(mind the underscore) attribute does contain the optimized hyperparameters for the standard examplesthetaandbounds. See this for examplegp.kernel_.get_params():)