TriageLens - Part 1: Business understanding
TriageLens
TriageLens is a queue assistant for a security operations centre (SOC), built and tested on Microsoft's GUIDE dataset. This part covers the first CRISP-DM step: context, problem, objectives and success criteria. Anything we could not check is marked "unverified".
The problem A tier-1 analyst faces a queue that is too long to read in full. Most incidents are false alarms or harmless, and about one in five is a real attack.
01 - Context
Context
A SOC watches an organisation's security tools and reacts to what they report. Detection products (endpoint, email, identity, cloud) raise alerts. Related alerts are grouped into incidents, and each incident carries pieces of evidence: the devices, accounts, files, IP addresses and URLs involved.
A tier-1 analyst reads incidents one by one and closes or escalates each.
Analysts get more alerts than they can read. In Vectra's 2024 survey of 2,000 practitioners, SOC teams received 3,832 alerts per day and ignored 62%. They could handle only 38% and called 16% real attacks.
In Splunk's State of Security 2025, 59% of respondents have too many alerts, 55% too many false positives, 52% an overworked team, and 52% have thought about quitting cybersecurity over stress.
Missed attacks are expensive. IBM's Cost of a Data Breach Report 2026 puts the average breach at USD 4.99 million, taking 247 days on average to identify and contain. Breaches lasting over 200 days cost USD 5.65 million, against USD 4.32 million for shorter ones.
GUIDE adds measured data. Microsoft released it in 2024 from Defender XDR telemetry, graded by each customer's analysts: over 13 million pieces of evidence, 1.6 million alerts and 1 million incidents from 6.1k organisations, covering 441 MITRE ATT&CK techniques and 33 entity types. Kaggle version 2 (July 2026) adds expert ranks for 9,980 test incidents across 499 organisation queues.
In the files we downloaded, 23,670 of the 1,033,998 incidents have no grade. The remaining 1,010,328 split into 49.0% benign positive, 30.4% false positive and 20.6% true positive.
02 - Problem
The business problem
A tier-1 analyst faces a queue that is too long to read in full. Most incidents are false alarms or harmless, and about one in five is a real attack. Three questions follow:
- Is it real? (true positive, benign positive or false positive)
- Which incidents should be read first?
- Which can be closed unread, and at what risk?
A new customer has no history in the training data, yet in GUIDE's official split 4,054 of the 4,400 test organisations also appear in training. Scores there mostly reflect known organisations.
A per-detector lookup shows the gap: macro-F1 0.68 on the official split, but 0.43 on organisations it has never seen. Closing that gap is the problem TriageLens addresses. Both scores are reproduced in the Part 2 notebook (0.6769 and 0.4324).
03 - Objectives
Objectives
TriageLens supports a tier-1 SOC analyst. The analyst decides; the tool proposes.
- Grade each incident as true positive (TP), benign positive (BP) or false positive (FP), with a confidence and the reasons behind it (detectors, categories, ATT&CK techniques, entity types).
- Rank each organisation's queue so the incidents worth reading come first.
- Propose auto-closes only where the chance of closing a real attack is held below a fixed limit, and send everything else to the analyst.
- Measure honestly on unseen organisations and on newer data, next to the official split.
- Describe the groups: cluster incidents and check whether outliers are more often attacks.
The grade-then-gate design is inspired by decision models, new in 2026, which return one choice from a fixed list with a calibrated confidence instead of free text. We build our own with course methods, with no paid API.
04 - Problem types
Problem types
-
01
Grade
Multi-class classification - Binary classification with a cost-based threshold - Fine-tuned language model
- KNN
- linear SVM
- RBF SVM (on a subsample)
- logistic regression
- class weights vs undersampling
- Not a course algorithm: LoRA fine-tune of Qwen3-8B on Tinker vs zero-shot and the best scikit-learn model
- Incident grade
- TP, BP or FP
- Real attack or not
- TP vs not TP, with a probability for auto-close
- Grade from text (extra)
- The grade, from incident text
-
02
Rank
Recommender system
- Content-based
- collaborative filtering (user-based, item-based, TruncatedSVD) on the organisation x detector false-alarm matrix
- hybrid
- Queue order
- Which incidents to read first
-
03
Patterns
Regression - Clustering - Anomaly detection
- Ridge regression
- K-Means
- CAH (at most 20,000 sampled incidents)
- DBSCAN on PCA features
- DBSCAN noise vs TP labels
- False-alarm rate
- FP share per organisation-detector pair
- Incident groups
- Groups of similar incidents
- Unusual incidents
- Are BP/FP outliers more often TP?
| Task | What is predicted | ML type | Course algorithms |
|---|---|---|---|
| Incident grade | TP, BP or FP | Multi-class classification | KNN, linear SVM, RBF SVM (on a subsample), logistic regression |
| Real attack or not | TP vs not TP, with a probability for auto-close | Binary classification with a cost-based threshold | Same four; class weights vs undersampling |
| False-alarm rate | FP share per organisation-detector pair | Regression | Ridge regression |
| Incident groups | Groups of similar incidents | Clustering | K-Means, CAH (at most 20,000 sampled incidents), DBSCAN on PCA features |
| Unusual incidents | Are BP/FP outliers more often TP? | Anomaly detection | DBSCAN noise vs TP labels |
| Queue order | Which incidents to read first | Recommender system | Content-based; collaborative filtering (user-based, item-based, TruncatedSVD) on the organisation x detector false-alarm matrix; hybrid |
| Grade from text (extra) | The grade, from incident text | Fine-tuned language model | Not a course algorithm: LoRA fine-tune of Qwen3-8B on Tinker vs zero-shot and the best scikit-learn model |
05 - Questions
Questions the model answers
On a single incident:
- Is it TP, BP or FP, and how confident is the model?
- Which features and ATT&CK techniques drove that grade?
- Can it be closed without review?
On the queue:
- Which incidents should I read first, and how many of the top 10 match the experts' top 10?
On the evaluation:
- How well does it grade unseen organisations versus known ones?
- Does a model trained before 10 June 2024 work after it?
- Which organisation-detector pairs raise the most false alarms?
- Do incidents form groups, and are outliers more often real attacks?
06 - Success criteria
Success criteria
| Criterion | Target | Reference point |
|---|---|---|
| Grade quality on unseen organisations | Macro-F1 >= 0.60 on the 20% of organisations held out | Per-detector lookup: 0.43 unseen, 0.68 official split |
| Queue ranking | Precision@10 > 0.38 against the expert top-K, macro-averaged across organisation queues | Detector-rarity reference: 0.32 on the 111 held-out queues. Picking 10 incidents at random scores 0.07 |
| Safe auto-close | Auto-close only at a threshold fixed on validation data where at most 1% of auto-closed incidents are TP | Everything above the threshold goes to the analyst |
| Drift | Macro-F1 training before 10 June 2024, testing after | Same model on the organisation split |
| Honest reporting | Unseen-organisation scores shown next to the official split | Official split as optimistic reference |
How the splits are built:
- Final test: 20% of organisations held out from training and tuning (1,144 organisations with 188,378 graded incidents, seed 42).
- Tuning: 5-fold GroupKFold on
OrgId. - Time split: incidents run from 20 November 2023 to 17 June 2024 (UTC); 534,581 start before 10 June 2024 and 499,417 on or after (ungraded included).
Macro-F1 is the main metric because the classes are unbalanced (the GUIDE authors recommend it too); accuracy would reward always predicting benign positive.
07 - Error costs
Error-cost table
A missed attack is worse than a false alarm. The GUIDE authors agree: they call misclassifying a TP as BP or FP "the more critical incident misclassification".
Alahmadi et al. (USENIX Security 2022) argue the other side: false positives are equally critical, because they bury real alerts and wear analysts down. Auto-close exists to cut false-alarm load, and its threshold exists to limit missed attacks.
Severity is qualitative: we have no measured cost per incident, so we invent none.
| Actual grade down / Action -> | Auto-closed (not read) | Sent to analyst, low in queue | Sent to analyst, top of queue |
|---|---|---|---|
| True positive(real attack) | |||
| Benign positive(real but harmless activity) | |||
| False positive(detector misfired) |
Select a cell to see why.
Critical True positive - Auto-closed (not read)
The attack goes unseen and keeps running. This is the error the 1% limit controls.
"The TP-or-not threshold is set from this table, not at 0.5."
High True positive - Sent to analyst, low in queue
The attack is seen late, after other work.
"A missed attack is worse than a false alarm."
Correct True positive - Sent to analyst, top of queue
"Rank each organisation's queue so the incidents worth reading come first."
Correct Benign positive - Auto-closed (not read)
"Auto-close exists to cut false-alarm load, and its threshold exists to limit missed attacks."
Low Benign positive - Sent to analyst, low in queue
Some analyst time spent.
"Confusing BP with FP is the mildest error, because both lead to closing the incident."
Medium Benign positive - Sent to analyst, top of queue
Analyst time spent before real attacks lower in the queue.
"Alahmadi et al. (USENIX Security 2022) argue the other side: false positives are equally critical, because they bury real alerts and wear analysts down."
Correct False positive - Auto-closed (not read)
"Auto-close exists to cut false-alarm load, and its threshold exists to limit missed attacks."
Low False positive - Sent to analyst, low in queue
Some analyst time spent.
"Confusing BP with FP is the mildest error, because both lead to closing the incident."
Medium False positive - Sent to analyst, top of queue
Analyst time spent and trust in the tool drops.
"Alahmadi et al. (USENIX Security 2022) argue the other side: false positives are equally critical, because they bury real alerts and wear analysts down."
Auto-close explorer
Move the threshold. Incidents whose example score is at or above it are proposed for auto-close; the rest go to the analyst's queue. The rule: true positives must be at most 1% of the auto-closed incidents.
Turn on JavaScript to move the threshold. The numbers below are for the default threshold.
- TP (true positive)
- BP (benign positive)
- FP (false positive)
- proposed for auto-close
Threshold 0.85
58 proposed for auto-close, of which 1 TP (1.7%)
142 sent to the analyst's queue, of which 40 TP
Breaks the rule: TP share 1.7% > 1%
The class mix of this example set (98 BP, 61 FP, 41 TP) roughly follows the graded GUIDE incidents. Every score is made up. On this example set, the lowest threshold that meets the rule is 0.89. In the project the threshold is not picked by eye: "Auto-close only at a threshold fixed on validation data where at most 1% of auto-closed incidents are TP".
- The TP-or-not threshold is set from this table, not at 0.5.
- Confusing BP with FP is the mildest error, because both lead to closing the incident. It is also the most common error in the GUIDE paper.
08 - Flow
TriageLens flow
- Step 1 Evidence rows
- Step 2 One row per incident
- Step 3 Graded
- Step 4 Ranked in the queue
- Step 5 Auto-close gate
- Step 6 The analyst decides
09 - Data source
Data source
| Item | Value |
|---|---|
| Dataset | Microsoft GUIDE on Kaggle, version 2, updated 18 July 2026 |
| Paper | Freitas et al., "AI-Driven Guided Response for Security Operation Centers with Microsoft Copilot for Security", arXiv 2407.09017 v4 |
| Ranking labels | Freitas, Gharib, Magenheim, "Adaptive Incident Prioritization for Security Operations at Scale", arXiv 2607.16963 (cite with the ranks) |
| Licence | CDLA-Permissive-2.0, per the Kaggle page |
| Download | One zip of 538,287,656 bytes that unzips to 3,513,509,243 bytes. Kaggle's API serves it without a login. |
All row and incident counts in this part were counted from the Kaggle files.
| File | Size (bytes) | Data rows | Content |
|---|---|---|---|
GUIDE_Train.csv | 2,425,409,087 | 9,516,837 | Training evidence, 45 columns |
GUIDE_Test.csv | 1,087,963,831 | 4,147,992 | Test evidence, same columns plus Usage |
GUIDE_Test_Queue_Rankings.csv | 136,325 | 9,980 | OrgId, IncidentId, QueueRank: expert top 20 for each of 499 organisations |
From the repository root:
python scripts/download_guide.py
The script saves the files to data/raw/, skips ones already there, counts rows and prints PASS or FAIL. It uses only the standard library; our run passed in under a minute.
Notes on the data:
- The paper says "a two-week period", but timestamps span 20 November 2023 to 17 June 2024. Part 2 confirmed the span. The release perturbs timestamps, so the dates are only relative.
- The paper counts 441 ATT&CK techniques overall;
GUIDE_Train.csvalone has 432. - The paper and Kaggle card describe a
Rankand a split column; the file hasQueueRankand no split. GUIDE_Test.csvhas an extraUsagecolumn (2,915,437 rowsPublic, 1,232,555Private). What it marks is unverified (probably a leaderboard split); it is not a feature.- The ranks are about investigation priority, not about the grade: a top-ranked incident is not always a true positive.
10 - Ethics
Ethics
- Real telemetry. The data is anonymised customer data; we do not try to re-identify anyone.
- No raw data in the repository. Only a download script and aggregated results.
- The analyst decides. TriageLens proposes grades, an order and auto-closes. It does not close or escalate anything by itself, and every auto-close proposal shows its confidence and reasons.
- Known limits are shown. Unseen-organisation scores sit next to official-split ones.
- Label quality. "Benign positive" varies between SOCs, and the model learns those inconsistencies too.
11 - Risks
Risks
| Risk | What we do if it happens |
|---|---|
| Scores on unseen organisations stay below the target. | Present the gap between known and unseen organisations as the main finding and show both numbers in the demo. |
| The organisation x detector matrix is too sparse for collaborative filtering to beat a simple baseline. | Report the negative result. The content-based ranker carries the ranking part. |
| KNN, RBF SVM and CAH do not scale to one million incidents. | Train them on stratified subsamples and report the sample sizes. |
| No auto-close threshold meets the 1% limit. | Propose no auto-closes and send every incident to the analyst. |
| Features describe the whole incident as released, not its first alert. | Say so next to every score. First-alert performance stays unverified until it is measured. |