Defiende el servidor — v2 (C4)
Fe de erratas. Las tarjetas de las revisiones inmutables
v1(053f3e62…) yv2(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 enevidencias/auditoria.jsondel 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-256734fe6642edf758f7c94d7d9149426b49d202fe8e7bf0bef47392489c3c0a559), 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