As I understand it, you fit() with training, then do parameter tuning with validation and the best parameter tuned model is used on test.
Now I'm still a little confused as to why we don't just fit() then do hyperparameter tuning with the test set (best-tuned model wins, no need for test). Why would calling predict() on a model cause it to update its weights and overfit?