Defiende el servidor — v2 (C4)

Fe de erratas. Las tarjetas de las revisiones inmutables v1 (053f3e62…) y v2 (c521d5cc…) indican por error que entrenamiento y validación tienen 140.271 y 35.069 filas (una partición 80/20 descartada). Los tamaños correctos, que son los que usaron los modelos publicados, son 122.735 y 52.605 filas (70/30); las métricas de validación de las tarjetas sí corresponden a esa partición. Los modelos, sus hashes y los SHA no cambian. Detalle en evidencias/auditoria.json del repositorio de código.

Clasificador binario de conexiones de red: 0 = normal, 1 = ataque (UNSW-NB15). Proyecto académico del curso MLOps 2026-II (Universidad Externado de Colombia).

Propósito y uso previsto

Práctica de versionado de código, datos, experimentos y modelos. No demuestra eficacia sobre redes actuales: es un benchmark de laboratorio de 2015.

Contenido de esta revisión

model.joblib (pipeline completo de scikit-learn: preprocesamiento + estimador), config.json (umbral, variables, hashes, referencias), requirements.txt.

  • Modelo: XGBoost con hiperparámetros y umbral de una búsqueda de Optuna hecha solo con entrenamiento, con categóricas (one-hot)
  • Umbral: 0.66 (se predice ataque si score_attack >= 0.66)
  • SHA-256 de model.joblib: e7f7ddc749f2a22c66007031110f9658b1803b3f306f8e3c4e032c52cdac7ed4

Datos

Partición oficial UNSW_NB15_training-set.csv (175.341 filas; SHA-256 bec7dd5ec88dc2a0ccc7a07879d338395ed7421750f675fd0339e07dfe0648fa). Entrenamiento y validación se crearon solo con ese archivo (122.735 / 52.605 filas, partición 70/30), con grupos de entradas idénticas sin repartir (semilla 42). Entradas: 42 variables; se excluyen id, label, attack_cat. Datos versionados con DVC.

Métricas de validación (ataque = clase positiva)

Métrica Valor
Recall 0.9537
Precisión 0.9738
Tasa de falsos positivos 0.0548
Macro-F1 0.9443
Matriz (TN / FP / FN / TP) 15881 / 920 / 1656 / 34148

Cambios frente a v1 (validación)

v2 cambia los hiperparámetros (búsqueda de Optuna hecha solo con entrenamiento) y el umbral (0.5 → 0.66). Precisión 0.9608 → 0.9738; recall 0.9748 → 0.9537; falsas alarmas 1423 → 920; ataques perdidos 903 → 1656. La mejora en precisión proviene sobre todo del umbral: con umbral 0,5 el modelo de v2 no supera a v1. Se aceptan más ataques perdidos a cambio de menos falsas alarmas. Ver evidencias/experimentos.csv del repositorio de código.

Limitaciones

  • Dataset histórico de laboratorio; la validación estima el rendimiento en distribución (hay filas parecidas a ambos lados) y es optimista.
  • Un 10 % de las filas de test tienen una entrada idéntica en entrenamiento.
  • Un ataque no detectado cuesta más que una falsa alarma: el umbral prioriza recall >= 0,95 en validación a costa de falsas alarmas.
  • El archivo es un pickle de joblib: cárgalo solo de fuentes de confianza y con las versiones de requirements.txt.

Cómo usarlo

Revisiones inmutables de este repositorio (SHA completos): v1 053f3e62f144e78e055533f82bce14c9b54e3030 y v2 c521d5ccf41ad404998e3364c685363ffa620bbb. Elige una e indícala en revision:

import json, joblib
from huggingface_hub import hf_hub_download
repo = "LisSanchez-DS/defender-servidor"
rev = "c521d5ccf41ad404998e3364c685363ffa620bbb"   # v2; para v1 usa "053f3e62f144e78e055533f82bce14c9b54e3030"
modelo = joblib.load(hf_hub_download(repo, "model.joblib", revision=rev))
umbral = json.load(open(hf_hub_download(repo, "config.json", revision=rev)))["umbral"]   # v1: 0,5 · v2: 0,66
# X = DataFrame con las columnas originales del CSV de UNSW-NB15 (quita id, label y attack_cat antes)
score = modelo.predict_proba(X)[:, 1]; pred = (score >= umbral).astype(int)   # 1 = ataque

Hace falta la misma versión de las librerías de requirements.txt (el modelo es un pickle de joblib: cárgalo solo de fuentes de confianza). El repositorio de código trae python -m src.predecir v1|v2 entrada.csv salida.csv.

Resultado final en la prueba (evaluación única)

Esta sección se añadió en un commit posterior a la revisión evaluada. La revisión evaluada es c521d5ccf41ad404998e3364c685363ffa620bbb (tag v2); el modelo no cambió: SHA-256 de model.joblib = e7f7ddc749f2a22c66007031110f9658b1803b3f306f8e3c4e032c52cdac7ed4.

  • Archivo de prueba: UNSW_NB15_testing-set.csv (SHA-256 734fe6642edf758f7c94d7d9149426b49d202fe8e7bf0bef47392489c3c0a559), 82332 filas (ninguna eliminada), umbral 0.66, clase positiva: ataque.
  • Evaluado una sola vez, después de congelar la selección con la validación. Predicciones por fila y métricas recalculables en el repositorio de código (evidencias/predicciones-test.csv, evidencias/metricas-test.json).
Métrica Validación Prueba
Recall 0,9537 0.9649
Precisión 0,9738 0.8596
Tasa de falsos positivos 0,0548 0.1931
Macro-F1 0,9443 0.8908
ROC-AUC n/d 0.9819

Matriz de confusión en la prueba: TN 29856, FP 7144, FN 1589, TP 43743. Recall por familia de ataque: Fuzzers 0.771 (la más débil), Analysis 0.947, el resto >= 0.977.

Lectura honesta: la precisión baja unos 11 puntos y la tasa de falsos positivos se triplica frente a la validación, mientras el recall se mantiene. No se ha demostrado la causa; una hipótesis es que la prueba incluye una sesión de captura ausente del entrenamiento. El 10,4 % de las filas de prueba tiene una entrada idéntica en el entrenamiento. Este mismo conjunto de prueba se había evaluado antes, con otro modelo, en una versión anterior del trabajo; no se usó para elegir el modelo ni el umbral actuales.

Trazabilidad

Código: commit Git cb33d74015cbc76fd504ea4c38b15d63f9979fc5 · Datos DVC: originales e55caabaa6cd4a8f1c06a227bcfababc, preparados a869e919c9a8a014fa6c7aec00446ce5 · MLflow: run 6d7cb635a3104e838d81b205f2d51b49 (experimento taller-evaluable).

Downloads last month
26
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support