learn-entity-resolution-with-phoebe / Session 3 of 6
Learn Entity Resolution with Phoebe · Session 3 of 6

Fellegi-Sunter, and the band nobody implements

A similarity is not evidence until you know how often that field agrees for real matches and how often it agrees by chance. Those two numbers turn every comparison into a weight you can add up. And then comes the part the 1969 paper is precise about and almost every production system quietly drops: there are two thresholds, and the pairs in between are supposed to go to a human. Tonight the bench shows you two pairs scoring 0.84, one the same person and one not, and no cut that can tell them apart.

🟠 Hands-on Data engineers Anyone who has ever picked a match threshold 45 min
0-3 · Welcome 3-24 · Two probabilities, one weight 24-40 · Build-along: find the band 40-45 · Q&A
Part 0

Where we are

Session 2 produced numbers: this pair of names scores 0.94 on Jaro-Winkler, these addresses share three tokens of four. None of that says whether the pair is a match. A similarity of 0.94 on a surname means something quite different from 0.94 on a phone number, and the difference is measurable rather than a matter of taste.

Live = presented in the 45 minutes Self-study = the full depth, after class 🔍 Every diagram zooms

★ What you walk out with tonight. The two probabilities that turn a similarity into evidence, and why their ratio is the whole model. The arithmetic of a match weight, computed by hand on a real Meridian pair. And the reason a single threshold is not a simplification of Fellegi-Sunter but a departure from it.

LiveWhy the same similarity means different things4 min▶

Two records agree on the surname Smith. Two other records agree on the phone number 0422 909 118. Both are exact agreements, and they are worth wildly different amounts, for a reason that has nothing to do with the strings.

Lots of unrelated people are called Smith, so a surname agreement happens by chance reasonably often. Almost nobody shares a mobile number, so a phone agreement almost never happens by chance. The evidence a field provides depends on how surprising the agreement is, and that is an empirical property of your data rather than a judgement about the field.

Real world

In Meridian, two completely unrelated people are called Maria Gonzalez, and a father and son are both James Whitmore. Meanwhile every phone agreement in the file is a genuine link except one, where a father and son share a household landline. That asymmetry is the model in miniature: names agree by chance, phones almost do not, and the exception is instructive.

Self-studyWhere this comes from3 min▶

Fellegi, I.P. and Sunter, A.B., "A Theory for Record Linkage", Journal of the American Statistical Association, volume 64, number 328, 1969, pages 1183 to 1210. It formalises the approach Newcombe and colleagues published in Science ten years earlier, which session 1 covered.

It is worth reading for one reason beyond the model: it treats linkage as a decision problem with costs, not a classification problem with an accuracy score. The paper's central theorem is about minimising the amount of human review needed to hold two error rates below chosen bounds. That framing is what produces the three-way rule in Part 3, and it is the part that gets lost when the model is reimplemented as "score the pairs and pick a cutoff".

Part 1 · covers m, u and their ratio

Two probabilities per field, and only their ratio matters

8 min live

For each field you compare, Fellegi-Sunter asks two questions. Both are about frequencies you can count, and the answer to each is a probability between zero and one.

m - among pairs that ARE a match how often does this field agree anyway? low m means the field is dirty, not useless: people change surname, mistype, move house u - among pairs that are NOT a match how often does this field agree by chance? u is what makes a field powerful. A shared mobile is astonishing; a shared surname is not weight when the field agrees log2( m / u ) Phone: m .88, u .002 agreeing is worth +8.8 Name: m .92, u .02 agreeing is worth +5.5 Company: m .95, u .06 agreeing is worth only +4.0
🔍 Click to zoom - a high m does not make a field strong; a low u does
LiveThe counter-intuitive half: u does the work5 min▶

People reach for the field they trust, meaning the field that is usually filled in and usually correct. That instinct optimises m and ignores u, and u is where the discriminating power lives.

Company name in Meridian has an m of 0.95, which is excellent: when two records really are the same person, they almost always agree on the employer. It is also the weakest field in the model, because its u is 0.06 - plenty of unrelated people work at the same company. Agreement is worth only about +4.0. The phone number has a lower m of 0.88, because people change numbers, and yet agreement is worth +8.8, because its u is 0.002.

The practical version: a field is valuable in proportion to how much it would surprise you to see it agree between two strangers. That is why a national identifier is worth more than a name, and why "country" is worth almost nothing even though it is populated on every row and always correct.

LiveDisagreement carries evidence too4 min▶

A field that disagrees is not neutral, it is evidence against the pair, and its size follows the same logic:

  • Agreement adds log2(m / u).
  • Disagreement adds log2((1 - m) / (1 - u)), which is negative.

Notice what makes a disagreement expensive. Email in Meridian has an m of 0.55, because half of all true pairs have a work address on one record and a personal one on the other, so an email disagreement barely counts against a pair at about -1.2. Company has an m of 0.95, so a company disagreement is a real problem at about -4.2. A field where matches often disagree cannot punish you for disagreeing.

Missing values are a third case, and the honest treatment is to let them carry nothing at all. If one record has no email, that is neither agreement nor disagreement, so the field contributes zero rather than a penalty. The bench does exactly this, which is why Aisha Bello's two records still match on their other fields.

Self-studyWhere m and u come from in real work5 min▶

The table in the bench is a stand-in, and the page says so. In real work you get these numbers three ways:

  • Count u directly. It needs no labels at all. Take random pairs from your data, which are overwhelmingly non-matches, and count how often each field agrees. For a surname you can do better and use a frequency table, so that agreeing on Smith is worth less than agreeing on Okonkwo. Splink supports exactly this as term-frequency adjustment.
  • Estimate m from your labels. Among the pairs you labelled as matches in session 1, count how often each field agrees. Twenty labelled pairs gives a rough but usable number.
  • Estimate both with expectation maximisation. Fit the model without labels by treating match status as a latent variable. This is what Splink does by default, and it is why Splink can get started on unlabelled data. It is also why you should still hold labels back to check the result.

The full weight for a pair includes one more term, a prior for how common matches are at all: log2(lambda / (1 - lambda)). In Meridian 35 of 1,953 pairs match, so that term is about -5.7, and it is why a single agreeing field is not enough to call a match. One name agreement is +5.5 against a prior of -5.7, which lands just below zero. Two strangers agreeing on one field is exactly what you would expect to see.

Part 2 · covers adding the weights up

One pair, five fields, added by hand

6 min live

The weights sum. That is an assumption, not a fact, and it has a name: conditional independence given match status. It is usually slightly wrong and usually good enough, and knowing where it breaks is part of using the model well.

TERM SARAH WHITFIELD r13 vs r63 WEIGHT prior 35 of 1,953 pairs match -5.7 name Sarah Whitfield = Sarah Whitfield +5.5 phone 0422 909 118 on both, she kept her mobile +8.8 email work address vs personal fastmail -1.2 address Marlowe Street vs Ledbury Crescent, she moved -2.3 company Tessellate vs Kestrelbank, she changed job -4.2 total match weight same person, and only two fields say so 0.84 Barely positive. Part 3 shows a pair of different people that scores exactly the same.
🔍 Click to zoom - the arithmetic the bench performs on every pair
LiveWhere conditional independence breaks5 min▶

Summing the weights assumes that, once you know whether a pair is a match, the fields agree or disagree independently. Two places that fails, both visible in Meridian:

  • Address and postcode. If the street agrees the postcode almost certainly agrees, so counting both double-counts one piece of evidence and inflates the weight. Treat them as one comparison or accept the inflation knowingly.
  • Company and email domain. Sarah's email changed because her employer changed. Two disagreements, one underlying cause, counted twice against the pair. Her total of 0.84 is pulled down partly by double-counting a single life event.

The usual remedies are to combine correlated fields into one comparison, or to model the interaction explicitly. Splink lets you do the former easily and the latter with effort. What you should not do is add every column you have and assume more evidence is better; correlated fields make the model overconfident in both directions.

Part 3 · covers the three-way decision

Two thresholds, and a band that belongs to a human

7 min live

Here is the structural point. Fellegi and Sunter do not describe a cutoff. They describe an upper threshold above which a pair is a designated match, a lower threshold below which it is a designated non-match, and the region between them, which is sent for clerical review. Their central theorem is that this partition minimises the volume of human review for chosen error bounds.

Designated non-match below the lower threshold discard, no human needed Clerical review between the two thresholds a person decides these Designated match above the upper threshold merge, no human needed lower 0.5 upper 4.0 weight Sarah ~ Sarah weight 0.84 the SAME person, job change and move Whitmore ~ Whitmore weight 0.84 DIFFERENT people, father and son Identical weights. No cut separates them, so the band is not a compromise.
🔍 Click to zoom - the two pairs the bench cannot tell apart, and neither can you
LiveWhat one threshold costs you5 min▶

Because those two pairs score the same, a single cut has to get one of them wrong. The bench measures all three options over the whole file:

Decision rulePrecisionRecallF1MissedFalseTo a human
One cut, high (upper 4)100%94%0.971200
One cut, low (upper 0.5)97%97%0.971110
Two cuts, band 0.5 to 4100%94%0.971202

Both single cuts land on the same F1 of 0.971, and neither can do better, because the error is not a tuning failure. Move the cut down and you gain the true pair and buy a false merge. Move it up and you lose the true pair. That is the trade the band refuses to make.

And the band's price is tiny. Two pairs out of 1,953 go to a person. Those two minutes of human attention recover the real match and reject the father and son, taking the result to 100 percent precision and 100 percent recall - which neither single cut can reach at any threshold.

Real world

This is the part that gets dropped when a model becomes a pipeline. A review queue needs somebody to own it, an interface, and an agreed turnaround, and none of that fits in a nightly job. So the band gets collapsed to a single cutoff, the pipeline stops asking for help, and the father and son quietly become one customer with two addresses and a doubled lifetime value.

Self-studyChoosing the two thresholds on purpose5 min▶

Fellegi and Sunter derive the thresholds from error bounds rather than taste: you state the false-match rate and the false-non-match rate you are willing to accept, and the thresholds follow. In practice teams work backwards from two constraints instead, which is legitimate as long as it is deliberate:

  • The upper threshold is set by the cost of a wrong merge. Un-merging two customers after a year of shared history is expensive and sometimes impossible, so where merges are hard to reverse, set it high.
  • The lower threshold is set by review capacity. The band is only useful if somebody actually works it. A band containing 4 percent of a million-record file is 20,000 pairs a night, which nobody reviews, and an unworked queue is worse than a decision because it looks like control.
  • Both should be revisited when the data changes. A new source system with a different email convention shifts every email weight in the file.

One honest asymmetry worth stating to stakeholders: a missed match and a false merge are not equal errors. A missed match leaves two customer records where there should be one, which is a known and fixable annoyance. A false merge fuses two real people's data, which may be a privacy incident and is much harder to unpick. Session 6 returns to this.

Build-along

Find the band, then try to beat it

★ 16 min · everyone builds

The bench scores every candidate pair with the arithmetic from Part 2 and applies the three-way rule from Part 3. Every figure it shows is computed against the labels as you move a control.

Press A sensible configuration. All five fields on, normalisation on, thresholds at 0.5 and 4.0. Read the board: precision 100 percent, recall 94 percent, and 2 pairs in the clerical band.

Scroll the pair list to the two rows marked review. One is Sarah Whitfield against Sarah Whitfield, one is James Whitmore against James Whitmore. Both weigh 0.84. One is the same person and one is two people.

Now untick Keep the clerical band and drag the upper threshold down to about 0.5 so the band's pairs become matches. Recall goes up and a false match appears. You just merged a father and his son.

Put the upper threshold back to 4.0, still with no band. Precision returns to 100 percent and you are back to missing a real pair. Try every threshold you like: F1 does not beat 0.971 either way.

Turn the band back on. Two pairs go to a human, and a human can read the addresses and see that one Whitmore works at Caldera and the other at Brightmoor. That is two minutes of work for the last three percent of recall.

Now break the model deliberately. Turn every field off except company. Watch what a field with a u of 0.06 does on its own, and note that its m of 0.95 does not save it.

Finally turn on Transitive closure in the Clustering box and watch the cluster count. It reports 33 against 32 real people, which is the wrong answer in the less obvious direction. Session 5 takes that apart.

The one number on that widget that is not measured is the m and u table, which stands in for what expectation maximisation would estimate on your own corpus. Everything computed from it - every weight, every verdict, precision, recall - is real arithmetic over the real labels. Say which is which when you show a tool's output to anyone.

Homework

Before session 4

30 min
Check yourself

Three questions

Company name in Meridian has m of 0.95 and u of 0.06, and phone has m of 0.88 and u of 0.002. Which field is stronger evidence when it agrees, and why?

The weight is log2(m/u), so u dominates. Phone agreement is worth about +8.8 and company only about +4.0, even though company agrees more reliably among true matches. A field is valuable in proportion to how surprising its agreement would be between strangers.

Two Meridian pairs both score a match weight of 0.84, and exactly one of them is the same person. What does that establish about thresholds?

Identical weights mean any cutoff treats them identically, so one will be wrong whichever value you pick. Both single cuts measure F1 0.971 and neither does better. Re-estimating or adding fields does not help when the underlying data genuinely does not distinguish a father from his son.

Email in Meridian has an m of 0.55. What follows for a pair whose emails disagree?

Disagreement weight is log2((1-m)/(1-u)), so a low m makes disagreement cheap - about -1.2 for email. Nearly half of true pairs have a work address on one record and a personal one on the other, so an email disagreement is weak evidence. Compare company, where m is 0.95 and disagreement costs about -4.2.

Sources covered

What this session teaches, and where it came from

✓Fellegi and Sunter, A Theory for Record Linkage (JASA 64:328, 1969, 1183-1210)The m and u probabilities, the log-likelihood match weight, and the three-way decision with its clerical review region
✓The log2 formulation with a prior-odds termAs rendered in Splink's own theory documentation; the -5.7 prior for Meridian is computed from its 35 true pairs in 1,953
◐Expectation maximisation for estimating m and u without labelsNamed as what Splink does by default; the algorithm itself is not derived here
◐Term-frequency adjustment for common surnamesIntroduced as the better way to handle u on a name field; Splink implements it

Every fact on this page, and its verification tier, is recorded in the course's source map.

Session 3 cheat sheet · pin this

m and um = agrees among true matches. u = agrees among non-matches. Only their ratio matters.
The weightsAgree: log2(m/u). Disagree: log2((1-m)/(1-u)). Missing: zero, not a penalty.
u does the workCompany m .95 but u .06 is worth +4.0. Phone m .88 but u .002 is worth +8.8.
The priorlog2(lambda/(1-lambda)), about -5.7 here. One agreeing field alone does not clear it.
Two thresholdsUpper set by the cost of a wrong merge. Lower set by how many pairs a human can review.
0.84 twiceSarah and Sarah, Whitmore and Whitmore. Same weight, different answers. That is the band.