Achieving Causal Fairness In Machine Learning