Defiende el servidor · v2 (E4_hist_gb)

Clasificador binario de conexiones de red: normal (0) vs. ataque (1), entrenado con las particiones publicadas de UNSW-NB15. Trabajo académico del curso MLOps 2026-II (Universidad Externado de Colombia). No es un producto de seguridad.

Propósito

Demostrar el versionado y la recuperación de una solución de ML: código (Git), datos (DVC), experimentos (MLflow) y modelo (esta revisión de Hugging Face).

Contenido de la revisión

Archivo Descripción
model.joblib sklearn.pipeline.Pipeline completo: imputación, codificación, escalado/transformación y estimador
config.json umbral, variables de entrada, hashes y referencias de trazabilidad
requirements.txt dependencias fijadas para cargar el modelo
  • Modelo: hist_gradient_boosting (familia trees), parámetros {"learning_rate": 0.1, "max_iter": 300, "max_leaf_nodes": 63, "l2_regularization": 0.0, "early_stopping": false}
  • Preprocesamiento: {"numeric_transform": "none", "scale": false, "categorical_encoding": "ordinal"}
  • Umbral: 0.55 → ataque si score_attack >= 0.55
  • SHA-256 de model.joblib: b3c55ced64ce60d2c75f2d0c5fddc3e0e306bea65cd8592c8dbee8806c4c9a8a
  • Cambio respecto a la versión anterior: Cambio de modelo y de umbral, decidido solo con validación (configs/selection.yaml): HistGradientBoosting (familia árboles, mejor macro-F1 de los cuatro experimentos) y umbral 0.55, el de mayor macro-F1 con recall de ataque >= 0.95. Frente a v1 reduce la tasa de falsos positivos de 17.0 % a 6.7 % a cambio de perder 1.5 puntos de recall.

Datos

  • Fuente: UNSW-NB15 (Moustafa & Slay, 2015), https://research.unsw.edu.au/projects/unsw-nb15-dataset. Copia usada: mirror fijado en commit (https://raw.githubusercontent.com/Nir-J/ML-Projects/44bbd02b9e70f74dd915218d5eb702f125341ffc/UNSW-Network_Packet_Classification), SHA-256 verificados.
  • Entrenamiento: 80 % de UNSW_NB15_training-set.csv dividido por grupos de entradas idénticas (semilla 20261016); validación: el 20 % restante. Se excluyeron 940 filas con entradas idénticas y etiquetas contradictorias. label, attack_cat e id no son entradas.
  • Versión DVC: datos originales fe93051ae209ffb0128a31e7a478c009.dir, preparados b3533724917eef902710882f831d14e5.dir.

Métricas de validación (34 880 filas, umbral 0.55)

Métrica Valor
Recall de ataque 97.12 %
Precision de ataque 96.69 %
Tasa de falsos positivos 6.70 %
Macro-F1 0.9531
Accuracy 95.85 %

Matriz de confusión (filas = real, columnas = predicho):

pred. normal pred. ataque
normal 10794 775
ataque 671 22640

Denominadores cero se reportan como 0.0.

Evaluación en test

Evaluación única sobre las 82332 filas de UNSW_NB15_testing-set.csv (SHA-256 734fe6642edf758f7c94d7d9149426b49d202fe8e7bf0bef47392489c3c0a559), con la revisión congelada 4ea2e9e7b2245d27a672e58b81d27574843615f7 (model.joblib SHA-256 b3c55ced64ce60d2c75f2d0c5fddc3e0e306bea65cd8592c8dbee8806c4c9a8a), umbral 0.55. La decisión se congeló en el commit Git e378e2005e499e5f48ec153c421c7982e49573cd, antes de evaluar.

Métrica Test Validación
Recall de ataque 97.66 % 97.12 %
Precision de ataque 83.09 % 96.69 %
Tasa de falsos positivos 24.36 % 6.70 %
Macro-F1 0.8726 0.9531

Matriz de test (filas = real): normal → [27988, 9012]; ataque → [1063, 44269].

El FPR empeora mucho en test (de 6.7 % a 24.4 %): el tráfico normal del archivo de test es distinto del de entrenamiento (más conexiones en estado INT y REQ, y conexiones FIN/sin servicio que el modelo confunde con Fuzzers). La validación salió del mismo archivo que el entrenamiento y fue optimista. El resultado se conserva sin reajustar modelo ni umbral.

Limitaciones

  • Dataset histórico (2015, tráfico sintético de laboratorio): no demuestra eficacia en una red actual.
  • Train y test comparten ~10 % de entradas idénticas; validación comparte entradas con test (1 739 filas).
  • El umbral se eligió en validación; las métricas de validación con ese umbral son algo optimistas.
  • Las puntuaciones no están calibradas como probabilidades reales.

Uso

import json, joblib, pandas as pd
from huggingface_hub import hf_hub_download

REV = "<SHA completo de esta revisión>"
path = hf_hub_download("NicolTcT/defiende-el-servidor", "model.joblib", revision=REV)
cfg = json.load(open(hf_hub_download("NicolTcT/defiende-el-servidor", "config.json", revision=REV)))
model = joblib.load(path)

df = pd.read_csv("conexiones.csv")            # columnas de UNSW-NB15
score = model.predict_proba(df[cfg["features"]])[:, 1]
y_pred = (score >= cfg["threshold"]).astype(int)   # 1 = ataque

O desde el repositorio de código: python src/predict.py --revision <SHA> --input X.csv --output Y.csv.

Trazabilidad

Pieza Referencia
Código https://github.com/Nicol-Tatiana-Cerinza-Tejada/Defiende-el-servidor · commit 0412c387fc1433f164876e00c743bdafaa1f221a · tag v2-code
Datos (DVC) data/raw.dvc md5 fe93051ae209ffb0128a31e7a478c009.dir · data/prepared.dvc md5 b3533724917eef902710882f831d14e5.dir
Experimento (MLflow) experimento defiende-el-servidor · run 83c62ca284954280b3cca861e87dbc9f (exportado en evidencias/mlflow/)
Modelo este repositorio, tag v2

Referencias

Moustafa, N., & Slay, J. (2015). UNSW-NB15: a comprehensive data set for network intrusion detection systems. MilCIS 2015.

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