Skip to main content
ai Alive 2026

IoT Anomaly Detection Pipeline

Anomaly detection unsupervised on industrial sensors with K-means clustering

Concise pipeline for IoT anomaly detection using unsupervised methods on 230k multisensor observations. K-means with temporal feature engineering, achieving F1 score of 0.34 and ROC-AUC of 0.879 (13x baseline random).

ClientProject Work - DataMasters Machine Learning Engineer
RoleData Scientist - Anomaly Detection & Temporal Feature Engineering
Year2026

Highlights

  • 230.400 observations: 16 sensors x 10 days x 1 minute, 19 derived features
  • F1 Score 0.34, ROC AUC 0.88, PR AUC 0.32 - 13x Baseline Random w/ Anomaly Prevalence 2.4%
  • No labeled training set required for fully unsupervised approach
  • Temporal split 7d/3d that prevents data leakage between training and testing
  • Selection of K via silhouette score; comparison of KMeans / MiniBatchKMeans / GMM
  • Anomaly Scoring: Distance from centroid + Percentile Threshold on Training
  • Inference API detect_anomalies() with latency ~5 ms / 1000 lines
  • Serialized pipeline in .joblib for production deployment

What is the project?

Pipeline ML unsupervised per la detection di anomalie operative su reti di sensori industriali (IoT). Allenata su 230.400 osservazioni provenienti da 16 sensori in finestra di 10 giorni con campionamento al minuto, individua pattern anomali senza necessità di etichette di anomalia - soluzione realistica nei contesti industriali dove le anomalie sono rare e poco labellabili. Repo: github.com/fedcal/IoT-Anomaly-Detection-Pipeline-ML-con-Clustering.

Pipeline Architecture

  1. Data ingestion: 16 sensori × 10 giorni × 1 minuto = 230.400 osservazioni
  2. Time-aware split: 7 giorni training, 3 giorni test (zero data leakage)
  3. Data wrangling: gestione missing per asset
  4. Feature engineering temporale: rolling statistics, differenziali, z-score normalization
  5. Clustering unsupervised: KMeans con K selezionato via silhouette score
  6. Anomaly scoring: distanza dal centroide + soglia percentile sul training
  7. API di inferenza: detect_anomalies() con latenza ~5 ms / 1.000 righe

Test Set Results

MetricaTest performance
F1-Score0.340
ROC-AUC0.879
PR-AUC0.315
Precision0.436
Recall0.278
Baseline improvement13× random

Prevalenza di anomalie: 2.4% - un caso realistico di forte sbilanciamento di classe.

Use Case Business

Soluzione applicabile a predictive maintenance di asset industriali: pumping station, HVAC, distribuzione elettrica, motori industriali. La pipeline è plug-and-play su qualsiasi serie temporale multi-sensore: sostituendo il dataset, le funzioni di feature engineering temporale e di scoring restano valide e producono allerta operative prima del fault.

Inclusive learning materials included

Il repository include 4 notebook sequenziali e 5 documenti teorici che coprono fondamenta del clustering, scelta di K, distanze e metriche per anomaly detection unsupervised, prevenzione del data leakage in serie temporali, e trade-off tra KMeans, MiniBatchKMeans e GMM. Ogni decisione di design è motivata in documentazione.

Full technology stack

LevelTechnologyAnnotation
LinguaggioPython 3.11–3.13-
ML corescikit-learn 1.6+ (KMeans, MiniBatchKMeans, GaussianMixture)-
Feature EngineeringStatistiche rolling, differenziali, z-score normalization-
Split temporale7 giorni training / 3 giorni test (zero data leakage)-
Persistencejoblib serialization (~5ms/1k rows inference)-
DocumentazioneJekyll + Just-the-Docs (GitHub Pages)-
RiproducibilitàRANDOM_STATE=42, versioni librerie pinnate-

Main technologies

Python 3.13scikit-learn 1.6+pandas / NumPyJupyterjoblibJekyll Just-the-DocsGitHub Actions

Project link

Other projects