Downloads · 30 days
0
AnzouKiona/phishlens-agents
phishlens-agents is a tabular classification model from AnzouKiona. Use it for the tabular classification task on the model card, and read the license before you ship it in a product. It is set up for sklearn. The card lists the license as mit.
Two scikit-learn Random Forest classifiers used by PhishLens, a Chrome extension and FastAPI backend that detects phishing emails in Gmail and Outlook and explains its verdicts. They sit next to a fine-tuned DistilBER…
Downloads · 30 days
0
Access
Public
Updated Oct 15, 2026
Repo size
6.5 MB
Likes
0
Public
Click a slice to open those files.
.skops5.2 MB · 79%
From the Hugging Face model README
Two scikit-learn Random Forest classifiers used by PhishLens, a Chrome extension and FastAPI backend that detects phishing emails in Gmail and Outlook and explains its verdicts. They sit next to a fine-tuned DistilBERT text classifier (AnzouKiona/phishlens-distilbert); the three scores are fused and then adjusted with SPF / DKIM / DMARC results and URL threat intelligence.
| File | Agent | Input | Held-out F1 | ROC-AUC |
|---|---|---|---|---|
url_agent.skops | URL agent | 23 features of the links in the email | 0.9911 | 0.9969 |
metadata_agent.skops | Metadata agent | 37 header features (SPF, DKIM, DMARC, Reply-To, routing, subject) | 0.9994 | 1.0000 |
The .joblib files are the original exports and are kept for
reproducibility only. Use the .skops files: they load without pickle.
Each file holds a dict with model (RandomForestClassifier), scaler
(StandardScaler), feature_names and training metadata. Features must
be produced by FeatureExtractor from
feature_extraction.py,
in the order given by feature_names.
from huggingface_hub import hf_hub_download
import skops.io as sio
path = hf_hub_download("AnzouKiona/phishlens-agents", "url_agent.skops")
untrusted = sio.get_untrusted_types(file=path)
# Only accept scikit-learn / NumPy / SciPy / builtins types.
assert all(t.startswith(("sklearn.", "numpy.", "scipy.", "builtins.")) for t in untrusted)
state = sio.load(path, trusted=untrusted)
X = state["scaler"].transform(features_df[state["feature_names"]].values)
p_phishing = state["model"].predict_proba(X)[:, 1]
The PhishLens backend does exactly this at startup (agent_io.py).
Trained in the PhishingDetector
notebooks on a multi-source .eml corpus: rf-peixoto/phishing_pot and
the Nazario corpus (phishing), Enron ham (legitimate), and the Cisco
Umbrella top-1m list for legitimate URLs. Trained with scikit-learn
1.6.1; the skops files were produced from those models under
scikit-learn 1.9.1 and reproduce their predictions exactly.
B.Sc. final-year project, Department of Cybersecurity, Nile University of Nigeria, 2025/2026. Released under the MIT License.