BuildITSystems's picture
Add presentation bundle (reports, curves, run log, code) for the Colab notebook
439e7b1 verified
|
Raw History Blame Contribute Delete
13.6 kB

Data report — 2026-10-08T06:41:51+00:00

spam_policy positive_class (positive = phishing/spam, unwanted); quote stripping on; seed 42; holdout source TREC-06; elapsed 139.0s; peak RSS 6.58 GB.

Sources

  • labelled primary: puyang2025/seven-phishing-email-datasets @ b7f3f8d99ebd4fd0af0a5afe027420e53f08d1a4 (203,017 rows, hub splits {'train': 162413, 'test': 40604} concatenated; the hub split leaks and is ignored)
  • pretraining corpus: corbt/enron-emails @ cfc06c758093d90993abce1a43668fb7357258a6 (517,401 rows)
  • excluded (no body text / 92% subset): it4lia/PhishingEmailCuratedDatasets_Cleaned, zefang-liu/phishing-email-dataset

Splits

split rows positives negatives base rate
finetune_train 157,113 75,675 81,438 0.4817
finetune_val 17,643 8,642 9,001 0.4898
test_holdout 16,302 3,894 12,408 0.2389
pretrain (MLM) 226,273 - - 407,902,364 chars

finetune_train by source

source label 0 label 1 rows positive rate
Assassin 3,705 1,388 5,093 27.3%
CEAS-08 15,547 18,631 34,178 54.5%
Enron 12,741 11,482 24,223 47.4%
TREC-05 27,663 18,723 46,386 40.4%
TREC-07 21,782 25,451 47,233 53.9%

finetune_val by source

source label 0 label 1 rows positive rate
Assassin 380 136 516 26.4%
CEAS-08 1,699 2,184 3,883 56.2%
Enron 1,381 1,327 2,708 49.0%
TREC-05 2,997 2,052 5,049 40.6%
TREC-07 2,544 2,943 5,487 53.6%

test_holdout by source

source label 0 label 1 rows positive rate
TREC-06 12,408 3,894 16,302 23.9%

Normalisation and dials

  • common.normalize_text: NFKC -> lowercase -> keep [a-z0-9] only (import it, never re-derive it; NFKC is an extension of the verify_data.md section 7 wording)
  • dials: {'key_prefix_chars': 300, 'key_prefix_min_len': 80, 'body_key_min_alnum': 20, 'pretrain_min_alnum': 50, 'quote_strip_min_alnum': 200, 'shingle_cap': 2000}

Drops and removals

  • labelled rows with <20 alphanumerics (subject+body): 715 rows
    source label 0 label 1 rows positive rate
    CEAS-08 0 1 1 100.0%
    Enron 12 18 30 60.0%
    TREC-05 51 526 577 91.2%
    TREC-06 3 95 98 96.9%
    TREC-07 0 9 9 100.0%
  • Ling excluded (academic list corpus, 2,859 rows by label {'0': 2401, '1': 458})
  • pool label conflicts (identical normalised body labelled both 0 and 1; all members dropped): 18 rows in 8 groups
    source label 0 label 1 rows positive rate
    Enron 8 0 8 0.0%
    TREC-05 0 10 10 100.0%
  • pool exact duplicates (k_full, keep first): 6,715 rows
    source label 0 label 1 rows positive rate
    Assassin 1 184 185 99.5%
    CEAS-08 58 1,020 1,078 94.6%
    Enron 1,641 693 2,334 29.7%
    TREC-05 1,611 772 2,383 32.4%
    TREC-07 31 704 735 95.8%
  • decontamination against the holdout: {'key_match_only': 4, 'shingle_link_only': 1516, 'both': 132, 'total': 1652}
    source label 0 label 1 rows positive rate
    Assassin 1 10 11 90.9%
    CEAS-08 8 6 14 42.9%
    Enron 8 456 464 98.3%
    TREC-05 7 863 870 99.2%
    TREC-07 1 292 293 99.7%
  • holdout internal exact duplicates kept (test set is never deduped): 116

Near-duplicate clustering

  • 50-char shingles, stride 25, first 1500 chars, link at >= 3 shared; 1 boilerplate shingles over cap 2,000 ignored (touching 2,930 rows)
  • links at the removal stage (pool + holdout index): {'pool_pool': 3633009, 'pool_holdout': 5150, 'holdout_holdout': 15456}
  • clusters 114,261 (mixed source x label: 1,781; largest 7,069); val fraction target 0.1 achieved 0.101
    stratum rows clusters val target val rows val frac clusters too large
    Assassin 0 3,811 2,733 381 381 0.1
    Assassin 1 1,436 834 144 144 0.1003
    CEAS-08 0 16,993 11,149 1,699 1,699 0.1
    CEAS-08 1 21,586 12,202 2,159 2,159 0.1
    Enron 0 13,589 12,731 1,359 1,359 0.1
    Enron 1 11,393 8,589 1,139 1,139 0.1
    TREC-05 0 30,181 24,292 3,018 3,018 0.1
    TREC-05 1 21,933 14,361 2,193 2,229 0.1016
    TREC-07 0 25,438 11,740 2,544 2,544 0.1
    TREC-07 1 28,396 15,630 2,840 2,971 0.1046

Pretraining corpus (corbt/enron-emails)

stage rows
rows in 517,401
exact dups (subject+body, raw) 272,905
< 50 alnum after stripping 14,027
exact dups after stripping 107
matches a holdout key (removed) 0
matches a fine-tune val key (removed) 4,004
>= 3 shingles shared with a holdout row (removed) 85
>= 3 shingles shared with a fine-tune val row (kept, counted) 1,095
overlaps a fine-tune train key (kept, allowed) 35,172
rows out 226,273
  • near-dup screen: 88 links to 19 holdout rows (by label {'0': 18, '1': 1}); 5,345 links to 883 val rows
  • quote/forward stripping on: 21,832 bodies cut, 70,907 had a marker but kept the full body (< 200 alnum above it); marker hits {'forwarded': 33089, 'header_block': 5428, 'original': 54222}; retained chars 0.8948 of all bodies, 0.2548 of cut bodies
  • 407,902,364 chars out, mean 1802.7 chars/doc

Leakage assertions

check count asserted zero pass
holdout_vs_train_key_rows 0 True True
holdout_vs_val_key_rows 0 True True
holdout_vs_pretrain_key_rows 0 True True
holdout_vs_train_shingle_links 0 True True
holdout_vs_val_shingle_links 0 True True
holdout_vs_pretrain_shingle_links 0 True True
train_vs_val_k_full_rows 0 True True
train_vs_val_any_key_rows 0 False True
train_vs_val_shingle_links 0 False True
val_vs_pretrain_key_rows 0 True True
val_vs_pretrain_shingle_links 5,336 False True
train_vs_pretrain_key_overlap 102,100 False True
holdout_rows_in_train_or_val_by_source 0 True True
test_holdout_rows_from_other_sources 0 True True
pretrain_rows 226,273 False True

Files

  • finetune_train: /home/nathank/BITS/dev/Phishing Model/data/processed/finetune_train.parquet
  • finetune_val: /home/nathank/BITS/dev/Phishing Model/data/processed/finetune_val.parquet
  • test_holdout: /home/nathank/BITS/dev/Phishing Model/data/processed/test_holdout.parquet
  • pretrain: /home/nathank/BITS/dev/Phishing Model/data/processed/pretrain.parquet

Three-way labels — build3 2026-10-08T20:21:36+00:00

label3 {'0': 'legit', '1': 'phish', '2': 'spam', '-1': 'unwanted'}; display names {'0': 'Legitimate', '1': 'Phishing', '2': 'Spam'}; binary roll-up "Unwanted (phishing or spam)" = P(phishing)+P(spam). Positive rows by provenance: {'Assassin': 2, 'Enron': 2, 'Ling': 2, 'TREC-05': -1, 'TREC-06': -1, 'TREC-07': -1, 'CEAS-08': -1, 'Nazario': 1, 'Nigerian_Fraud': 1}. unchanged: 1 for phish / spam / unwanted, 0 for legit. Elapsed 66.1s; peak RSS 3.23 GB; binary base from snapshot (/home/nathank/BITS/dev/Phishing Model/data/processed/binary_snapshot).

New sources

  • kudzaiprichard/aura-phishing-email-corpus / Nazario.csv @ 539567cee21d03c83bd2fb1b142c18a80904eb72: 1,565 rows (1,565 used), label3 1 (phishing by provenance)
  • kudzaiprichard/aura-phishing-email-corpus / Nigerian_Fraud.csv @ 539567cee21d03c83bd2fb1b142c18a80904eb72: 3,332 rows (3,332 used), label3 1 (phishing by provenance)
  • bigshp (locuoco/the-biggest-spam-ham-phish-email-dataset-300000): research verdict DO_NOT_USE, not ingested (docs/research/bigshp_research.md)
source loaded dropped kept -> train -> val -> test_holdout3
Nazario 1,565 58 1,507 1,159 126 222
Nigerian_Fraud 3,332 828 2,504 1,991 214 299
  • drops by reason: {'Nazario': {'mbox_internal_data': 2, 'within_new_k_full_dup': 56}, 'Nigerian_Fraud': {'shingle_link_test_holdout': 235, 'within_new_k_full_dup': 98, 'key_match_finetune_train': 54, 'near_dup_of_both_train_and_val': 424, 'key_match_test_holdout': 13, 'lt_20_alnum': 1, 'key_match_finetune_val': 3}}
  • near-dup pins: {'clusters_total': 3239, 'clusters_pinned_train_by_train_or_pretrain_link': 238, 'clusters_pinned_val_by_val_link': 23, 'clusters_dropped_linked_to_both_train_and_val': 17, 'rows_dropped_linked_to_both_train_and_val': 424, 'clusters_with_a_holdout_linked_member': 235, 'rows_linked_to_train': 329, 'rows_linked_to_pretrain': 33, 'rows_linked_to_val': 35, 'rows_dropped_holdout_shingle_link': 235, 'largest_cluster': 52}
  • bigshp label contradictions among exact matches: 0

test_holdout3 rows taken from finetune_val

  • legitimate from ['CEAS-08', 'TREC-07', 'Assassin'], spam from ['Assassin', 'Enron']; whole near-dup clusters only; excluded candidates by reason: {'Enron': {'cluster_has_an_ineligible_member': 261, 'shingle_link_to_a_new_row': 28, 'shingle_link_pretrain': 4}, 'Assassin': {'shingle_link_pretrain': 8, 'cluster_has_an_ineligible_member': 7}, 'CEAS-08': {'shingle_link_pretrain': 1}, 'TREC-07': {'cluster_has_an_ineligible_member': 1}}
  • per class: {'Legitimate': {'target_rows': 2000, 'eligible_rows': 4621, 'fraction': 0.4328, 'moved_rows': 1999}, 'Spam': {'target_rows': 700, 'eligible_rows': 1155, 'fraction': 0.6061, 'moved_rows': 700}}
    source 0 Legitimate 1 Phishing 2 Spam -1 unwanted (unsplit) rows
    Assassin 164 0 72 0 236
    CEAS-08 736 0 0 0 736
    Enron 0 0 628 0 628
    TREC-07 1,099 0 0 0 1,099

Splits by label3

finetune_train: 160,263 rows, by label3 {'-1': 62805, '0': 81438, '1': 3150, '2': 12870}, binary positives 78,825 (0.4918)

source 0 Legitimate 1 Phishing 2 Spam -1 unwanted (unsplit) rows
Assassin 3,705 0 1,388 0 5,093
CEAS-08 15,547 0 0 18,631 34,178
Enron 12,741 0 11,482 0 24,223
Nazario 0 1,159 0 0 1,159
Nigerian_Fraud 0 1,991 0 0 1,991
TREC-05 27,663 0 0 18,723 46,386
TREC-07 21,782 0 0 25,451 47,233

finetune_val: 15,284 rows, by label3 {'-1': 7179, '0': 7002, '1': 340, '2': 763}, binary positives 8,282 (0.5419)

source 0 Legitimate 1 Phishing 2 Spam -1 unwanted (unsplit) rows
Assassin 216 0 64 0 280
CEAS-08 963 0 0 2,184 3,147
Enron 1,381 0 699 0 2,080
Nazario 0 126 0 0 126
Nigerian_Fraud 0 214 0 0 214
TREC-05 2,997 0 0 2,052 5,049
TREC-07 1,445 0 0 2,943 4,388

test_holdout: 16,302 rows, by label3 {'-1': 3894, '0': 12408}, binary positives 3,894 (0.2389)

source 0 Legitimate 1 Phishing 2 Spam -1 unwanted (unsplit) rows
TREC-06 12,408 0 0 3,894 16,302

test_holdout3: 3,220 rows, by label3 {'0': 1999, '1': 521, '2': 700}, binary positives 1,221 (0.3792)

source 0 Legitimate 1 Phishing 2 Spam -1 unwanted (unsplit) rows
Assassin 164 0 72 0 236
CEAS-08 736 0 0 0 736
Enron 0 0 628 0 628
Nazario 0 222 0 0 222
Nigerian_Fraud 0 299 0 0 299
TREC-07 1,099 0 0 0 1,099

Leakage assertions (binary gate + three-way)

check count asserted zero pass
holdout_vs_train_key_rows 0 True True
holdout_vs_val_key_rows 0 True True
holdout_vs_pretrain_key_rows 0 True True
holdout_vs_train_shingle_links 0 True True
holdout_vs_val_shingle_links 0 True True
holdout_vs_pretrain_shingle_links 0 True True
train_vs_val_k_full_rows 0 True True
train_vs_val_any_key_rows 0 False True
train_vs_val_shingle_links 0 False True
val_vs_pretrain_key_rows 0 True True
val_vs_pretrain_shingle_links 5,336 False True
train_vs_pretrain_key_overlap 102,100 False True
holdout_rows_in_train_or_val_by_source 0 True True
test_holdout_rows_from_other_sources 0 True True
pretrain_rows 226,273 False True
holdout3_vs_train_key_rows 0 True True
holdout3_vs_val_key_rows 0 True True
holdout3_vs_pretrain_key_rows 0 True True
holdout3_vs_holdout_key_rows 0 True True
holdout3_vs_train_shingle_links 0 True True
holdout3_vs_val_shingle_links 0 True True
holdout3_vs_pretrain_shingle_links 0 True True
holdout3_vs_holdout_shingle_links 0 False True
holdout3_rows_without_full_label3 0 True True
holdout3_rows_from_holdout_source 0 True True
doc_id_shared_between_splits 0 True True
label3_contract_violations 0 True True
holdout3_rows 3,220 False True

Files

  • finetune_train: /home/nathank/BITS/dev/Phishing Model/data/processed/finetune_train.parquet
  • finetune_val: /home/nathank/BITS/dev/Phishing Model/data/processed/finetune_val.parquet
  • test_holdout: /home/nathank/BITS/dev/Phishing Model/data/processed/test_holdout.parquet
  • test_holdout3: /home/nathank/BITS/dev/Phishing Model/data/processed/test_holdout3.parquet