DEV Community

RWaltz Software
RWaltz Software

Posted on

Machine Learning for Customer Churn Prediction: What Actually Works

Some of your customers are leaving because you called them

A retention call reminds someone their contract is ending. It prompts a price comparison they had not thought to run. It reopens a complaint they had let go. For a slice of your base, being contacted is what triggers the exit.

That group sits on the same list as everyone you intend to save, and a model ranked by churn probability cannot separate them out. This is the flaw at the centre of most churn programmes, and it is not a modelling error. It is a mismatch between the question asked and the question that matters.

The top of your list contains four different people

Rank customers by likelihood of leaving and the top decile mixes four groups sharing nothing but a high score.

Lost causes have already decided and often already signed elsewhere. They score highly and cannot be saved, so the spend is wasted.

Sure things would have renewed anyway, scoring highly for incidental reasons: a billing query, a usage dip, a support contact. Treating them converts full margin customers into discounted ones for no gain.

Persuadables are genuinely at risk and genuinely responsive. They are the only group that pays back.

Sleeping dogs are the group above, made worse by contact.

A probability model ranks all four identically. It was never asked about responsiveness; it was asked who leaves.

Model the difference, not the outcome

The quantity that matters is the change in churn probability caused by the intervention. Learning it requires randomised treatment, because the difference between treated and untreated outcomes cannot be observed in data where a model assigned the treatment.

Two honest caveats, because uplift work is usually oversold. Estimating a difference between two small probabilities is noisier than estimating either one, so it needs more data and more patience. And an uplift ranked list looks unimpressive, because the customers at the top often have moderate churn scores. Someone will ask why the highest risk customers are not being contacted, and you need that answer before the first campaign.

A workable interim step: keep the probability ranked list, randomise treatment within it, and measure the effect by decile. That reveals quickly whether the top of your list responds at all. Frequently it does not, and that finding is worth more than another modelling cycle.

Separate involuntary churn first

A meaningful share of subscription cancellations are involuntary: an expired card, a failed recurring payment, a bank decline. Those customers did not decide to leave.

Leaving them in the training data corrupts the model, since features predicting a card expiry have nothing to do with dissatisfaction. It also conceals an easier win: better retry logic, updating card details before expiry, pre dunning notices and alternative payment methods recover customers with no model involved. If involuntary churn is a large share of your total, fix the payments path first.

The engineering that decides if the model is real

A churn model with a suspiciously strong validation score is almost always leaking. The recurring sources:

Outcome encoding features: cancellation related tickets, a retention offer flag, a downgrade logged inside the cancellation flow, an account status field updated at churn.
Time travel: features computed from data that did not exist at prediction time, usually from joining current state tables instead of reconstructing history.
Aggregates spanning the outcome: monthly usage averaged over a window that includes the final partial month.

The defence is point in time correctness: every feature reconstructed as it stood on the prediction date, using as of joins against historical snapshots. This is unglamorous data engineering, it consumes a legitimate share of the project, and skipping it produces a model that validates beautifully and fails in production. That pattern is also the fastest way to lose confidence in the whole programme.

Metrics that survive contact with a budget

Accuracy is useless on an imbalanced problem, since predicting that nobody leaves scores well. Report instead:

Lift at your actual treatment capacity, the number your team and offer budget can handle, not the cut off that flatters the model
Calibration rather than ranking alone, if you compute expected value, because offer economics need probabilities that mean something
Incremental revenue retained, net of offer cost, the only number the business should judge
Performance by segment, because a model can look strong overall and be useless for new customers, who churn most and have the sparsest history
Give the agent a reason, not a score

A list of identifiers and probabilities produces one behaviour: a generic discount. That is the most expensive intervention available and often the least effective.

Attach a reason in the language of the person doing the work, and map reasons to a playbook. A customer flagged after a billing spike needs the bill explained. One flagged after an unresolved support case needs the case resolved. Money is the right answer far less often than it gets used, and it is what a bare score always produces. That constrains model choice, since reason generation has to be reliable enough to act on rather than trusted because a library produced it.

Protect the holdout or stop claiming results

Treated customers stay at some rate, the rate looks reasonable, and the programme gets declared a success. Most of those customers would have stayed anyway.

A randomised group held back from treatment is the only way to separate programme effect from natural retention. It costs a small amount of churn and it is not optional. There will be pressure to treat everyone, and the moment the holdout disappears the programme becomes unfalsifiable. Re randomise periodically rather than leaving the same customers untreated indefinitely.

When not to build a model at all
Involuntary churn is a large share of the total. Fix payments first.
There is no capacity or budget to treat anyone. A model then produces a report.
Churn has a known cause, such as a service failure or an uncompetitive price in one segment. Fix the cause rather than paying to have it confirmed.
A simple rule using tenure, usage decline and support contacts captures most of the available lift. That is explainable, cheap to operate, and a legitimate permanent answer.

To be direct about our own field: this is a data quality and experimentation problem. A distributed ledger contributes nothing to it, and any proposal combining the two deserves examining for whether it solves anything.

What you should own when the work is done

If someone else builds this for you, the deliverable is not a model file. It is the feature definitions, the point in time pipelines, the experiment design and its logs, the model artefacts and a record of what was tried and rejected.

The same build to own principle applies here as to software. A model you cannot retrain, revalidate or explain without the original supplier is a dependency inside a commercial process, and it will need retraining sooner than anyone expects.

RWaltz is a blockchain and enterprise software development company building custom smart contracts, dApps and tokenization platforms that integrate with existing business systems. We work to a build to own model: clients hold their keys, repositories and intellectual property, engagements are scoped honestly including the cases where a simpler approach is the better answer, and review is treated as continuous rather than a single sign off.

📖 Read the full blog: https://www.rwaltz.com/blogs/machine-learning-for-customer-churn-prediction-what-actually-works

Connect with RWaltz:

LinkedIn: https://www.linkedin.com/company/rwaltzsoftware
X (Twitter): https://twitter.com/rwaltzsoftware
Facebook: https://www.facebook.com/RWaltz-Software-PvtLtd-255590135349493
Telegram: https://t.me/RWaltzCrypto
GitHub: https://github.com/rwaltzsoftware
Clutch: https://clutch.co/profile/rwaltz-software
Website: https://www.rwaltz.com

Top comments (0)