{"id":2789,"date":"2026-10-17T13:17:50","date_gmt":"2026-10-17T13:17:50","guid":{"rendered":"https:\/\/sites.wp.odu.edu\/locky\/?p=2789"},"modified":"2026-10-22T13:55:03","modified_gmt":"2026-10-22T13:55:03","slug":"97-accurate-and-still-missing-spam","status":"publish","type":"post","link":"https:\/\/sites.wp.odu.edu\/locky\/2026\/10\/17\/97-accurate-and-still-missing-spam\/","title":{"rendered":"97% Accurate and Still Missing Spam"},"content":{"rendered":"\n<p>A spam filter that never catches a single spam message would still score 87.4 percent accuracy on my dataset. That one fact shaped this whole assignment.<\/p>\n\n\n\n<p>I built two classifiers for SMS spam: logistic regression and multinomial Naive Bayes. I trained each on two train\/test splits, 70\/30 and 90\/10, and compared them on five metrics.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why accuracy failed<\/h3>\n\n\n\n<p>After removing 403 duplicate messages, only 12.6 percent of the data was spam. Labeling everything as legitimate gets you 87.4 percent for free.<\/p>\n\n\n\n<p>All four of my runs landed between 97.2 and 98.5 percent accuracy. By that measure, they were basically equal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What recall showed<\/h3>\n\n\n\n<p>They weren\u2019t equal. On the 70\/30 split, Naive Bayes caught 91 percent of spam and missed 18 messages. Logistic regression missed 42.<\/p>\n\n\n\n<p>Logistic regression was the cautious model. It flagged only one legitimate message as spam, but it let much more spam through. Naive Bayes struck the better balance, with the higher F1 score on both splits.<\/p>\n\n\n\n<p>Which one is \u201cbetter\u201d depends on the cost of each mistake. A false positive hides a real message. A false negative puts spam in the inbox.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The threshold, not the model<\/h3>\n\n\n\n<p>Both models scored 0.98 to 0.99 ROC-AUC. That means they ranked spam above legitimate messages almost equally well. Logistic regression\u2019s low recall came from the default 0.5 cutoff, not from weak learning. Lowering its threshold would recover much of the gap.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The takeaway<\/h3>\n\n\n\n<p>On imbalanced data, the metric you pick decides what you see. Accuracy said these filters were the same. Recall said they weren\u2019t.<\/p>\n\n\n\n<p>Other related coursework <a href=\"https:\/\/sites.wp.odu.edu\/locky\/coursework\/cybersecurity-applications\/cyse-420-applied-ml-in-cybersecurity\/\">CYSE 420 course page<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\"><div class=\"wp-block-group__inner-container\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-layout-1 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\"><div class=\"wp-block-group__inner-container\">\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\"><div class=\"wp-block-group__inner-container\"><a href=\"https:\/\/sites.wp.odu.edu\/locky\/wp-content\/uploads\/sites\/38189\/2026\/10\/CYSE420_Assignment02_Report.pdf\" class=\"pdfemb-viewer\" style=\"\" data-width=\"max\" data-height=\"max\"  data-toolbar=\"both\" data-toolbar-fixed=\"on\">CYSE420_Assignment02_Report<br\/><\/a>\n<p class=\"wp-block-pdfemb-pdf-embedder-viewer\"><\/p>\n<\/div><\/div>\n<\/div><\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<ul class=\"wp-block-social-links has-normal-icon-size has-visible-labels has-icon-color has-icon-background-color is-style-default is-horizontal is-content-justification-center is-layout-flex wp-container-core-social-links-layout-1 wp-block-social-links-is-layout-flex\"><li style=\"color: #ffffff; background-color: #cf2e2e; \" class=\"wp-social-link wp-social-link-chain has-white-color wp-block-social-link\"><a rel=\"https:\/\/www.credly.com\/users\/carl-lochstampfor-jr noopener nofollow\" target=\"_blank\" href=\"http:\/\/sites.wp.odu.edu\/locky\/wp-content\/uploads\/sites\/38189\/2026\/10\/CYSE420_Assignment02_Report.pdf\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15.6,7.2H14v1.5h1.6c2,0,3.7,1.7,3.7,3.7s-1.7,3.7-3.7,3.7H14v1.5h1.6c2.8,0,5.2-2.3,5.2-5.2,0-2.9-2.3-5.2-5.2-5.2zM4.7,12.4c0-2,1.7-3.7,3.7-3.7H10V7.2H8.4c-2.9,0-5.2,2.3-5.2,5.2,0,2.9,2.3,5.2,5.2,5.2H10v-1.5H8.4c-2,0-3.7-1.7-3.7-3.7zm4.6.9h5.3v-1.5H9.3v1.5z\"><\/path><\/svg><span class=\"wp-block-social-link-label\">Full Screen or Download<\/span><\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Two spam filters scored over 97% accuracy. One missed 21% of spam. Why accuracy fails on imbalanced data, and what recall and F1 reveal instead.<\/p>\n","protected":false},"author":30379,"featured_media":2790,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"image","meta":{"footnotes":"","wds_primary_category":165},"categories":[165,60],"tags":[302,267,273,274,301,303,300,304],"_links":{"self":[{"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/posts\/2789"}],"collection":[{"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/users\/30379"}],"replies":[{"embeddable":true,"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/comments?post=2789"}],"version-history":[{"count":3,"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/posts\/2789\/revisions"}],"predecessor-version":[{"id":2796,"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/posts\/2789\/revisions\/2796"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/media\/2790"}],"wp:attachment":[{"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/media?parent=2789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/categories?post=2789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sites.wp.odu.edu\/locky\/wp-json\/wp\/v2\/tags?post=2789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}