Since you are looking at a single iteration and expect a meaningful change my guess is that you aren't training for long enough. Q-learning can take very long, for many environments it takes millions of iterations.
I only have one good news... There is nothing wrong with your code. Neural networks tend to do that. Especially with a really complex function.
Increasing the amount of neurons will not decrease how the error is distributed.
There are better loss functions for each case but is not a really effective solution.
Neural networks are really good managing noise. ...
So generally, when you seperate your training data to 80%-20% then you fit method should get 2 x,y. better to call them x_train,y_train, x_val, y_val or something similar.
Now its important you do the split before entering the fit, and not do it for each epoch or something alike.
Once you do that and the fit method should be something like:
def fit(self, ...