-
Notifications
You must be signed in to change notification settings - Fork 445
Description
🚀 Feature Request
I would like to submit a potential example notebook, based on my following work here:
https://colab.research.google.com/drive/1dOUHQzl3aQ8hz6QUtwRrXlQBGqZadQgG
(hopefully it is easy for others to run in Colab!)
The notebook details the use of a heteroskedastic GP in BoTorch. However, before finalizing the notebook and cleaning it up a bit, there are a few things that I believe could be changed to help improve the entire training process (also described in notebook comments). I apologize if this reads as many features requests/issues in one -- but I am happy to contribute pull requests and please let me know what you all think / if I am totally wrong about something. I can also open separate feature requests for each statement if you agree on the need.
Listed in roughly decreasing order of perceived importance.
- I would love to see the implementation of a
mll.model.predictive_posterior
function. Since themll.model.posterior(X_test).mvn.confidence_region()
function currently only gives the posterior for the function mean, this can be confusing to those who think they are getting the predictive posterior (as is shown in using confidence region with Gpytorch tutorials, for example). Currently, for simple models the predictive posterior is easy to get throughmll.likelihood(mll.model(X_test)).confidence_region()
. However, this does not work for theHeteroskedasticSingleTaskGP
model. For thisHeteroskedasticSingleTaskGP
model, I could only obtain the prediction intervals using the following code:
mll.eval()
with torch.no_grad():
posterior = mll.model.posterior(X_test)
predictive_noise = torch.exp(mll.model.likelihood.noise_covar.noise_model.posterior(X_test).mean)
# get standard deviation
predictive_noise_std = torch.sqrt(predictive_noise).squeeze(-1)
# fit posterior confidence
lower, upper = posterior.mvn.confidence_region()
# get posterior predictive confidence by adding noise from noise model
lower_predictive = lower - 2*predictive_noise_std
upper_predictive = upper + 2*predictive_noise_std
which is quite burdensome. (Note that the noise model of HeteroskedasticSingleTaskGP
currently returns the log
of the variance, thus the exponentiation. I believe this may be an error in the noise model.)
In summary, I believe a predictive_posterior
function is often what people are after and would be a nice complement to posterior
. Furthermore, it would be nice to standardize the methods of obtaining prediction intervals across tasks since the same method does not currently work for all models.
- I do believe there should probably be a HeteroskedasticGP class that merely accepts
train_x
,train_y
, and does not require the input oftrain_yvar
. This can get rather complicated, but a simple solution for now would be to initially create aSingleTaskGP
that is used to estimatetrain_Yvar
once trained. The observed variances could then be fed into the current implementation ofHeteroskedasticSingleTaskGP
along withtrain_x
,train_y
, as is done in the notebook. This is perhaps the more controversial of the feature requests.
Please let me know if you have any other comments on the notebook, and thanks for the library!