By the time a telecom customer cancels, the decision was made weeks earlier. I built a supervised ML platform over 250K+ customer records that surfaces the signals ahead of the cancellation — turning retention from a reaction into a plan.
The signals that predict churn — declining usage, billing friction, a rising count of support contacts — were all being captured. They just lived in separate enterprise systems that never spoke to each other.
Without a unified view, retention teams learned a customer was leaving when the cancellation arrived. There was no ranked list of who was at risk and no evidence base for deciding where to spend retention effort.
The task was to join those systems into a single modeling substrate and produce something an account team could act on: a reliable, ranked view of at-risk customers.
Most of the accuracy gain came from the pipeline, not the algorithm. Cleaning and unification did more work than any model swap.
Churn datasets are imbalanced — most customers stay. A model that predicts "no churn" for everyone scores well on accuracy and is completely useless.
Model selection was driven by precision, recall, and F1 read together, with confusion matrices making the trade-off explicit: every gain in recall catches more real churners but spends retention budget on customers who were never going to leave. Cross-validation kept those estimates honest across data splits rather than fitting a favourable one.
Prediction accuracy improved 15%, preprocessing time dropped 30%, and real-time scoring through the FastAPI service returned results 20% faster — fast enough to surface risk inside existing workflows instead of a monthly batch report.
I stayed with the system after launch, working with data engineering and business teams to monitor production performance, maintain the Linux-based ML environments, and keep improving the feature pipelines across Agile cycles.