我试图用GaussianProcessRegressor来预测未知的值。
目标值通常在1000-10000之间。
由于它们不是0平均优先,所以我使用normalize_y = False设置模型,这是一个默认设置。
from sklearn.gaussian_process import GaussianProcessRegressor
gpr = GaussianProcessRegressor(kernel = RBF, random_state=0, alpha=1e-10, normalize_y = False)当我用探地雷达模型预测未知时,返回的std值不现实地太小,例如在0.1的范围内,这是预测值的0.001%。
当我将设置更改为normalize_y = True时,返回的std值更真实,大约为500。
有人能确切地解释一下normalize_y在这里做什么吗?如果我把它设置为真还是假的话?
发布于 2022-06-06 13:19:15
我在这里找到了最接近的答案:https://github.com/scikit-learn/scikit-learn/issues/15612
“好吧,我想我知道这里可能发生了什么。这有点棘手,但我认为没有一个内核有垂直长度尺度参数,所以内核(x,x)总是等于1。例如,K的所有对角线元素都等于1(在我们把脊线加进去之前)。
然后我们可以看到,预测的方差只能在0到1之间。例如,如果我们在远离训练数据的某个点预测(所以内核(X,x_new)是一个零向量),那么方差只是
sigma^2 =核(x_new,x_new) =1
我认为这里真正的问题是,先验是用于具有单位方差的数据,但是数据没有单位方差。解决办法是将数据规范化,使其在“进入”GP后具有单位方差,进行GP分析,然后在结束时再次“不规范”。代码已经自动删除平均值,所以我认为我们只需要在同一点除以标准差,它就可以工作了。
所以只需要多几句台词就行了!“
因此,更改内核的length_scale_bounds参数应该可以解决这个问题!
我希望这能帮助那些在我面临同样问题时来到这里的人!
https://stackoverflow.com/questions/69081951
复制相似问题