Spaces:
Runtime error
Runtime error
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Model Details — Phishing Detection</title> | |
| <link rel="stylesheet" href="/static/style.css"> | |
| </head> | |
| <body class="models-page"> | |
| <div class="container"> | |
| <header> | |
| <div class="header-left"> | |
| <div class="logo"><a href="/">Phishing Detection System</a></div> | |
| <div class="tagline">Model Performance Details</div> | |
| </div> | |
| <a href="/" class="back-link">← Back</a> | |
| </header> | |
| <section class="page-title-section"> | |
| <h1 class="page-title">Model Details</h1> | |
| <p class="page-description"> | |
| Performance metrics, feature importance, and configuration details for all 9 machine learning models | |
| used in the phishing detection pipeline. Models span URL features (125), RAW HTML features (77) + engineered (23), | |
| combined features (225), and character-level CNN approaches. | |
| </p> | |
| </section> | |
| <!-- DETECTION PIPELINE --> | |
| <section class="section"> | |
| <div class="section-title">Detection Pipeline</div> | |
| <div class="pipeline"> | |
| <div class="pipeline-step"><span class="step-number">1</span>URL Input</div> | |
| <div class="pipeline-step"><span class="step-number">2</span>Feature Extraction</div> | |
| <div class="pipeline-step"><span class="step-number">3</span>3 URL Models</div> | |
| <div class="pipeline-step"><span class="step-number">4</span>HTML Download</div> | |
| <div class="pipeline-step"><span class="step-number">5</span>2 HTML + 2 Combined</div> | |
| <div class="pipeline-step"><span class="step-number">6</span>2 CNN Models</div> | |
| <div class="pipeline-step"><span class="step-number">7</span>9-Model Consensus</div> | |
| </div> | |
| </section> | |
| <!-- URL FEATURES --> | |
| <section class="section"> | |
| <div class="section-title collapsible-toggle" onclick="toggleFeatures(this)"> | |
| URL Features <span class="feature-count">125 features</span> | |
| <span class="toggle-icon">+</span> | |
| </div> | |
| <div class="collapsible-content"> | |
| <div class="section-subtitle">All features extracted from the URL string. Hover over any feature to see its description.</div> | |
| <div class="feature-category-label">Length & Structure</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Total character count of the full URL">url_length</div> | |
| <div class="feature-chip" data-tip="Character count of the domain name only">domain_length</div> | |
| <div class="feature-chip" data-tip="Character count of the URL path component">path_length</div> | |
| <div class="feature-chip" data-tip="Character count of the query string">query_length</div> | |
| <div class="feature-chip" data-tip="URL length bucket: 0=short (<40), 1=medium, 2=long, 3=very long (>120)">url_length_category</div> | |
| <div class="feature-chip" data-tip="Domain length bucket: 0=short (<10), 1=medium, 2=long, 3=very long (>30)">domain_length_category</div> | |
| </div> | |
| <div class="feature-category-label">Character Counts</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Number of dots (.) in the full URL">num_dots</div> | |
| <div class="feature-chip" data-tip="Number of hyphens (-) in the full URL">num_hyphens</div> | |
| <div class="feature-chip" data-tip="Number of underscores (_) in the full URL">num_underscores</div> | |
| <div class="feature-chip" data-tip="Number of forward slashes (/) in the URL">num_slashes</div> | |
| <div class="feature-chip" data-tip="Number of question marks (?) in the URL">num_question_marks</div> | |
| <div class="feature-chip" data-tip="Number of ampersands (&) in the URL">num_ampersands</div> | |
| <div class="feature-chip" data-tip="Number of equals signs (=) in the URL">num_equals</div> | |
| <div class="feature-chip" data-tip="Number of @ symbols — often used to obscure the real destination">num_at</div> | |
| <div class="feature-chip" data-tip="Number of percent (%) characters indicating URL encoding">num_percent</div> | |
| <div class="feature-chip" data-tip="Total digit characters in the full URL">num_digits_url</div> | |
| <div class="feature-chip" data-tip="Total letter characters in the full URL">num_letters_url</div> | |
| <div class="feature-chip" data-tip="Number of dots (.) in the domain only">domain_dots</div> | |
| <div class="feature-chip" data-tip="Number of hyphens (-) in the domain only">domain_hyphens</div> | |
| <div class="feature-chip" data-tip="Number of digit characters in the domain">domain_digits</div> | |
| <div class="feature-chip" data-tip="Number of slashes (/) in the path component">path_slashes</div> | |
| <div class="feature-chip" data-tip="Number of dots (.) in the path component">path_dots</div> | |
| <div class="feature-chip" data-tip="Number of digit characters in the path">path_digits</div> | |
| </div> | |
| <div class="feature-category-label">Character Ratios</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Proportion of digit characters to total URL length">digit_ratio_url</div> | |
| <div class="feature-chip" data-tip="Proportion of letter characters to total URL length">letter_ratio_url</div> | |
| <div class="feature-chip" data-tip="Proportion of special (non-alphanumeric) characters in URL">special_char_ratio</div> | |
| <div class="feature-chip" data-tip="Proportion of digits in the domain name">digit_ratio_domain</div> | |
| <div class="feature-chip" data-tip="Proportion of symbols (hyphens, underscores, dots) in domain">symbol_ratio_domain</div> | |
| </div> | |
| <div class="feature-category-label">Domain Structure</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Number of subdomains (e.g. sub.example.com = 1)">num_subdomains</div> | |
| <div class="feature-chip" data-tip="Total number of dot-separated domain parts">num_domain_parts</div> | |
| <div class="feature-chip" data-tip="Character length of the top-level domain (e.g. com=3)">tld_length</div> | |
| <div class="feature-chip" data-tip="Character length of the second-level domain">sld_length</div> | |
| <div class="feature-chip" data-tip="Length of the longest dot-separated domain part">longest_domain_part</div> | |
| <div class="feature-chip" data-tip="Average length of all domain parts">avg_domain_part_len</div> | |
| <div class="feature-chip" data-tip="1 if any domain part exceeds 20 characters">longest_part_gt_20</div> | |
| <div class="feature-chip" data-tip="1 if any domain part exceeds 30 characters">longest_part_gt_30</div> | |
| <div class="feature-chip" data-tip="1 if any domain part exceeds 40 characters">longest_part_gt_40</div> | |
| <div class="feature-chip" data-tip="1 if TLD is suspicious (.tk, .ml, .xyz, .top, .zip, etc.)">has_suspicious_tld</div> | |
| <div class="feature-chip" data-tip="1 if TLD is well-known and trusted (.com, .org, .edu, etc.)">has_trusted_tld</div> | |
| <div class="feature-chip" data-tip="1 if URL contains a port number">has_port</div> | |
| <div class="feature-chip" data-tip="1 if URL uses a non-standard port (not 80 or 443)">has_non_std_port</div> | |
| <div class="feature-chip" data-tip="Composite randomness score of the domain (0-1)">domain_randomness_score</div> | |
| <div class="feature-chip" data-tip="Consonant clustering score of the SLD — random strings have high clusters">sld_consonant_cluster_score</div> | |
| <div class="feature-chip" data-tip="1 if SLD contains keyboard walk patterns (qwerty, asdfgh)">sld_keyboard_pattern</div> | |
| <div class="feature-chip" data-tip="1 if SLD contains a common English word (4+ characters)">sld_has_dictionary_word</div> | |
| <div class="feature-chip" data-tip="Score based on vowel/consonant alternation — real words are more pronounceable">sld_pronounceability_score</div> | |
| <div class="feature-chip" data-tip="1 if digits appear at suspicious positions in the SLD (start or end)">domain_digit_position_suspicious</div> | |
| </div> | |
| <div class="feature-category-label">Path Analysis</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Directory depth of the URL path (number of segments)">path_depth</div> | |
| <div class="feature-chip" data-tip="Length of the longest path segment between slashes">max_path_segment_len</div> | |
| <div class="feature-chip" data-tip="Average length of path segments">avg_path_segment_len</div> | |
| <div class="feature-chip" data-tip="1 if the URL path has a file extension">has_extension</div> | |
| <div class="feature-chip" data-tip="Category of file extension: 0=none, 1=document, 2=media, 3=executable, 4=web, 5=other">extension_category</div> | |
| <div class="feature-chip" data-tip="1 if extension is suspicious (.exe, .bat, .cmd, .scr, .vbs, .ps1)">has_suspicious_extension</div> | |
| <div class="feature-chip" data-tip="1 if extension is specifically .exe">has_exe</div> | |
| <div class="feature-chip" data-tip="1 if path contains double slash (//) — possible redirect trick">has_double_slash</div> | |
| <div class="feature-chip" data-tip="1 if a brand name appears in path but not in domain — impersonation signal">path_has_brand_not_domain</div> | |
| <div class="feature-chip" data-tip="1 if path contains an IP address pattern">path_has_ip_pattern</div> | |
| <div class="feature-chip" data-tip="1 if a document extension + 'download' keyword appear together">suspicious_path_extension_combo</div> | |
| </div> | |
| <div class="feature-category-label">Query String</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Number of query parameters">num_params</div> | |
| <div class="feature-chip" data-tip="1 if URL has a query string">has_query</div> | |
| <div class="feature-chip" data-tip="Total character length of all query parameter values">query_value_length</div> | |
| <div class="feature-chip" data-tip="Length of the longest query parameter">max_param_len</div> | |
| <div class="feature-chip" data-tip="1 if any query parameter value looks like a URL — possible redirect">query_has_url</div> | |
| </div> | |
| <div class="feature-category-label">Statistical & Entropy</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Shannon entropy of the full URL — random/phishing URLs have higher entropy">url_entropy</div> | |
| <div class="feature-chip" data-tip="Shannon entropy of the domain name">domain_entropy</div> | |
| <div class="feature-chip" data-tip="Shannon entropy of the path component">path_entropy</div> | |
| <div class="feature-chip" data-tip="Longest run of consecutive digit characters">max_consecutive_digits</div> | |
| <div class="feature-chip" data-tip="Longest run of consecutive letter characters">max_consecutive_chars</div> | |
| <div class="feature-chip" data-tip="Longest run of consecutive consonants in domain">max_consecutive_consonants</div> | |
| <div class="feature-chip" data-tip="Rate of adjacent character repetitions (aa, bb, etc.)">char_repeat_rate</div> | |
| <div class="feature-chip" data-tip="Ratio of unique bigrams — lower = more repetitive URL">unique_bigram_ratio</div> | |
| <div class="feature-chip" data-tip="Ratio of unique trigrams — lower = more repetitive URL">unique_trigram_ratio</div> | |
| <div class="feature-chip" data-tip="Ratio of unique characters to total characters in the SLD (0–1)">sld_letter_diversity</div> | |
| <div class="feature-chip" data-tip="1 if domain contains both digits and letters">domain_has_numbers_letters</div> | |
| <div class="feature-chip" data-tip="Composite score (0–1) combining URL length, dots, hyphens, slashes, and entropy">url_complexity_score</div> | |
| </div> | |
| <div class="feature-category-label">Security Indicators</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="1 if domain is an IP address instead of a hostname">has_ip_address</div> | |
| <div class="feature-chip" data-tip="1 if URL contains @ symbol — can trick browsers into treating text before @ as user info">has_at_symbol</div> | |
| <div class="feature-chip" data-tip="1 if double-slash redirect pattern found in path">has_redirect</div> | |
| <div class="feature-chip" data-tip="1 if domain is a known URL shortener (bit.ly, t.co, etc.)">is_shortened</div> | |
| <div class="feature-chip" data-tip="1 if hosted on a free hosting service (000webhostapp, freehosting, etc.)">is_free_hosting</div> | |
| <div class="feature-chip" data-tip="1 if hosted on a free platform (github.io, vercel.app, netlify.app, etc.)">is_free_platform</div> | |
| <div class="feature-chip" data-tip="Length of subdomain on free platforms — long random subdomains are suspicious">platform_subdomain_length</div> | |
| <div class="feature-chip" data-tip="1 if subdomain matches UUID-like pattern (common on Replit, Firebase)">has_uuid_subdomain</div> | |
| <div class="feature-chip" data-tip="1 if URL uses HTTP instead of HTTPS">is_http</div> | |
| </div> | |
| <div class="feature-category-label">Keywords & Brand Detection</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Count of phishing keywords (login, verify, secure, etc.) in URL">num_phishing_keywords</div> | |
| <div class="feature-chip" data-tip="1 if phishing keywords found in the domain">phishing_in_domain</div> | |
| <div class="feature-chip" data-tip="1 if phishing keywords found in the path">phishing_in_path</div> | |
| <div class="feature-chip" data-tip="Number of recognized brand names in the URL">num_brands</div> | |
| <div class="feature-chip" data-tip="1 if a brand name appears in the domain">brand_in_domain</div> | |
| <div class="feature-chip" data-tip="1 if a brand name appears in the path">brand_in_path</div> | |
| <div class="feature-chip" data-tip="Score for brand impersonation — brand in URL but not the real domain">brand_impersonation</div> | |
| <div class="feature-chip" data-tip="1 if 'login' appears in URL">has_login</div> | |
| <div class="feature-chip" data-tip="1 if 'account' appears in URL">has_account</div> | |
| <div class="feature-chip" data-tip="1 if 'verify' appears in URL">has_verify</div> | |
| <div class="feature-chip" data-tip="1 if 'secure' appears in URL">has_secure</div> | |
| <div class="feature-chip" data-tip="1 if 'update' appears in URL">has_update</div> | |
| <div class="feature-chip" data-tip="1 if 'bank' appears in URL">has_bank</div> | |
| <div class="feature-chip" data-tip="1 if 'password' or 'passwd' appears in URL">has_password</div> | |
| <div class="feature-chip" data-tip="1 if 'suspend' appears in URL">has_suspend</div> | |
| <div class="feature-chip" data-tip="1 if 'webscr' appears in URL — common in PayPal phishing">has_webscr</div> | |
| <div class="feature-chip" data-tip="1 if 'cmd=' or '/cmd/' appears in URL">has_cmd</div> | |
| <div class="feature-chip" data-tip="1 if 'cgi-bin' or '.cgi' appears in URL">has_cgi</div> | |
| <div class="feature-chip" data-tip="1 if brand name in subdomain but not main domain — spoofing pattern">brand_in_subdomain_not_domain</div> | |
| <div class="feature-chip" data-tip="1 if multiple different brand names detected in URL">multiple_brands_in_url</div> | |
| <div class="feature-chip" data-tip="1 if brand name combined with hyphen (e.g. paypal-login.com)">brand_with_hyphen</div> | |
| <div class="feature-chip" data-tip="1 if brand found in domain with suspicious TLD">suspicious_brand_tld</div> | |
| <div class="feature-chip" data-tip="1 if brand name + phishing keyword both present">brand_keyword_combo</div> | |
| </div> | |
| <div class="feature-category-label">Encoding & Obfuscation</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="1 if URL contains percent-encoded characters">has_url_encoding</div> | |
| <div class="feature-chip" data-tip="Number of percent-encoded sequences in URL">encoding_count</div> | |
| <div class="feature-chip" data-tip="Difference in length between encoded and decoded URL">encoding_diff</div> | |
| <div class="feature-chip" data-tip="1 if domain contains Punycode (xn-- prefix) — internationalized domain">has_punycode</div> | |
| <div class="feature-chip" data-tip="1 if URL contains non-ASCII Unicode characters">has_unicode</div> | |
| <div class="feature-chip" data-tip="1 if URL contains hexadecimal string (0x...)">has_hex_string</div> | |
| <div class="feature-chip" data-tip="1 if URL contains a Base64-like string (20+ alphanumeric chars with +/=)">has_base64</div> | |
| <div class="feature-chip" data-tip="1 if domain contains look-alike patterns (rn, vv, cl, 0, 1) that mimic other characters">has_lookalike_chars</div> | |
| <div class="feature-chip" data-tip="Score for mixed Unicode scripts in domain — homograph attack indicator">mixed_script_score</div> | |
| <div class="feature-chip" data-tip="Risk score for homograph attacks targeting brand names">homograph_brand_risk</div> | |
| <div class="feature-chip" data-tip="1 if IDN homograph score exceeds 0.5 threshold">suspected_idn_homograph</div> | |
| <div class="feature-chip" data-tip="1 if URL contains double percent-encoding (%% or %25)">double_encoding</div> | |
| <div class="feature-chip" data-tip="1 if percent-encoding found specifically in the domain">encoding_in_domain</div> | |
| <div class="feature-chip" data-tip="Count of suspicious Unicode characters (RTL override, zero-width, BOM), capped at 5">suspicious_unicode_category</div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- HTML FEATURES --> | |
| <section class="section"> | |
| <div class="section-title collapsible-toggle" onclick="toggleFeatures(this)"> | |
| RAW HTML Features <span class="feature-count">77 raw features + 23 engineered</span> | |
| <span class="toggle-icon">+</span> | |
| </div> | |
| <div class="collapsible-content"> | |
| <div class="section-subtitle">All features extracted from HTML source and DOM structure. Hover over any feature to see its description.</div> | |
| <div class="feature-category-label">Document Size & Text</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Maximum nesting depth of DOM elements">dom_depth</div> | |
| <div class="feature-chip" data-tip="Total character length of the raw HTML">html_length</div> | |
| <div class="feature-chip" data-tip="Total length of visible extracted text">text_length</div> | |
| <div class="feature-chip" data-tip="Number of words extracted from page text">num_words</div> | |
| <div class="feature-chip" data-tip="Ratio of text content length to full HTML length">text_to_html_ratio</div> | |
| <div class="feature-chip" data-tip="Total character length of inline CSS styles">inline_css_length</div> | |
| <div class="feature-chip" data-tip="Total number of HTML tags in the document">num_tags</div> | |
| </div> | |
| <div class="feature-category-label">Metadata & Page Identity</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="1 if HTML title tag is present">has_title</div> | |
| <div class="feature-chip" data-tip="1 if meta description tag is present">has_description</div> | |
| <div class="feature-chip" data-tip="1 if meta keywords tag is present">has_keywords</div> | |
| <div class="feature-chip" data-tip="1 if author metadata is present">has_author</div> | |
| <div class="feature-chip" data-tip="1 if copyright text or metadata is detected">has_copyright</div> | |
| <div class="feature-chip" data-tip="1 if viewport meta tag is present">has_viewport</div> | |
| <div class="feature-chip" data-tip="1 if favicon link is declared">has_favicon</div> | |
| <div class="feature-chip" data-tip="Number of meta tags in the page head">num_meta_tags</div> | |
| </div> | |
| <div class="feature-category-label">DOM Elements & Layout</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Number of div elements">num_divs</div> | |
| <div class="feature-chip" data-tip="Number of span elements">num_spans</div> | |
| <div class="feature-chip" data-tip="Number of paragraph tags">num_paragraphs</div> | |
| <div class="feature-chip" data-tip="Number of heading tags (h1-h6)">num_headings</div> | |
| <div class="feature-chip" data-tip="Number of list containers (ul, ol)">num_lists</div> | |
| <div class="feature-chip" data-tip="Number of table elements">num_tables</div> | |
| <div class="feature-chip" data-tip="Number of image elements">num_images</div> | |
| <div class="feature-chip" data-tip="Number of iframe elements">num_iframes</div> | |
| <div class="feature-chip" data-tip="Number of hidden iframes">num_hidden_iframes</div> | |
| <div class="feature-chip" data-tip="Number of images embedded as data URIs">num_data_uri_images</div> | |
| <div class="feature-chip" data-tip="Number of linked CSS files">num_css_files</div> | |
| <div class="feature-chip" data-tip="Number of script tags">num_scripts</div> | |
| <div class="feature-chip" data-tip="Number of inline script blocks">num_inline_scripts</div> | |
| <div class="feature-chip" data-tip="Number of inline style blocks or style attributes">num_inline_styles</div> | |
| <div class="feature-chip" data-tip="Number of input fields in forms">num_input_fields</div> | |
| </div> | |
| <div class="feature-category-label">Link & Resource Analysis</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Total number of links">num_links</div> | |
| <div class="feature-chip" data-tip="Number of internal links pointing to same domain">num_internal_links</div> | |
| <div class="feature-chip" data-tip="Number of external links pointing to other domains">num_external_links</div> | |
| <div class="feature-chip" data-tip="Ratio of external links to all links">ratio_external_links</div> | |
| <div class="feature-chip" data-tip="Count of distinct external domains referenced">num_unique_external_domains</div> | |
| <div class="feature-chip" data-tip="Number of mailto links">num_mailto_links</div> | |
| <div class="feature-chip" data-tip="Number of javascript: pseudo-links">num_javascript_links</div> | |
| <div class="feature-chip" data-tip="Number of links pointing to IP-based hosts">num_ip_based_links</div> | |
| <div class="feature-chip" data-tip="Number of links using suspicious top-level domains">num_suspicious_tld_links</div> | |
| <div class="feature-chip" data-tip="Number of links with empty or placeholder href values">num_empty_links</div> | |
| <div class="feature-chip" data-tip="Anchor text points to content unrelated to destination">num_anchor_text_mismatch</div> | |
| <div class="feature-chip" data-tip="Number of external stylesheet references">num_external_css</div> | |
| <div class="feature-chip" data-tip="Number of externally loaded images">num_external_images</div> | |
| <div class="feature-chip" data-tip="Number of externally loaded JavaScript files">num_external_scripts</div> | |
| </div> | |
| <div class="feature-category-label">Forms & Inputs</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="1 if at least one form tag exists">has_form</div> | |
| <div class="feature-chip" data-tip="1 if a login-style form is detected">has_login_form</div> | |
| <div class="feature-chip" data-tip="Number of form elements">num_forms</div> | |
| <div class="feature-chip" data-tip="Number of email-type fields">num_email_fields</div> | |
| <div class="feature-chip" data-tip="Number of password fields">num_password_fields</div> | |
| <div class="feature-chip" data-tip="Number of text input fields">num_text_fields</div> | |
| <div class="feature-chip" data-tip="Number of submit buttons">num_submit_buttons</div> | |
| <div class="feature-chip" data-tip="Number of hidden input fields">num_hidden_fields</div> | |
| <div class="feature-chip" data-tip="Number of forms missing associated labels">num_forms_without_labels</div> | |
| <div class="feature-chip" data-tip="Number of forms with empty action attribute">num_empty_form_actions</div> | |
| <div class="feature-chip" data-tip="Number of forms submitting to external domains">num_external_form_actions</div> | |
| <div class="feature-chip" data-tip="1 if password form submits to external domain">password_with_external_action</div> | |
| </div> | |
| <div class="feature-category-label">Scripts & Dynamic Behavior</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="1 if JavaScript eval() is used">has_eval</div> | |
| <div class="feature-chip" data-tip="1 if JavaScript escape() is used">has_escape</div> | |
| <div class="feature-chip" data-tip="1 if JavaScript unescape() is used">has_unescape</div> | |
| <div class="feature-chip" data-tip="1 if atob() decoding function is present">has_atob</div> | |
| <div class="feature-chip" data-tip="1 if Base64-like content or decoding usage is detected">has_base64</div> | |
| <div class="feature-chip" data-tip="1 if String.fromCharCode usage is present">has_fromcharcode</div> | |
| <div class="feature-chip" data-tip="1 if document.write() is used">has_document_write</div> | |
| <div class="feature-chip" data-tip="1 if window.open() is used">has_window_open</div> | |
| <div class="feature-chip" data-tip="1 if location.replace() redirects are used">has_location_replace</div> | |
| <div class="feature-chip" data-tip="1 if meta refresh redirect is present">has_meta_refresh</div> | |
| <div class="feature-chip" data-tip="Number of onclick event handlers">num_onclick_events</div> | |
| <div class="feature-chip" data-tip="Number of onload event handlers">num_onload_events</div> | |
| <div class="feature-chip" data-tip="Number of onerror event handlers">num_onerror_events</div> | |
| </div> | |
| <div class="feature-category-label">Visibility & Interaction Tricks</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="1 if display:none usage is detected">has_display_none</div> | |
| <div class="feature-chip" data-tip="1 if visibility:hidden usage is detected">has_visibility_hidden</div> | |
| <div class="feature-chip" data-tip="1 if right-click is disabled by script">has_right_click_disabled</div> | |
| <div class="feature-chip" data-tip="1 if status bar text customization is attempted">has_status_bar_customization</div> | |
| </div> | |
| <div class="feature-category-label">Contact & Social Engineering Signals</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="1 if raw email address patterns appear in HTML">has_email_address</div> | |
| <div class="feature-chip" data-tip="1 if phone number patterns appear in HTML">has_phone_number</div> | |
| <div class="feature-chip" data-tip="Number of known brand name mentions in HTML text">num_brand_mentions</div> | |
| <div class="feature-chip" data-tip="Number of urgency words (urgent, verify, immediately, etc.)">num_urgency_keywords</div> | |
| </div> | |
| <div class="feature-category-label">Ratios & Proportions</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Number of forms divided by number of input fields — phishing sites often have few forms with many inputs">forms_to_inputs_ratio</div> | |
| <div class="feature-chip" data-tip="Proportion of external links to total links — high ratio indicates off-site redirection">external_to_total_links</div> | |
| <div class="feature-chip" data-tip="Number of scripts divided by total HTML tags — high ratio suggests heavy JavaScript reliance">scripts_to_tags_ratio</div> | |
| <div class="feature-chip" data-tip="Ratio of hidden to visible input fields — hidden fields often used for tracking or obfuscation">hidden_to_visible_inputs</div> | |
| <div class="feature-chip" data-tip="Number of password fields divided by total input fields — phishing forms maximize password collection">password_to_inputs_ratio</div> | |
| <div class="feature-chip" data-tip="Proportion of empty/placeholder links to all links — broken or disguised navigation is suspicious">empty_to_total_links</div> | |
| <div class="feature-chip" data-tip="Number of images divided by total HTML tags — low image ratio suggests text-heavy phishing pages">images_to_tags_ratio</div> | |
| <div class="feature-chip" data-tip="Number of iframes divided by total HTML tags — iframes can hide malicious content or redirects">iframes_to_tags_ratio</div> | |
| </div> | |
| <div class="feature-category-label">Co-occurrence Interactions</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="1 if forms exist AND password fields are present — core phishing indicator">forms_with_passwords</div> | |
| <div class="feature-chip" data-tip="Count of external JavaScript files — malicious JS often hosted externally">external_scripts_links</div> | |
| <div class="feature-chip" data-tip="1 if urgency keywords AND forms both present — common social engineering pattern">urgency_with_forms</div> | |
| <div class="feature-chip" data-tip="1 if brand names AND forms both present — brand impersonation with credential harvesting">brand_with_forms</div> | |
| <div class="feature-chip" data-tip="1 if iframes AND script tags both present — hidden iframes + JS often for malware">iframes_with_scripts</div> | |
| <div class="feature-chip" data-tip="1 if hidden inputs AND external resources both present — obfuscated tracking/redirects">hidden_with_external</div> | |
| </div> | |
| <div class="feature-category-label">Content Density</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Ratio of visible text length to DOM depth — legitimate sites have better content distribution">content_density</div> | |
| <div class="feature-chip" data-tip="Number of form elements divided by total words — form-heavy pages are suspicious">form_density</div> | |
| <div class="feature-chip" data-tip="Number of script tags divided by number of forms — scripts per form indicates obfuscation level">scripts_per_form</div> | |
| <div class="feature-chip" data-tip="Number of links divided by total words — link density compared to content volume">links_per_word</div> | |
| </div> | |
| <div class="feature-category-label">Composite Risk Scores</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="Composite score (0–1) combining form presence, password fields, external links, and scripts">phishing_risk_score</div> | |
| <div class="feature-chip" data-tip="Score (0–1) specifically for form-based threats: password fields, hidden inputs, external actions">form_risk_score</div> | |
| <div class="feature-chip" data-tip="Score (0–1) measuring obfuscation techniques: hidden fields, eval usage, encoding, meta refreshes">obfuscation_score</div> | |
| <div class="feature-chip" data-tip="Score (0–1) measuring legitimacy signals: metadata presence, proper structure, internal links">legitimacy_score</div> | |
| </div> | |
| <div class="feature-category-label">Boolean Flags</div> | |
| <div class="feature-grid"> | |
| <div class="feature-chip" data-tip="1 if any combination of suspicious elements detected (hidden inputs + eval, eval + meta refresh, etc.)">has_suspicious_elements</div> | |
| </div> | |
| </div> | |
| </section> | |
| <!-- TABS: MODEL CATEGORIES --> | |
| <section class="section" style="border-bottom:none;padding-bottom:0"> | |
| <div class="tabs"> | |
| <button class="tab active" onclick="switchTab(event,'urlModels')">URL Models <span class="tab-count">3</span></button> | |
| <button class="tab" onclick="switchTab(event,'htmlModels')">HTML Models <span class="tab-count">2</span></button> | |
| <button class="tab" onclick="switchTab(event,'combinedModels')">Combined <span class="tab-count">2</span></button> | |
| <button class="tab" onclick="switchTab(event,'cnnModels')">CNN <span class="tab-count">2</span></button> | |
| <button class="tab" onclick="switchTab(event,'overview')">Comparison</button> | |
| </div> | |
| <!-- URL MODELS TAB --> | |
| <div id="urlModels" class="tab-content active"> | |
| <div class="section-subtitle"> | |
| 3 models trained on 120 URL-based features extracted from the URL string structure, | |
| domain properties, encoding analysis, and brand impersonation detection. | |
| </div> | |
| <!-- Logistic Regression --> | |
| <div class="model-detail"> | |
| <div class="model-detail-header"> | |
| <div class="model-detail-name">Logistic Regression</div> | |
| <div class="model-detail-type">Baseline</div> | |
| </div> | |
| <div class="metrics-grid"> | |
| <div class="metric-card"> | |
| <div class="metric-value">93.71%</div> | |
| <div class="metric-label">Accuracy</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">95.40%</div> | |
| <div class="metric-label">Precision</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">91.84%</div> | |
| <div class="metric-label">Recall</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">93.59%</div> | |
| <div class="metric-label">F1-Score</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value highlight">0.9789</div> | |
| <div class="metric-label">ROC-AUC</div> | |
| </div> | |
| </div> | |
| <div class="section-title">Confusion Matrix</div> | |
| <div class="confusion-matrix"> | |
| <div class="cm-header"></div> | |
| <div class="cm-header">Pred Legit</div> | |
| <div class="cm-header">Pred Phish</div> | |
| <div class="cm-label">Actual Legit</div> | |
| <div class="cm-cell cm-tn">10,326</div> | |
| <div class="cm-cell cm-fp">478</div> | |
| <div class="cm-label">Actual Phish</div> | |
| <div class="cm-cell cm-fn">881</div> | |
| <div class="cm-cell cm-tp">9,922</div> | |
| </div> | |
| </div> | |
| <!-- Random Forest --> | |
| <div class="model-detail"> | |
| <div class="model-detail-header"> | |
| <div class="model-detail-name">Random Forest</div> | |
| <div class="model-detail-type">Ensemble</div> | |
| </div> | |
| <div class="metrics-grid"> | |
| <div class="metric-card"> | |
| <div class="metric-value">97.63%</div> | |
| <div class="metric-label">Accuracy</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">99.01%</div> | |
| <div class="metric-label">Precision</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">96.22%</div> | |
| <div class="metric-label">Recall</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">97.60%</div> | |
| <div class="metric-label">F1-Score</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value highlight">0.9958</div> | |
| <div class="metric-label">ROC-AUC</div> | |
| </div> | |
| </div> | |
| <div class="section-title">Confusion Matrix</div> | |
| <div class="confusion-matrix"> | |
| <div class="cm-header"></div> | |
| <div class="cm-header">Pred Legit</div> | |
| <div class="cm-header">Pred Phish</div> | |
| <div class="cm-label">Actual Legit</div> | |
| <div class="cm-cell cm-tn">10,700</div> | |
| <div class="cm-cell cm-fp">104</div> | |
| <div class="cm-label">Actual Phish</div> | |
| <div class="cm-cell cm-fn">408</div> | |
| <div class="cm-cell cm-tp">10,395</div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Top 20 Features by Importance</div> | |
| <div class="features-list"> | |
| <div class="feature-row"><span class="feature-rank">1</span><span class="feature-name">domain_length</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:100%"></div></div><span class="feature-importance">0.0500</span></div> | |
| <div class="feature-row"><span class="feature-rank">2</span><span class="feature-name">num_domain_parts</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:94%"></div></div><span class="feature-importance">0.0471</span></div> | |
| <div class="feature-row"><span class="feature-rank">3</span><span class="feature-name">domain_dots</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:91%"></div></div><span class="feature-importance">0.0453</span></div> | |
| <div class="feature-row"><span class="feature-rank">4</span><span class="feature-name">num_subdomains</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:79%"></div></div><span class="feature-importance">0.0393</span></div> | |
| <div class="feature-row"><span class="feature-rank">5</span><span class="feature-name">num_dots</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:67%"></div></div><span class="feature-importance">0.0337</span></div> | |
| <div class="feature-row"><span class="feature-rank">6</span><span class="feature-name">domain_length_category</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:67%"></div></div><span class="feature-importance">0.0335</span></div> | |
| <div class="feature-row"><span class="feature-rank">7</span><span class="feature-name">symbol_ratio_domain</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:65%"></div></div><span class="feature-importance">0.0324</span></div> | |
| <div class="feature-row"><span class="feature-rank">8</span><span class="feature-name">digit_ratio_url</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:60%"></div></div><span class="feature-importance">0.0298</span></div> | |
| <div class="feature-row"><span class="feature-rank">9</span><span class="feature-name">path_length</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:59%"></div></div><span class="feature-importance">0.0297</span></div> | |
| <div class="feature-row"><span class="feature-rank">10</span><span class="feature-name">avg_domain_part_len</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:58%"></div></div><span class="feature-importance">0.0292</span></div> | |
| <div class="feature-row"><span class="feature-rank">11</span><span class="feature-name">num_digits_url</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:57%"></div></div><span class="feature-importance">0.0283</span></div> | |
| <div class="feature-row"><span class="feature-rank">12</span><span class="feature-name">domain_entropy</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:56%"></div></div><span class="feature-importance">0.0282</span></div> | |
| <div class="feature-row"><span class="feature-rank">13</span><span class="feature-name">url_entropy</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:53%"></div></div><span class="feature-importance">0.0266</span></div> | |
| <div class="feature-row"><span class="feature-rank">14</span><span class="feature-name">max_consecutive_digits</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:49%"></div></div><span class="feature-importance">0.0246</span></div> | |
| <div class="feature-row"><span class="feature-rank">15</span><span class="feature-name">special_char_ratio</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:48%"></div></div><span class="feature-importance">0.0242</span></div> | |
| <div class="feature-row"><span class="feature-rank">16</span><span class="feature-name">is_shortened</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:47%"></div></div><span class="feature-importance">0.0237</span></div> | |
| <div class="feature-row"><span class="feature-rank">17</span><span class="feature-name">path_entropy</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:45%"></div></div><span class="feature-importance">0.0225</span></div> | |
| <div class="feature-row"><span class="feature-rank">18</span><span class="feature-name">max_path_segment_len</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:43%"></div></div><span class="feature-importance">0.0215</span></div> | |
| <div class="feature-row"><span class="feature-rank">19</span><span class="feature-name">num_letters_url</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:41%"></div></div><span class="feature-importance">0.0206</span></div> | |
| <div class="feature-row"><span class="feature-rank">20</span><span class="feature-name">path_slashes</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:40%"></div></div><span class="feature-importance">0.0201</span></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- XGBoost --> | |
| <div class="model-detail"> | |
| <div class="model-detail-header"> | |
| <div class="model-detail-name">XGBoost</div> | |
| <div class="model-detail-type">Gradient Boosting</div> | |
| </div> | |
| <div class="metrics-grid"> | |
| <div class="metric-card"> | |
| <div class="metric-value">97.85%</div> | |
| <div class="metric-label">Accuracy</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">99.00%</div> | |
| <div class="metric-label">Precision</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">96.68%</div> | |
| <div class="metric-label">Recall</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">97.82%</div> | |
| <div class="metric-label">F1-Score</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value highlight">0.9953</div> | |
| <div class="metric-label">ROC-AUC</div> | |
| </div> | |
| </div> | |
| <div class="section-title">Confusion Matrix</div> | |
| <div class="confusion-matrix"> | |
| <div class="cm-header"></div> | |
| <div class="cm-header">Pred Legit</div> | |
| <div class="cm-header">Pred Phish</div> | |
| <div class="cm-label">Actual Legit</div> | |
| <div class="cm-cell cm-tn">10,698</div> | |
| <div class="cm-cell cm-fp">106</div> | |
| <div class="cm-label">Actual Phish</div> | |
| <div class="cm-cell cm-fn">359</div> | |
| <div class="cm-cell cm-tp">10,444</div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Top 20 Features by Importance</div> | |
| <div class="features-list"> | |
| <div class="feature-row"><span class="feature-rank">1</span><span class="feature-name">domain_dots</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:100%"></div></div><span class="feature-importance">0.2514</span></div> | |
| <div class="feature-row"><span class="feature-rank">2</span><span class="feature-name">is_shortened</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:60%"></div></div><span class="feature-importance">0.1519</span></div> | |
| <div class="feature-row"><span class="feature-rank">3</span><span class="feature-name">num_subdomains</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:57%"></div></div><span class="feature-importance">0.1423</span></div> | |
| <div class="feature-row"><span class="feature-rank">4</span><span class="feature-name">num_domain_parts</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:20%"></div></div><span class="feature-importance">0.0492</span></div> | |
| <div class="feature-row"><span class="feature-rank">5</span><span class="feature-name">multiple_brands_in_url</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:14%"></div></div><span class="feature-importance">0.0350</span></div> | |
| <div class="feature-row"><span class="feature-rank">6</span><span class="feature-name">is_free_platform</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:11%"></div></div><span class="feature-importance">0.0281</span></div> | |
| <div class="feature-row"><span class="feature-rank">7</span><span class="feature-name">domain_hyphens</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:10%"></div></div><span class="feature-importance">0.0252</span></div> | |
| <div class="feature-row"><span class="feature-rank">8</span><span class="feature-name">path_digits</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:6%"></div></div><span class="feature-importance">0.0149</span></div> | |
| <div class="feature-row"><span class="feature-rank">9</span><span class="feature-name">is_http</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:6%"></div></div><span class="feature-importance">0.0139</span></div> | |
| <div class="feature-row"><span class="feature-rank">10</span><span class="feature-name">platform_subdomain_length</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:5%"></div></div><span class="feature-importance">0.0123</span></div> | |
| <div class="feature-row"><span class="feature-rank">11</span><span class="feature-name">avg_domain_part_len</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:5%"></div></div><span class="feature-importance">0.0121</span></div> | |
| <div class="feature-row"><span class="feature-rank">12</span><span class="feature-name">path_slashes</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:5%"></div></div><span class="feature-importance">0.0119</span></div> | |
| <div class="feature-row"><span class="feature-rank">13</span><span class="feature-name">brand_in_path</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:4%"></div></div><span class="feature-importance">0.0111</span></div> | |
| <div class="feature-row"><span class="feature-rank">14</span><span class="feature-name">domain_length_category</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:4%"></div></div><span class="feature-importance">0.0108</span></div> | |
| <div class="feature-row"><span class="feature-rank">15</span><span class="feature-name">domain_length</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:4%"></div></div><span class="feature-importance">0.0106</span></div> | |
| <div class="feature-row"><span class="feature-rank">16</span><span class="feature-name">symbol_ratio_domain</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:4%"></div></div><span class="feature-importance">0.0100</span></div> | |
| <div class="feature-row"><span class="feature-rank">17</span><span class="feature-name">encoding_diff</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:3%"></div></div><span class="feature-importance">0.0087</span></div> | |
| <div class="feature-row"><span class="feature-rank">18</span><span class="feature-name">num_brands</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:3%"></div></div><span class="feature-importance">0.0077</span></div> | |
| <div class="feature-row"><span class="feature-rank">19</span><span class="feature-name">tld_length</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:3%"></div></div><span class="feature-importance">0.0071</span></div> | |
| <div class="feature-row"><span class="feature-rank">20</span><span class="feature-name">digit_ratio_url</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:3%"></div></div><span class="feature-importance">0.0067</span></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- HTML MODELS TAB --> | |
| <div id="htmlModels" class="tab-content"> | |
| <div class="section-subtitle"> | |
| 2 models trained on 100 HTML-based features extracted from the page structure, | |
| forms, scripts, links, and content analysis of downloaded web pages. | |
| </div> | |
| <!-- Random Forest HTML --> | |
| <div class="model-detail"> | |
| <div class="model-detail-header"> | |
| <div class="model-detail-name">Random Forest HTML</div> | |
| <div class="model-detail-type">Ensemble</div> | |
| </div> | |
| <div class="metrics-grid"> | |
| <div class="metric-card"> | |
| <div class="metric-value">89.65%</div> | |
| <div class="metric-label">Accuracy</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">91.78%</div> | |
| <div class="metric-label">Precision</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">87.11%</div> | |
| <div class="metric-label">Recall</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">89.38%</div> | |
| <div class="metric-label">F1-Score</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value highlight">0.9617</div> | |
| <div class="metric-label">ROC-AUC</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">89.05%</div> | |
| <div class="metric-label">CV F1 (5-fold)</div> | |
| </div> | |
| </div> | |
| <div class="section-title">Confusion Matrix</div> | |
| <div class="confusion-matrix"> | |
| <div class="cm-header"></div> | |
| <div class="cm-header">Pred Legit</div> | |
| <div class="cm-header">Pred Phish</div> | |
| <div class="cm-label">Actual Legit</div> | |
| <div class="cm-cell cm-tn">15,012</div> | |
| <div class="cm-cell cm-fp">1,271</div> | |
| <div class="cm-label">Actual Phish</div> | |
| <div class="cm-cell cm-fn">2,099</div> | |
| <div class="cm-cell cm-tp">14,184</div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Hyperparameters</div> | |
| <div class="params-grid"> | |
| <div class="param-item"><span class="param-key">n_estimators</span><span class="param-value">500</span></div> | |
| <div class="param-item"><span class="param-key">max_depth</span><span class="param-value">35</span></div> | |
| <div class="param-item"><span class="param-key">min_samples_split</span><span class="param-value">2</span></div> | |
| <div class="param-item"><span class="param-key">min_samples_leaf</span><span class="param-value">1</span></div> | |
| <div class="param-item"><span class="param-key">max_features</span><span class="param-value">sqrt</span></div> | |
| <div class="param-item"><span class="param-key">class_weight</span><span class="param-value">balanced</span></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- XGBoost HTML --> | |
| <div class="model-detail"> | |
| <div class="model-detail-header"> | |
| <div class="model-detail-name">XGBoost HTML</div> | |
| <div class="model-detail-type">Gradient Boosting</div> | |
| </div> | |
| <div class="metrics-grid"> | |
| <div class="metric-card"> | |
| <div class="metric-value">89.07%</div> | |
| <div class="metric-label">Accuracy</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">90.27%</div> | |
| <div class="metric-label">Precision</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">87.56%</div> | |
| <div class="metric-label">Recall</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">88.90%</div> | |
| <div class="metric-label">F1-Score</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value highlight">0.9590</div> | |
| <div class="metric-label">ROC-AUC</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">88.87%</div> | |
| <div class="metric-label">CV F1 (5-fold)</div> | |
| </div> | |
| </div> | |
| <div class="section-title">Confusion Matrix</div> | |
| <div class="confusion-matrix"> | |
| <div class="cm-header"></div> | |
| <div class="cm-header">Pred Legit</div> | |
| <div class="cm-header">Pred Phish</div> | |
| <div class="cm-label">Actual Legit</div> | |
| <div class="cm-cell cm-tn">14,747</div> | |
| <div class="cm-cell cm-fp">1,536</div> | |
| <div class="cm-label">Actual Phish</div> | |
| <div class="cm-cell cm-fn">2,025</div> | |
| <div class="cm-cell cm-tp">14,258</div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Hyperparameters</div> | |
| <div class="params-grid"> | |
| <div class="param-item"><span class="param-key">n_estimators</span><span class="param-value">600</span></div> | |
| <div class="param-item"><span class="param-key">max_depth</span><span class="param-value">8</span></div> | |
| <div class="param-item"><span class="param-key">learning_rate</span><span class="param-value">0.05</span></div> | |
| <div class="param-item"><span class="param-key">subsample</span><span class="param-value">0.8</span></div> | |
| <div class="param-item"><span class="param-key">colsample_bytree</span><span class="param-value">0.8</span></div> | |
| <div class="param-item"><span class="param-key">min_child_weight</span><span class="param-value">3</span></div> | |
| <div class="param-item"><span class="param-key">gamma</span><span class="param-value">0.1</span></div> | |
| <div class="param-item"><span class="param-key">reg_alpha</span><span class="param-value">0.1</span></div> | |
| <div class="param-item"><span class="param-key">reg_lambda</span><span class="param-value">1.0</span></div> | |
| <div class="param-item"><span class="param-key">early_stopping</span><span class="param-value">50 rounds</span></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- COMBINED MODELS TAB --> | |
| <div id="combinedModels" class="tab-content"> | |
| <div class="section-subtitle"> | |
| 2 models trained on 221 combined features (121 URL + 100 HTML) for maximum detection accuracy. | |
| </div> | |
| <!-- Random Forest Combined --> | |
| <div class="model-detail"> | |
| <div class="model-detail-header"> | |
| <div class="model-detail-name">Random Forest Combined</div> | |
| <div class="model-detail-type">Ensemble</div> | |
| </div> | |
| <div class="metrics-grid"> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.60%</div> | |
| <div class="metric-label">Accuracy</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">99.16%</div> | |
| <div class="metric-label">Precision</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.02%</div> | |
| <div class="metric-label">Recall</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.59%</div> | |
| <div class="metric-label">F1-Score</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value highlight">0.9990</div> | |
| <div class="metric-label">ROC-AUC</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.59%</div> | |
| <div class="metric-label">CV F1 (5-fold)</div> | |
| </div> | |
| </div> | |
| <div class="section-title">Confusion Matrix</div> | |
| <div class="confusion-matrix"> | |
| <div class="cm-header"></div> | |
| <div class="cm-header">Pred Legit</div> | |
| <div class="cm-header">Pred Phish</div> | |
| <div class="cm-label">Actual Legit</div> | |
| <div class="cm-cell cm-tn">10,680</div> | |
| <div class="cm-cell cm-fp">89</div> | |
| <div class="cm-label">Actual Phish</div> | |
| <div class="cm-cell cm-fn">213</div> | |
| <div class="cm-cell cm-tp">10,556</div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Feature Importance Split</div> | |
| <div class="feature-split"> | |
| <div class="feature-split-bar"> | |
| <div class="split-url" style="width:29.1%">URL 29.1%</div> | |
| <div class="split-html" style="width:70.9%">HTML 70.9%</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Top 15 Features by Importance</div> | |
| <div class="features-list"> | |
| <div class="feature-row"><span class="feature-rank">1</span><span class="feature-name">html_num_links</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:100%"></div></div><span class="feature-importance">0.0640</span></div> | |
| <div class="feature-row"><span class="feature-rank">2</span><span class="feature-name">html_text_length</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:90%"></div></div><span class="feature-importance">0.0577</span></div> | |
| <div class="feature-row"><span class="feature-rank">3</span><span class="feature-name">html_num_tags</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:75%"></div></div><span class="feature-importance">0.0479</span></div> | |
| <div class="feature-row"><span class="feature-rank">4</span><span class="feature-name">html_num_internal_links</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:72%"></div></div><span class="feature-importance">0.0463</span></div> | |
| <div class="feature-row"><span class="feature-rank">5</span><span class="feature-name">html_num_words</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:66%"></div></div><span class="feature-importance">0.0422</span></div> | |
| <div class="feature-row"><span class="feature-rank">6</span><span class="feature-name">html_external_scripts_links</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:56%"></div></div><span class="feature-importance">0.0361</span></div> | |
| <div class="feature-row"><span class="feature-rank">7</span><span class="feature-name">html_num_divs</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:46%"></div></div><span class="feature-importance">0.0297</span></div> | |
| <div class="feature-row"><span class="feature-rank">8</span><span class="feature-name">html_num_lists</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:45%"></div></div><span class="feature-importance">0.0291</span></div> | |
| <div class="feature-row"><span class="feature-rank">9</span><span class="feature-name">html_num_external_links</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:43%"></div></div><span class="feature-importance">0.0276</span></div> | |
| <div class="feature-row"><span class="feature-rank">10</span><span class="feature-name">html_has_description</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:40%"></div></div><span class="feature-importance">0.0258</span></div> | |
| <div class="feature-row"><span class="feature-rank">11</span><span class="feature-name">html_num_unique_external_domains</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:37%"></div></div><span class="feature-importance">0.0236</span></div> | |
| <div class="feature-row"><span class="feature-rank">12</span><span class="feature-name">html_num_images</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:36%"></div></div><span class="feature-importance">0.0231</span></div> | |
| <div class="feature-row"><span class="feature-rank">13</span><span class="feature-name">html_num_spans</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:35%"></div></div><span class="feature-importance">0.0226</span></div> | |
| <div class="feature-row"><span class="feature-rank">14</span><span class="feature-name">html_num_headings</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:34%"></div></div><span class="feature-importance">0.0220</span></div> | |
| <div class="feature-row"><span class="feature-rank">15</span><span class="feature-name">html_dom_depth</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:33%"></div></div><span class="feature-importance">0.0210</span></div> | |
| </div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Hyperparameters</div> | |
| <div class="params-grid"> | |
| <div class="param-item"><span class="param-key">n_estimators</span><span class="param-value">533</span></div> | |
| <div class="param-item"><span class="param-key">max_depth</span><span class="param-value">43</span></div> | |
| <div class="param-item"><span class="param-key">min_samples_split</span><span class="param-value">2</span></div> | |
| <div class="param-item"><span class="param-key">max_features</span><span class="param-value">sqrt</span></div> | |
| <div class="param-item"><span class="param-key">class_weight</span><span class="param-value">balanced</span></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- XGBoost Combined --> | |
| <div class="model-detail"> | |
| <div class="model-detail-header"> | |
| <div class="model-detail-name">XGBoost Combined</div> | |
| <div class="model-detail-type">Gradient Boosting</div> | |
| </div> | |
| <div class="metrics-grid"> | |
| <div class="metric-card"> | |
| <div class="metric-value">99.01%</div> | |
| <div class="metric-label">Accuracy</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">99.35%</div> | |
| <div class="metric-label">Precision</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.66%</div> | |
| <div class="metric-label">Recall</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">99.01%</div> | |
| <div class="metric-label">F1-Score</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value highlight">0.9991</div> | |
| <div class="metric-label">ROC-AUC</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.90%</div> | |
| <div class="metric-label">CV F1 (5-fold)</div> | |
| </div> | |
| </div> | |
| <div class="section-title">Confusion Matrix</div> | |
| <div class="confusion-matrix"> | |
| <div class="cm-header"></div> | |
| <div class="cm-header">Pred Legit</div> | |
| <div class="cm-header">Pred Phish</div> | |
| <div class="cm-label">Actual Legit</div> | |
| <div class="cm-cell cm-tn">10,700</div> | |
| <div class="cm-cell cm-fp">69</div> | |
| <div class="cm-label">Actual Phish</div> | |
| <div class="cm-cell cm-fn">144</div> | |
| <div class="cm-cell cm-tp">10,625</div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Feature Importance Split</div> | |
| <div class="feature-split"> | |
| <div class="feature-split-bar"> | |
| <div class="split-url" style="width:37.1%">URL 37.1%</div> | |
| <div class="split-html" style="width:62.9%">HTML 62.9%</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Top 15 Features by Importance</div> | |
| <div class="features-list"> | |
| <div class="feature-row"><span class="feature-rank">1</span><span class="feature-name">html_num_links</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:100%"></div></div><span class="feature-importance">0.4420</span></div> | |
| <div class="feature-row"><span class="feature-rank">2</span><span class="feature-name">url_is_shortened</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:10%"></div></div><span class="feature-importance">0.0427</span></div> | |
| <div class="feature-row"><span class="feature-rank">3</span><span class="feature-name">url_platform_subdomain_length</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:9%"></div></div><span class="feature-importance">0.0397</span></div> | |
| <div class="feature-row"><span class="feature-rank">4</span><span class="feature-name">url_domain_dots</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:7%"></div></div><span class="feature-importance">0.0315</span></div> | |
| <div class="feature-row"><span class="feature-rank">5</span><span class="feature-name">html_has_fromcharcode</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:7%"></div></div><span class="feature-importance">0.0296</span></div> | |
| <div class="feature-row"><span class="feature-rank">6</span><span class="feature-name">url_num_domain_parts</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:6%"></div></div><span class="feature-importance">0.0269</span></div> | |
| <div class="feature-row"><span class="feature-rank">7</span><span class="feature-name">html_has_meta_refresh</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:3%"></div></div><span class="feature-importance">0.0148</span></div> | |
| <div class="feature-row"><span class="feature-rank">8</span><span class="feature-name">url_is_http</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:3%"></div></div><span class="feature-importance">0.0126</span></div> | |
| <div class="feature-row"><span class="feature-rank">9</span><span class="feature-name">url_encoding_diff</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:3%"></div></div><span class="feature-importance">0.0124</span></div> | |
| <div class="feature-row"><span class="feature-rank">10</span><span class="feature-name">url_path_digits</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:3%"></div></div><span class="feature-importance">0.0116</span></div> | |
| <div class="feature-row"><span class="feature-rank">11</span><span class="feature-name">html_text_length</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:2%"></div></div><span class="feature-importance">0.0107</span></div> | |
| <div class="feature-row"><span class="feature-rank">12</span><span class="feature-name">url_path_slashes</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:2%"></div></div><span class="feature-importance">0.0105</span></div> | |
| <div class="feature-row"><span class="feature-rank">13</span><span class="feature-name">url_multiple_brands_in_url</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:2%"></div></div><span class="feature-importance">0.0103</span></div> | |
| <div class="feature-row"><span class="feature-rank">14</span><span class="feature-name">url_brand_in_path</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:2%"></div></div><span class="feature-importance">0.0102</span></div> | |
| <div class="feature-row"><span class="feature-rank">15</span><span class="feature-name">url_domain_hyphens</span><div class="importance-bar-bg"><div class="importance-bar-fill" style="width:2%"></div></div><span class="feature-importance">0.0095</span></div> | |
| </div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Hyperparameters</div> | |
| <div class="params-grid"> | |
| <div class="param-item"><span class="param-key">n_estimators</span><span class="param-value">726</span></div> | |
| <div class="param-item"><span class="param-key">max_depth</span><span class="param-value">6</span></div> | |
| <div class="param-item"><span class="param-key">learning_rate</span><span class="param-value">0.137</span></div> | |
| <div class="param-item"><span class="param-key">subsample</span><span class="param-value">0.698</span></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- CNN MODELS TAB --> | |
| <div id="cnnModels" class="tab-content"> | |
| <div class="section-subtitle"> | |
| 2 character-level CNN models that process raw text directly — no hand-crafted features needed. | |
| Parallel Conv1D branches with kernel sizes (3, 5, 7) capture patterns at different scales. | |
| </div> | |
| <!-- CNN URL --> | |
| <div class="model-detail"> | |
| <div class="model-detail-header"> | |
| <div class="model-detail-name">CNN URL (Char-level)</div> | |
| <div class="model-detail-type">Deep Learning</div> | |
| </div> | |
| <div class="metrics-grid"> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.38%</div> | |
| <div class="metric-label">Accuracy</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.88%</div> | |
| <div class="metric-label">Precision</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">97.86%</div> | |
| <div class="metric-label">Recall</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.37%</div> | |
| <div class="metric-label">F1-Score</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value highlight">0.9976</div> | |
| <div class="metric-label">ROC-AUC</div> | |
| </div> | |
| </div> | |
| <div class="section-title">Confusion Matrix</div> | |
| <div class="confusion-matrix"> | |
| <div class="cm-header"></div> | |
| <div class="cm-header">Pred Legit</div> | |
| <div class="cm-header">Pred Phish</div> | |
| <div class="cm-label">Actual Legit</div> | |
| <div class="cm-cell cm-tn">8,013</div> | |
| <div class="cm-cell cm-fp">90</div> | |
| <div class="cm-label">Actual Phish</div> | |
| <div class="cm-cell cm-fn">173</div> | |
| <div class="cm-cell cm-tp">7,930</div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Architecture</div> | |
| <div class="params-grid"> | |
| <div class="param-item"><span class="param-key">Input</span><span class="param-value">Raw URL characters</span></div> | |
| <div class="param-item"><span class="param-key">max_len</span><span class="param-value">800</span></div> | |
| <div class="param-item"><span class="param-key">vocab_size</span><span class="param-value">87</span></div> | |
| <div class="param-item"><span class="param-key">Conv1D kernels</span><span class="param-value">3, 5, 7</span></div> | |
| <div class="param-item"><span class="param-key">Dataset</span><span class="param-value">108,034 URLs</span></div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- CNN HTML --> | |
| <div class="model-detail"> | |
| <div class="model-detail-header"> | |
| <div class="model-detail-name">CNN HTML (Char-level)</div> | |
| <div class="model-detail-type">Deep Learning</div> | |
| </div> | |
| <div class="metrics-grid"> | |
| <div class="metric-card"> | |
| <div class="metric-value">96.33%</div> | |
| <div class="metric-label">Accuracy</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">98.18%</div> | |
| <div class="metric-label">Precision</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">94.41%</div> | |
| <div class="metric-label">Recall</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value">96.26%</div> | |
| <div class="metric-label">F1-Score</div> | |
| </div> | |
| <div class="metric-card"> | |
| <div class="metric-value highlight">0.9908</div> | |
| <div class="metric-label">ROC-AUC</div> | |
| </div> | |
| </div> | |
| <div class="section-title">Confusion Matrix</div> | |
| <div class="confusion-matrix"> | |
| <div class="cm-header"></div> | |
| <div class="cm-header">Pred Legit</div> | |
| <div class="cm-header">Pred Phish</div> | |
| <div class="cm-label">Actual Legit</div> | |
| <div class="cm-cell cm-tn">5,943</div> | |
| <div class="cm-cell cm-fp">106</div> | |
| <div class="cm-label">Actual Phish</div> | |
| <div class="cm-cell cm-fn">338</div> | |
| <div class="cm-cell cm-tp">5,711</div> | |
| </div> | |
| <div class="subsection"> | |
| <div class="section-title">Architecture</div> | |
| <div class="params-grid"> | |
| <div class="param-item"><span class="param-key">Input</span><span class="param-value">Raw HTML source</span></div> | |
| <div class="param-item"><span class="param-key">max_len</span><span class="param-value">5,000</span></div> | |
| <div class="param-item"><span class="param-key">vocab_size</span><span class="param-value">100</span></div> | |
| <div class="param-item"><span class="param-key">Conv1D kernels</span><span class="param-value">3, 5, 7</span></div> | |
| <div class="param-item"><span class="param-key">Dataset</span><span class="param-value">80,652 HTML pages</span></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- COMPARISON TAB --> | |
| <div id="overview" class="tab-content"> | |
| <div class="section-subtitle"> | |
| Side-by-side comparison of all 9 models across URL, HTML, Combined, and CNN categories. | |
| </div> | |
| <div class="section-title">All Models</div> | |
| <div class="table-scroll"> | |
| <table class="comparison-table"> | |
| <thead> | |
| <tr> | |
| <th>Model</th> | |
| <th>Category</th> | |
| <th>Accuracy</th> | |
| <th>Precision</th> | |
| <th>Recall</th> | |
| <th>F1-Score</th> | |
| <th>ROC-AUC</th> | |
| <th>Features</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td class="model-name-cell">Logistic Regression</td> | |
| <td>URL</td> | |
| <td>93.71%</td> | |
| <td>95.40%</td> | |
| <td>91.84%</td> | |
| <td>93.59%</td> | |
| <td>0.9789</td> | |
| <td>121</td> | |
| </tr> | |
| <tr> | |
| <td class="model-name-cell">Random Forest</td> | |
| <td>URL</td> | |
| <td>97.71%</td> | |
| <td>99.06%</td> | |
| <td>96.33%</td> | |
| <td>97.68%</td> | |
| <td>0.9958</td> | |
| <td>121</td> | |
| </tr> | |
| <tr> | |
| <td class="model-name-cell">XGBoost</td> | |
| <td>URL</td> | |
| <td>98.07%</td> | |
| <td>99.12%</td> | |
| <td>97.00%</td> | |
| <td>98.05%</td> | |
| <td>0.9963</td> | |
| <td>121</td> | |
| </tr> | |
| <tr> | |
| <td class="model-name-cell">Random Forest HTML</td> | |
| <td>HTML</td> | |
| <td>88.03%</td> | |
| <td>87.49%</td> | |
| <td>88.74%</td> | |
| <td>88.11%</td> | |
| <td>0.9561</td> | |
| <td>100</td> | |
| </tr> | |
| <tr> | |
| <td class="model-name-cell">XGBoost HTML</td> | |
| <td>HTML</td> | |
| <td>87.86%</td> | |
| <td>86.45%</td> | |
| <td>89.80%</td> | |
| <td>88.09%</td> | |
| <td>0.9557</td> | |
| <td>100</td> | |
| </tr> | |
| <tr> | |
| <td class="model-name-cell">RF Combined</td> | |
| <td>Combined</td> | |
| <td>98.60%</td> | |
| <td>99.16%</td> | |
| <td>98.02%</td> | |
| <td>98.59%</td> | |
| <td>0.9990</td> | |
| <td>221</td> | |
| </tr> | |
| <tr> | |
| <td class="model-name-cell">XGBoost Combined</td> | |
| <td>Combined</td> | |
| <td class="best">99.01%</td> | |
| <td class="best">99.35%</td> | |
| <td class="best">98.66%</td> | |
| <td class="best">99.01%</td> | |
| <td class="best">0.9991</td> | |
| <td>221</td> | |
| </tr> | |
| <tr> | |
| <td class="model-name-cell">CNN URL</td> | |
| <td>CNN</td> | |
| <td>98.38%</td> | |
| <td>98.88%</td> | |
| <td>97.86%</td> | |
| <td>98.37%</td> | |
| <td>0.9976</td> | |
| <td>chars</td> | |
| </tr> | |
| <tr> | |
| <td class="model-name-cell">CNN HTML</td> | |
| <td>CNN</td> | |
| <td>96.33%</td> | |
| <td>98.18%</td> | |
| <td>94.41%</td> | |
| <td>96.26%</td> | |
| <td>0.9908</td> | |
| <td>chars</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| <div class="section-title">Key Insights</div> | |
| <div class="insights-grid"> | |
| <div class="insight-card insight-safe"> | |
| <div class="insight-label">Best Overall</div> | |
| <div class="insight-title">XGBoost Combined</div> | |
| <div class="insight-desc">99.01% accuracy, 99.35% precision — best performance by combining 121 URL + 100 HTML features.</div> | |
| </div> | |
| <div class="insight-card insight-safe"> | |
| <div class="insight-label">Ensemble Strength</div> | |
| <div class="insight-title">9-Model Consensus</div> | |
| <div class="insight-desc">Combining 3 URL + 2 HTML + 2 Combined + 2 CNN models via majority vote maximizes reliability.</div> | |
| </div> | |
| <div class="insight-card insight-accent"> | |
| <div class="insight-label">Top Signal</div> | |
| <div class="insight-title">html_num_links</div> | |
| <div class="insight-desc">Number of links in HTML dominates XGBoost Combined at 44.2% importance — the single strongest feature.</div> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <footer> | |
| <div class="footer-text">Machine Learning Phishing Detection</div> | |
| </footer> | |
| </div> | |
| <script src="/static/script.js?v=4"></script> | |
| </body> | |
| </html> | |