hugiml‑core · card issuer · collections

Spot who's about to miss a payment -- and why

Build a model straight from your cardholder file, tune it for the recall your collections team needs, and trace any single flag back to the exact repayment pattern behind it.

cardholder file: 30000 accounts · 23 attributesengine: hugiml-core
01

Load the cardholder file

A profile comes back immediately, before any modeling starts.

Q
You

This is our full cardholder file -- limit, demographics, six months of billing and payment history. Who's likely to default next month?

A
Assistant

Loaded: 30000 accounts, 23 attributes. No missing values. I'll work from a balanced 8000-account sample for this session so each step stays quick.

22%defaulted

Share of accounts that missed their payment the following month, across the full 30000-account file.

02

Build a model

A few rule-set sizes get compared before anything is finalized.

Q
You

Build something collections can act on without needing a data scientist to interpret it.

A
Assistant

Repayment history alone, one column at a time, was a weak signal here -- pairing two months of repayment status together did much better, so that's the version I compared:

0.6918 rules0.70812 rules0.70716 rules

12 paired-month rules score about as well as 16 -- no reason to carry the extra four.

rules12
held-out AUC0.708
accuracy0.822

Built -- and every one of the rules turned out to involve repayment status across two consecutive months, not bill or payment amounts.

03

Tune for collections' priority

Say what trade-off matters operationally -- the comparison runs itself.

Q
You

We have outreach capacity to spare this month. I'd rather flag too many accounts than miss real defaults.

A
Assistant

I compared four versions, weighting "will default" more heavily rather than adding more rules:

base-12wide-16cw2cw3
recallprecision

cw3 catches 0.509 of defaults instead of 0.310, at the cost of precision dropping from 0.729 to 0.540.

I've made that one active. reversible

04

Plain-language summary

A restatement of the model's own readout.

Q
You

What's actually driving this -- in plain terms?

A
Assistant

It isn't any single month of being late -- it's the combination across two months. The strongest rule is PAY_0=[2,8), PAY_3=[0,2) (coefficient +1.829).

AUC (tuned)0.707
catch rate0.509
precision0.540
active rules12
05

Score this month's accounts

A table ready to hand straight to collections.

Q
You

Score three accounts from this billing cycle.

A
Assistant
predict_proba() · 3 accounts
accountlimitagePAY_0trueP(default)flag
#2658880000552default0.926priority outreach
#2392820000220no default0.321routine
#25581180000311no default0.310routine

All three match what actually happened the following month.

06

Rule analysis

Every rule behind the active model, ranked by how much it moves the score.

Q
You

Show me all 12, ranked.

A
Assistant
0PAY_0=[2,8), PAY_3=[0,2)PAY_2=[2,7)PAY_3=[2,8), PAY_4=[0,7)PAY_0=[2,8), PAY_3=[2,8)PAY_2=[2,7), PAY_4=[0,7)PAY_0=[2,8), PAY_2=[2,7)PAY_0=[2,8), PAY_5=[0,7)PAY_3=[2,8), PAY_2=[2,7)PAY_3=[2,8), PAY_5=[0,7)PAY_0=[2,8), PAY_4=[0,7)PAY_3=[2,8)PAY_2=[2,7), PAY_5=[0,7)
pulls toward defaultpulls toward no default

Every rule the model kept is a combination of repayment status across two billing cycles.

07

Explain a flag

For any single account, the exact arithmetic behind the score.

Q
You

Walk me through account #26588 -- why 0.926?

A
Assistant

7 of the 12 rules are active here. Running the combination in order of size:

0-0.748baseline+1.829PAY_0=[2,8), PAY_3=[0,2)+1.653PAY_2=[2,7)-0.581PAY_2=[2,7), PAY_4=[0,7)-0.566PAY_0=[2,8), PAY_2=[2,7)+0.512PAY_0=[2,8), PAY_5=[0,7)+0.326PAY_0=[2,8), PAY_4=[0,7)+0.102PAY_2=[2,7), PAY_5=[0,7)+2.529logit92.6%P(default)

Some active rules pull the score down; the strongest ones win out.

08

Hand off to risk operations

Trim to a shorter rule set if needed, with a logged reason for every change.

Q
You

Risk ops wants this under 8 rules before it goes into the daily batch job. While you're trimming, can you also have it pull fresh bureau data automatically each month?

A
Assistant

Trimming the rule set is something I can do directly. Wiring in an automatic monthly data feed is a separate integration question -- that touches your data pipeline rather than the model. Here's the trim:

remove() → refit() → finalize()
removed (lowest |coefficient|):
  PAY_0=[2,8), PAY_4=[0,7)               coef=+0.3261
  PAY_2=[2,7), PAY_5=[0,7)               coef=+0.1024
  PAY_3=[2,8)                            coef=+0.2895
  PAY_3=[2,8), PAY_5=[0,7)               coef=-0.3429
AUCcatch rateprecision
beforeafter

AUC moves from 0.707 to 0.706; catch rate from 0.509 to 0.507.

Key findings from this session

Cardholder file · 8000-account session sample · 8-rule model

In short: repayment trajectory, not a single snapshot, is what actually predicts default here.

Where to go from here

The same conversation works on any file you bring -- just point at the table and describe what your team needs to act on.

"Rerun this on the full account file""Which segment got worse this quarter?""Export the rule list as a one-pager"