Unify predict and fit interfaces, as well as model interface
Currently, in the metrics and algorithm interface, there's a few sanity checks and preprocessing steps we implemented in the base class that you have to remember to apply in the child classes. This is bad practice.
We should unify the interface so that the parent method performs these steps and calls a "hidden" child method to do the actual processing.