首页 文章

SKlearn:高斯过程回归在学习过程中没有改变

提问于
浏览
2

我正在尝试使用 GaussianProcessRegressor 适合GP,我注意到我的超参数仍处于初始值 . 我在gpr.py中做了一些踩踏,但是无法找到确切的原因 . 使用初始值进行预测会产生零线 .

我的数据包含5400个样本,每个样本有12个特征,映射到单个输出变量 . 即使设计可能不是那么好,我仍然期待一些学习 .

所需文件:

features.txt

output.txt

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())

结果如下:

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)}

所以,内核参数不变......

  • 有没有办法检查警告?

  • 我做错了什么,或者有什么我可以检查的?

任何帮助将非常感激...

1 回答

  • 3

    NOT AN ANSWER (YET)

    Begin Note

    对于SO问题,数据太大,我们测试您的问题需要很长时间 . 我已将您的代码更改为仅包含每个文件的前600行 . 你粘贴在这里的方式代码也没有运行,我已经解决了这个问题 .

    End Note

    使用 python 3.6.4scikit-learn==0.19.1numpy==1.14.2 .

    正如您在 n_restarts_optimizer 的文档中看到的那样,如果要优化内核超参数,则需要将其大于0 .

    n_restarts_optimizer:int,optional(默认值:0)
    用于查找内核的优化程序的重新启动次数
    最大化对数边际可能性的参数 . 第一次运行
    优化程序的执行是从内核的初始参数执行的,
    来自thetas的剩余部分(如果有的话)随机采样对数均匀
    从允许的theta值的空间 . 如果大于0,则全部为界限
    必须是有限的 . 请注意,n_restarts_optimizer == 0表示一个
    执行运行 .

    因此,在代码中将值从 0 更改为 2 会产生以下输出:

    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).iloc[0:600,]
    y = pd.read_csv('output.txt', header=None, index_col = 0).iloc[0:600,]
    
    # 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=2)
    
    print("initial params")
    params = gp.get_params()
    print(params)
    
    print('Training')
    t = time.time()
    gp = gp.fit(designmatrix, y)
    elapsed = time.time() - t
    print(elapsed)
    
    score = gp.score(designmatrix, y)
    print(score)
    
    print("learned kernel params")
    print(gp.kernel_.get_params())
    

    并输出:

    initial params
    {'alpha': 1e-10, 'copy_X_train': True, 'kernel__k1': 0.316**2 * RBF(length_scale=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]), 'kernel__k2': WhiteKernel(noise_level=0.1), 'kernel__k1__k1': 0.316**2, 'kernel__k1__k2': RBF(length_scale=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]), 'kernel__k1__k1__constant_value': 0.1, 'kernel__k1__k1__constant_value_bounds': (1e-23, 100000.0), 'kernel__k1__k2__length_scale': array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]), 'kernel__k1__k2__length_scale_bounds': (1e-23, 10000000000.0), 'kernel__k2__noise_level': 0.1, 'kernel__k2__noise_level_bounds': (1e-23, 100000.0), 'kernel': 0.316**2 * RBF(length_scale=[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]) + WhiteKernel(noise_level=0.1), 'n_restarts_optimizer': 2, 'normalize_y': False, 'optimizer': 'fmin_l_bfgs_b', 'random_state': None}
    Training
    3.9108407497406006
    1.0
    learned kernel params
    {'k1': 20.3**2 * RBF(length_scale=[0.00289, 9.29e-15, 8.81e-20, 0.00165, 2.7e+08, 3.2e+06, 0.233, 5.62e+07, 8.78e+07, 0.0169, 4.88e-21, 3.23e-20]), 'k2': WhiteKernel(noise_level=2.17e-13), 'k1__k1': 20.3**2, 'k1__k2': RBF(length_scale=[0.00289, 9.29e-15, 8.81e-20, 0.00165, 2.7e+08, 3.2e+06, 0.233, 5.62e+07, 8.78e+07, 0.0169, 4.88e-21, 3.23e-20]), 'k1__k1__constant_value': 411.28699807005, 'k1__k1__constant_value_bounds': (1e-23, 100000.0), 'k1__k2__length_scale': array([2.88935323e-03, 9.29401433e-15, 8.81112330e-20, 1.64832813e-03,
           2.70454686e+08, 3.20194179e+06, 2.32646715e-01, 5.62487948e+07,
           8.77636837e+07, 1.68642019e-02, 4.88384874e-21, 3.22536538e-20]), 'k1__k2__length_scale_bounds': (1e-23, 10000000000.0), 'k2__noise_level': 2.171274720012903e-13, 'k2__noise_level_bounds': (1e-23, 100000.0)}
    

    你可以编辑你的问题,以便你的观察可以复制吗?

相关问题