Evaluation from ground truth column
Evaluation when you have fully labelled data¶
In this example, our data contains a fully-populated ground-truth column called cluster that enables us to perform accuracy analysis of the final model
from splink import splink_datasets
from splink.internals.misc import show
df = splink_datasets.fake_1000
show(df, rows=5)
┌───────────┬────────────┬─────────┬────────────┬─────────┬─────────────────────────┬─────────┐
│ unique_id │ first_name │ surname │ dob │ city │ email │ cluster │
│ int64 │ varchar │ varchar │ date │ varchar │ varchar │ int64 │
├───────────┼────────────┼─────────┼────────────┼─────────┼─────────────────────────┼─────────┤
│ 0 │ Robert │ Alan │ 1971-06-24 │ NULL │ robert255@smith.net │ 0 │
│ 1 │ Robert │ Allen │ 1971-05-24 │ NULL │ roberta25@smith.net │ 0 │
│ 2 │ Rob │ Allen │ 1971-06-24 │ London │ roberta25@smith.net │ 0 │
│ 3 │ Robert │ Alen │ 1971-06-24 │ Lonon │ NULL │ 0 │
│ 4 │ Grace │ NULL │ 1997-04-26 │ Hull │ grace.kelly52@jones.com │ 1 │
└───────────┴────────────┴─────────┴────────────┴─────────┴─────────────────────────┴─────────┘
from splink import SettingsCreator, Linker, block_on, DuckDBAPI
import splink.comparison_library as cl
settings = SettingsCreator(
link_type="dedupe_only",
blocking_rules_to_generate_predictions=[
block_on("first_name"),
block_on("surname"),
block_on("dob"),
block_on("email"),
],
comparisons=[
cl.ForenameSurnameComparison("first_name", "surname"),
cl.DateOfBirthComparison(
"dob",
input_is_string=False,
),
cl.ExactMatch("city").configure(term_frequency_adjustments=True),
cl.EmailComparison("email"),
],
retain_intermediate_calculation_columns=True,
)
db_api = DuckDBAPI()
df_sdf = db_api.register(df)
linker = Linker(df_sdf, settings)
deterministic_rules = [
"l.first_name = r.first_name and levenshtein(r.dob::VARCHAR, l.dob::VARCHAR) <= 1",
"l.surname = r.surname and levenshtein(r.dob::VARCHAR, l.dob::VARCHAR) <= 1",
"l.first_name = r.first_name and levenshtein(r.surname, l.surname) <= 2",
"l.email = r.email",
]
linker.training.estimate_probability_two_random_records_match(
deterministic_rules, recall=0.7
)
Probability two random records match is estimated to be 0.00333.
This means that amongst all possible pairwise record comparisons, one in 300.13 are expected to match. With 499,500 total possible comparisons, we expect a total of around 1,664.29 matching pairs
linker.training.estimate_u_using_random_sampling(max_pairs=1e6, seed=5)
You are using the default value for `max_pairs`, which may be too small and thus lead to inaccurate estimates for your model's u-parameters. Consider increasing to 1e8 or 1e9, which will result in more accurate estimates, but with a longer run time.
----- Estimating u probabilities using random sampling -----
Estimating u with: max_pairs = 1,000,000, min_count_per_level = 100, num_chunks = 10
Estimating u for: first_name_surname (Comparison 1 of 4)
Running probe chunk (~1.00% of max_pairs)
Min u_count: 1 for comparison level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3)
Probe did not converge; restarting with normal chunking
Running chunk 1/10
Count of 7 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Running chunk 2/10
Count of 19 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Running chunk 3/10
Count of 28 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Running chunk 4/10
Count of 35 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Running chunk 5/10
Count of 39 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Running chunk 6/10
Count of 45 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Running chunk 7/10
Count of 56 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Running chunk 8/10
Count of 62 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Running chunk 9/10
Count of 70 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Running chunk 10/10
Count of 72 for level (Jaro-Winkler distance of first_name >= 0.88) AND (Jaro-Winkler distance of surname >= 0.88) (cvv=3). Chunk took 0.0 seconds.
Min u_count not hit, continuing.
Estimating u for: dob (Comparison 2 of 4)
Running probe chunk (~1.00% of max_pairs)
Min u_count: 7 for comparison level Levenshtein distance <= 1 (cvv=4)
Probe did not converge; restarting with normal chunking
Running chunk 1/10
Count of 70 for level Levenshtein distance <= 1 (cvv=4). Chunk took 0.1 seconds.
Min u_count not hit, continuing.
Running chunk 2/10
Count of 146 for level Levenshtein distance <= 1 (cvv=4). Chunk took 0.0 seconds.
Exiting early since min count of 146 exceeds min_count_per_level = 100
Estimating u for: city (Comparison 3 of 4)
Running probe chunk (~1.00% of max_pairs)
Min u_count: 166 for comparison level Exact match on city (cvv=1)
Exiting early since min count of 166 exceeds min_count_per_level = 100
Estimating u for: email (Comparison 4 of 4)
Running probe chunk (~1.00% of max_pairs)
Min u_count: 0 for comparison level Jaro-Winkler >0.88 on username (cvv=1)
Probe did not converge; restarting with normal chunking
Running chunk 1/10
Count of 12 for level Jaro-Winkler >0.88 on username (cvv=1). Chunk took 0.1 seconds.
Min u_count not hit, continuing.
Running chunk 2/10
Count of 32 for level Jaro-Winkler >0.88 on username (cvv=1). Chunk took 0.1 seconds.
Min u_count not hit, continuing.
Running chunk 3/10
Count of 41 for level Jaro-Winkler >0.88 on username (cvv=1). Chunk took 0.1 seconds.
Min u_count not hit, continuing.
Running chunk 4/10
Count of 57 for level Jaro-Winkler >0.88 on username (cvv=1). Chunk took 0.1 seconds.
Min u_count not hit, continuing.
Running chunk 5/10
Count of 81 for level Jaro-Winkler >0.88 on username (cvv=1). Chunk took 0.1 seconds.
Min u_count not hit, continuing.
Running chunk 6/10
Count of 90 for level Jaro-Winkler >0.88 on username (cvv=1). Chunk took 0.1 seconds.
Min u_count not hit, continuing.
Running chunk 7/10
Count of 109 for level Jaro-Winkler >0.88 on username (cvv=1). Chunk took 0.1 seconds.
Exiting early since min count of 109 exceeds min_count_per_level = 100
Estimated u probabilities using random sampling
Your model is not yet fully trained. Missing estimates for:
- first_name_surname (no m values are trained).
- dob (no m values are trained).
- city (no m values are trained).
- email (no m values are trained).
session_dob = linker.training.estimate_parameters_using_expectation_maximisation(
block_on("dob"), estimate_without_term_frequencies=True
)
session_email = linker.training.estimate_parameters_using_expectation_maximisation(
block_on("email"), estimate_without_term_frequencies=True
)
session_dob = linker.training.estimate_parameters_using_expectation_maximisation(
block_on("first_name", "surname"), estimate_without_term_frequencies=True
)
----- Starting EM training session -----
[EM sampling] max_pairs is None — no sampling will be applied
Estimating the m probabilities of the model by blocking on:
l."dob" = r."dob"
Parameter estimates will be made for the following comparison(s):
- first_name_surname
- city
- email
Parameter estimates cannot be made for the following comparison(s) since they are used in the blocking rules:
- dob
WARNING:
Level Jaro-Winkler >0.88 on username on comparison email not observed in dataset, unable to train m value
Iteration 1: Largest change in params was -0.749 in the m_probability of first_name_surname, level `(Exact match on first_name) AND (Exact match on surname)`
Iteration 2: Largest change in params was 0.2 in probability_two_random_records_match
Iteration 3: Largest change in params was 0.054 in probability_two_random_records_match
Iteration 4: Largest change in params was 0.019 in probability_two_random_records_match
Iteration 5: Largest change in params was 0.00733 in probability_two_random_records_match
Iteration 6: Largest change in params was 0.00291 in probability_two_random_records_match
Iteration 7: Largest change in params was 0.00117 in probability_two_random_records_match
Iteration 8: Largest change in params was 0.000469 in probability_two_random_records_match
Iteration 9: Largest change in params was 0.000189 in probability_two_random_records_match
Iteration 10: Largest change in params was 7.63e-05 in probability_two_random_records_match
EM converged after 10 iterations
m probability not trained for email - Jaro-Winkler >0.88 on username (comparison vector value: 1). This usually means the comparison level was never observed in the training data.
Your model is not yet fully trained. Missing estimates for:
- dob (no m values are trained).
- email (some m values are not trained).
----- Starting EM training session -----
[EM sampling] max_pairs is None — no sampling will be applied
Estimating the m probabilities of the model by blocking on:
l."email" = r."email"
Parameter estimates will be made for the following comparison(s):
- first_name_surname
- dob
- city
Parameter estimates cannot be made for the following comparison(s) since they are used in the blocking rules:
- email
Iteration 1: Largest change in params was -0.438 in the m_probability of dob, level `Exact match on date of birth`
Iteration 2: Largest change in params was 0.123 in probability_two_random_records_match
Iteration 3: Largest change in params was 0.0285 in probability_two_random_records_match
Iteration 4: Largest change in params was 0.00991 in probability_two_random_records_match
Iteration 5: Largest change in params was 0.00441 in probability_two_random_records_match
Iteration 6: Largest change in params was 0.00233 in probability_two_random_records_match
Iteration 7: Largest change in params was 0.00138 in probability_two_random_records_match
Iteration 8: Largest change in params was 0.000878 in probability_two_random_records_match
Iteration 9: Largest change in params was 0.000586 in probability_two_random_records_match
Iteration 10: Largest change in params was 0.000405 in probability_two_random_records_match
Iteration 11: Largest change in params was 0.000287 in probability_two_random_records_match
Iteration 12: Largest change in params was 0.000206 in probability_two_random_records_match
Iteration 13: Largest change in params was 0.00015 in probability_two_random_records_match
Iteration 14: Largest change in params was 0.000111 in probability_two_random_records_match
Iteration 15: Largest change in params was 8.2e-05 in probability_two_random_records_match
EM converged after 15 iterations
Your model is not yet fully trained. Missing estimates for:
- email (some m values are not trained).
----- Starting EM training session -----
[EM sampling] max_pairs is None — no sampling will be applied
Estimating the m probabilities of the model by blocking on:
(l."first_name" = r."first_name") AND (l."surname" = r."surname")
Parameter estimates will be made for the following comparison(s):
- dob
- city
- email
Parameter estimates cannot be made for the following comparison(s) since they are used in the blocking rules:
- first_name_surname
WARNING:
Level Jaro-Winkler >0.88 on username on comparison email not observed in dataset, unable to train m value
Iteration 1: Largest change in params was 0.474 in probability_two_random_records_match
Iteration 2: Largest change in params was 0.0446 in probability_two_random_records_match
Iteration 3: Largest change in params was 0.00746 in probability_two_random_records_match
Iteration 4: Largest change in params was 0.0013 in probability_two_random_records_match
Iteration 5: Largest change in params was 0.00025 in probability_two_random_records_match
Iteration 6: Largest change in params was 0.0012 in the m_probability of email, level `All other comparisons`
Iteration 7: Largest change in params was 0.0113 in the m_probability of email, level `All other comparisons`
Iteration 8: Largest change in params was 0.00693 in the m_probability of email, level `All other comparisons`
Iteration 9: Largest change in params was 0.00197 in probability_two_random_records_match
Iteration 10: Largest change in params was 0.000681 in probability_two_random_records_match
Iteration 11: Largest change in params was 0.000235 in probability_two_random_records_match
Iteration 12: Largest change in params was 8.17e-05 in probability_two_random_records_match
EM converged after 12 iterations
m probability not trained for email - Jaro-Winkler >0.88 on username (comparison vector value: 1). This usually means the comparison level was never observed in the training data.
Your model is not yet fully trained. Missing estimates for:
- email (some m values are not trained).
linker.evaluation.accuracy_analysis_from_labels_column(
"cluster", output_type="table"
).as_duckdbpyrelation().limit(5).show(max_width=10000)
Blocking time: 0.01 seconds
Predict time (post-blocking): 0.06 seconds
-- WARNING --
You have called predict(), but there are some parameter estimates which have neither been estimated or specified in your settings dictionary. To produce predictions the following untrained parameters will use default values.
Comparison: 'email':
m values not fully trained
┌─────────────────────┬───────────────────────┬───────────────────────┬────────┬──────────┬────────┬──────────┬────────┬────────┬──────────────────────┬────────────────────┬────────────────────┬────────────────────┬───────────────────────┬─────────────────────┬─────────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┬────────────────────┬─────────────────────┬────────────────────┬────────────────────┐
│ truth_threshold │ match_probability │ total_clerical_labels │ p │ n │ tp │ tn │ fp │ fn │ P_rate │ N_rate │ tp_rate │ tn_rate │ fp_rate │ fn_rate │ precision │ recall │ specificity │ npv │ accuracy │ f1 │ f2 │ f0_5 │ p4 │ phi │
│ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │ double │
├─────────────────────┼───────────────────────┼───────────────────────┼────────┼──────────┼────────┼──────────┼────────┼────────┼──────────────────────┼────────────────────┼────────────────────┼────────────────────┼───────────────────────┼─────────────────────┼─────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┼────────────────────┼─────────────────────┼────────────────────┼────────────────────┤
│ -17.80000026524067 │ 4.381916466936514e-06 │ 499500.0 │ 2031.0 │ 497469.0 │ 1650.0 │ 495130.0 │ 2339.0 │ 381.0 │ 0.004066066066066066 │ 0.9959339339339339 │ 0.8124076809453471 │ 0.9952981994857971 │ 0.0047018005142028954 │ 0.18759231905465287 │ 0.41363750313361747 │ 0.8124076809453471 │ 0.9952981994857971 │ 0.9992310967869533 │ 0.9945545545545545 │ 0.5481727574750831 │ 0.681086436060431 │ 0.45866459109356755 │ 0.7074664508208482 │ 0.5774741518035404 │
│ -17.700000263750553 │ 4.696420312114957e-06 │ 499500.0 │ 2031.0 │ 497469.0 │ 1650.0 │ 495225.0 │ 2244.0 │ 381.0 │ 0.004066066066066066 │ 0.9959339339339339 │ 0.8124076809453471 │ 0.9954891661590973 │ 0.004510833840902649 │ 0.18759231905465287 │ 0.423728813559322 │ 0.8124076809453471 │ 0.9954891661590973 │ 0.9992312441737994 │ 0.9947447447447447 │ 0.5569620253164557 │ 0.6864702945581628 │ 0.4685636394615778 │ 0.7147694968503172 │ 0.5845580356933797 │
│ -17.100000254809856 │ 7.118424873502875e-06 │ 499500.0 │ 2031.0 │ 497469.0 │ 1650.0 │ 495311.0 │ 2158.0 │ 381.0 │ 0.004066066066066066 │ 0.9959339339339339 │ 0.8124076809453471 │ 0.9956620412528218 │ 0.004337958747178216 │ 0.18759231905465287 │ 0.4332983193277311 │ 0.8124076809453471 │ 0.9956620412528218 │ 0.9992313775489619 │ 0.994916916916917 │ 0.5651652680253468 │ 0.6914180355346966 │ 0.47790071250651683 │ 0.7215119201499676 │ 0.5911972192065922 │
│ -17.00000025331974 │ 7.629334984424643e-06 │ 499500.0 │ 2031.0 │ 497469.0 │ 1650.0 │ 495354.0 │ 2115.0 │ 381.0 │ 0.004066066066066066 │ 0.9959339339339339 │ 0.8124076809453471 │ 0.995748478799684 │ 0.004251521200315999 │ 0.18759231905465287 │ 0.43824701195219123 │ 0.8124076809453471 │ 0.995748478799684 │ 0.9992314442191896 │ 0.995003003003003 │ 0.5693581780538303 │ 0.6939187484229119 │ 0.4827101983500088 │ 0.7249310558395574 │ 0.5946014708278546 │
│ -16.900000251829624 │ 8.176914304005986e-06 │ 499500.0 │ 2031.0 │ 497469.0 │ 1650.0 │ 495386.0 │ 2083.0 │ 381.0 │ 0.004066066066066066 │ 0.9959339339339339 │ 0.8124076809453471 │ 0.9958128044159535 │ 0.0041871955840464435 │ 0.18759231905465287 │ 0.44200375033485134 │ 0.8124076809453471 │ 0.9958128044159535 │ 0.9992314938267371 │ 0.995067067067067 │ 0.5725190839694656 │ 0.6957915155604284 │ 0.4863526498850439 │ 0.7274966332137337 │ 0.5971728084857775 │
└─────────────────────┴───────────────────────┴───────────────────────┴────────┴──────────┴────────┴──────────┴────────┴────────┴──────────────────────┴────────────────────┴────────────────────┴────────────────────┴───────────────────────┴─────────────────────┴─────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┴────────────────────┴─────────────────────┴────────────────────┴────────────────────┘
linker.evaluation.accuracy_analysis_from_labels_column("cluster", output_type="precision_recall")
Blocking time: 0.01 seconds
Predict time (post-blocking): 0.08 seconds
-- WARNING --
You have called predict(), but there are some parameter estimates which have neither been estimated or specified in your settings dictionary. To produce predictions the following untrained parameters will use default values.
Comparison: 'email':
m values not fully trained
linker.evaluation.accuracy_analysis_from_labels_column(
"cluster",
output_type="threshold_selection",
threshold_match_probability=0.5,
add_metrics=["f1"],
)
Blocking time: 0.01 seconds
Predict time (post-blocking): 0.07 seconds
-- WARNING --
You have called predict(), but there are some parameter estimates which have neither been estimated or specified in your settings dictionary. To produce predictions the following untrained parameters will use default values.
Comparison: 'email':
m values not fully trained
# Plot some false positives
linker.evaluation.prediction_errors_from_labels_column(
"cluster", include_false_negatives=True, include_false_positives=True
).as_duckdbpyrelation().limit(5).show(max_width=10000)
Blocking time: 0.01 seconds
Predict time (post-blocking): 0.06 seconds
-- WARNING --
You have called predict(), but there are some parameter estimates which have neither been estimated or specified in your settings dictionary. To produce predictions the following untrained parameters will use default values.
Comparison: 'email':
m values not fully trained
┌──────────────────────┬─────────────────────────┬─────────────────────┬──────────────────────┬─────────────┬─────────────┬──────────────┬──────────────┬───────────┬───────────┬──────────────────────────┬──────────────────────┬──────────────────────┬───────────────────────┬───────────────────────┬───────────────────────┬──────────────────────────────┬────────────┬────────────┬───────────┬──────────────────────┬────────────┬─────────┬────────────┬──────────────────────┬──────────────────────┬─────────────────────┬─────────────────────┬───────────────┬───────────────────────────────┬─────────────┬───────────────────────┬───────────────────────┬──────────┬─────────────────┬───────────┬───────────┬───────────┐
│ clerical_match_score │ found_by_blocking_rules │ match_weight │ match_probability │ unique_id_l │ unique_id_r │ first_name_l │ first_name_r │ surname_l │ surname_r │ gamma_first_name_surname │ tf_surname_l │ tf_surname_r │ tf_first_name_l │ tf_first_name_r │ mw_first_name_surname │ mw_tf_adj_first_name_surname │ dob_l │ dob_r │ gamma_dob │ mw_dob │ city_l │ city_r │ gamma_city │ tf_city_l │ tf_city_r │ mw_city │ mw_tf_adj_city │ email_l │ email_r │ gamma_email │ tf_email_l │ tf_email_r │ mw_email │ mw_tf_adj_email │ cluster_l │ cluster_r │ match_key │
│ double │ boolean │ double │ double │ int64 │ int64 │ varchar │ varchar │ varchar │ varchar │ int32 │ double │ double │ double │ double │ double │ double │ date │ date │ int32 │ double │ varchar │ varchar │ int32 │ double │ double │ double │ double │ varchar │ varchar │ int32 │ double │ double │ double │ double │ int64 │ int64 │ varchar │
├──────────────────────┼─────────────────────────┼─────────────────────┼──────────────────────┼─────────────┼─────────────┼──────────────┼──────────────┼───────────┼───────────┼──────────────────────────┼──────────────────────┼──────────────────────┼───────────────────────┼───────────────────────┼───────────────────────┼──────────────────────────────┼────────────┼────────────┼───────────┼──────────────────────┼────────────┼─────────┼────────────┼──────────────────────┼──────────────────────┼─────────────────────┼─────────────────────┼───────────────┼───────────────────────────────┼─────────────┼───────────────────────┼───────────────────────┼──────────┼─────────────────┼───────────┼───────────┼───────────┤
│ 1.0 │ true │ -2.6815084224062167 │ 0.13485698259056078 │ 177 │ 178 │ Ellie │ Ellie │ Ellis │ Eislls │ 1 │ 0.003663003663003663 │ 0.001221001221001221 │ 0.0024067388688327317 │ 0.0024067388688327317 │ 5.423638593560125 │ 0.5613535502605806 │ 2015-11-06 │ 2005-12-08 │ 1 │ -0.44187777248725457 │ London │ NULL │ -1 │ 0.21279212792127922 │ NULL │ 0.0 │ 0.0 │ NULL │ elliee@oguzmanoc.m │ -1 │ NULL │ 0.0012674271229404308 │ 0.0 │ 0.0 │ 48 │ 48 │ 0 │
│ 1.0 │ true │ -1.9309512293259314 │ 0.2077678033394467 │ 239 │ 242 │ Freya │ Freya │ Shah │ Shah │ 6 │ 0.003663003663003663 │ 0.003663003663003663 │ 0.006016847172081829 │ 0.006016847172081829 │ 7.864639773412222 │ 0.0 │ 1972-01-17 │ 1970-12-17 │ 1 │ -0.44187777248725457 │ London │ Lonnod │ 0 │ 0.21279212792127922 │ 0.007380073800738007 │ -1.1290904365112309 │ 0.0 │ f.s@flynn.com │ NULL │ -1 │ 0.005069708491761723 │ NULL │ 0.0 │ 0.0 │ 62 │ 62 │ 0 │
│ 1.0 │ true │ -4.003436517293579 │ 0.05869179180349604 │ 248 │ 249 │ Joshua │ Joshua │ Williams │ NULL │ 1 │ 0.009768009768009768 │ NULL │ 0.006016847172081829 │ 0.006016847172081829 │ 5.423638593560125 │ -0.760574544626782 │ 2012-08-05 │ 2003-09-07 │ 1 │ -0.44187777248725457 │ Portsmouth │ NULL │ -1 │ 0.017220172201722016 │ NULL │ 0.0 │ 0.0 │ NULL │ j.williams@levine-johnson.com │ -1 │ NULL │ 0.0076045627376425855 │ 0.0 │ 0.0 │ 64 │ 64 │ 0 │
│ 1.0 │ true │ -7.54777361307645 │ 0.005315925752804887 │ 376 │ 380 │ Eliza │ Eliza │ NULL │ Taylor │ 1 │ NULL │ 0.017094017094017096 │ 0.006016847172081829 │ 0.006016847172081829 │ 5.423638593560125 │ -0.760574544626782 │ 1983-01-12 │ 1993-02-08 │ 0 │ -3.9862148682701255 │ Glasgow │ NULL │ -1 │ 0.008610086100861008 │ NULL │ 0.0 │ 0.0 │ NULL │ elizataylor@marshall.com │ -1 │ NULL │ 0.0063371356147021544 │ 0.0 │ 0.0 │ 98 │ 98 │ 0 │
│ 1.0 │ true │ -2.9346806124613893 │ 0.11566216421606534 │ 434 │ 435 │ Hugo │ Hugo │ Kaur │ Kaur │ 6 │ 0.009768009768009768 │ 0.009768009768009768 │ 0.0048134777376654635 │ 0.0048134777376654635 │ 7.864639773412222 │ 0.0 │ 1983-04-20 │ 1973-03-23 │ 0 │ -3.9862148682701255 │ London │ London │ 1 │ 0.21279212792127922 │ 0.21279212792127922 │ 3.475535597062839 │ -2.0640183209266567 │ h.k@sharp.com │ NULL │ -1 │ 0.0038022813688212928 │ NULL │ 0.0 │ 0.0 │ 112 │ 112 │ 0 │
└──────────────────────┴─────────────────────────┴─────────────────────┴──────────────────────┴─────────────┴─────────────┴──────────────┴──────────────┴───────────┴───────────┴──────────────────────────┴──────────────────────┴──────────────────────┴───────────────────────┴───────────────────────┴───────────────────────┴──────────────────────────────┴────────────┴────────────┴───────────┴──────────────────────┴────────────┴─────────┴────────────┴──────────────────────┴──────────────────────┴─────────────────────┴─────────────────────┴───────────────┴───────────────────────────────┴─────────────┴───────────────────────┴───────────────────────┴──────────┴─────────────────┴───────────┴───────────┴───────────┘
records = linker.evaluation.prediction_errors_from_labels_column(
"cluster", include_false_negatives=True, include_false_positives=True
).as_record_list(limit=5)
linker.visualisations.waterfall_chart(records)
Blocking time: 0.01 seconds
Predict time (post-blocking): 0.06 seconds
-- WARNING --
You have called predict(), but there are some parameter estimates which have neither been estimated or specified in your settings dictionary. To produce predictions the following untrained parameters will use default values.
Comparison: 'email':
m values not fully trained