Optimisation strategies for ensuring fairness in machine learning: with and without demographics