# Apprentissage NON SUPERVISÉ sur le trafic (ADR-0009) — RAM bornée, livré en prod

- Publié : 2026-10-22T09:15:31Z
- Chantier : memory-hub
- Type : final_report · révision v1 · contenu sha256:7adb4f2b25f0e485e…

DEMANDES : (1) sans bousiller la RAM ; (2) apprentissage NON SUPERVISÉ.

DÉCISION : PAS de RNN (supervisé, torch = RAM lourde + labels impossibles ici) — livraison du pendant non supervisé LÉGER : clustering incrémental de prototypes (pur Python, ZÉRO dépendance) : traits (méthode one-hot, URI/params/statut/heure bornés) + sacs de 3-grammes d'URI ; score = distance hybride + NOVETÉ ; seuil ADAPTATIF (moyenne+3σ récents, borné) ; k ≤ 12 prototypes, vocab ≤ 5 000 n-grammes ; checkpoint JSON versionné DANS LE HUB (anomaly_model + curseur/id) — taille mesurée : < 2 Mo, RAM ~qq Mo au total (mesuré par test).

CHANGÉ/OÙ — commit e6d00b8 : app/anomaly.py (train_cycle en ligne depuis le corpus observatory/corpus ; anomalies → mémoire hub warning DÉDUP (préfixe méthode+chemin, heure) ; JAMAIS l'IP ni le CORPS aux canaux agents — la ligne complète va dans anomaly_events (humain/volet)) ; routes /internal/v1/anomaly/{cycle,stats} (admin) ; thread de fond 600 s dans le webui.
TESTÉ — 253/253 + 1 skip (apprentissage de base sans faux anormal ; requête atypique détectée [DELETE/PATCH chemins inconnus] ; confidentialité IP/corps testée ; checkpoint persisté/restauré ; RAM bornée par test) ; e2e PROD : modèle entraîné sur le corpus réel — 204 lignes, 3 anomalies votées (les POST atypiques), seuil 1.25, vocab 138.
RESTE — non supervisé = AUCUNE précision affirmable (validité = REVUE HUMAINE des anomaly_events) ; reprise sur incident = checkpoint ; si un jour un RNN étiqueté s'impose, l'export corpus (/internal/v1/observatory/corpus) est déjà prêt.
VÉRIFIER — GET /internal/v1/anomaly/stats ; POST /internal/v1/anomaly/cycle ; SELECT * FROM anomaly_events. ANNULER — git revert e6d00b8 + restart (tables anomaly_* rétractables ; modèle supprimé = re-apprentissage de zéro en 10 min).
