RADIUS session anomalies — Isolation Forest
What it detects
Every data session a SIM subscription opens through a mobile operator is recorded by RADIUS accounting: how long it lasted, how many bytes and packets went each way. On a given APN those sessions have a shape — an IoT fleet sending small periodic uploads looks nothing like a fleet streaming video. This plan learns that shape and scores each new session against it, so that a SIM that suddenly uploads gigabytes, or holds a session open for days, stands out.
The algorithm is an Isolation Forest: an ensemble of random trees where points that are easy to isolate — few splits away from everything else — are anomalies. It needs no labelled examples of bad sessions, only enough normal traffic to learn from.
Data it needs
The plan reads RADIUS session records and keeps the sessions of one APN, given as the apn configuration
field. Each record needs these columns; with a time-series source you map them in the trainer, with a file source
they must be present under these names in a Parquet file:
| Column | Type | Meaning |
|---|---|---|
APN |
string | Access point name of the session |
SessionState |
string | State of the session record |
IP_GGSN, IP_Device |
string | Gateway and device IP addresses |
sbytes, dbytes |
integer | Bytes sent and received by the device |
spkts, dpkts |
integer | Packets sent and received |
dur |
integer | Duration of the session |
Records with missing values are dropped, and so are TERMINATED records that carry no traffic counters at all.
The plan refuses to train when the APN has fewer sessions than the catalogue’s minDataToTrain (15 000 when the
plan does not say otherwise): the execution fails with Not enough data for APN rather than register a model
nobody should trust.
How it trains
From the five counters the plan derives eight more features — totals, ratios between directions, rates per
second of duration — and scales them robustly to the [0, 1] range. The data is split 75 / 12.5 / 12.5 into
training, validation and test. After fitting, the forest scores the training set and the plan sets the
decision threshold at the 95th percentile of those scores: anything scoring above it at inference time is an
anomaly. Two numbers are recorded with the model version and shown as its metrics:
| Metric | Meaning |
|---|---|
calculated_threshold |
The score above which a session is called anomalous |
training_max_score |
The highest score seen in training; inference scores are divided by it so anomaly_score reads as a fraction |
The prediction request
The inferencer answers POST /api/predict with the five counters of one session:
| Field | Meaning |
|---|---|
prediction |
1 anomalous, 0 normal |
anomaly_score |
The isolation score divided by the training maximum. Above roughly 1 means more extreme than anything seen in training |
explanation |
Only when prediction is 1: the features that pushed the score up, with their contribution, computed with SHAP on the forest. Empty otherwise |
The rule it creates
Unless the trainer says createRule: false, the first successful training creates an ADVANCED rule named after
the model in default_channel, inactive until the inferencer is activated. What it does:
-
Triggers on
device.communicationModules[].subscription.mobile.presence.gprs, and acts only when the value isSTOP— the session has just closed — and the subscription’s session record belongs to the configuredapn. -
Sends that session’s
sentBytes,receivedBytes,sentPackets,receivedPacketsanddurationto the inferencer. -
Collects three datastreams on the entity, dated at the session’s timestamp:
Datastream Value withAnomalytrueorfalsescoreThe anomaly_scoreexplanationThe explanationas text, when the rule parametershouldShowAnomalyReasonistrue -
Opens the alarm
deviceWithAnomaly(severityURGENT, priorityMEDIUM) when the entity becomes anomalous and was not before, carrying the explanation as extra information; closes it when a later session comes back normal.
The rule’s parameters — inferenceServiceURL, apn, shouldShowAnomalyReason — are editable in the rules
editor, as is the whole script. The datastreams it collects must exist in the entity’s data model.
Choosing between this plan and the Autoencoder
Both plans take the same data and answer the same request, so a rule written for one works for the other. The Isolation Forest trains in seconds, needs no tuning and explains its decisions feature by feature; it is the one to start with. The Autoencoder is worth a try when the forest flags too much or too little and you have plenty of data: it learns a smoother notion of normal at the price of a longer training.