Tres modelos que puedes rehacer

No hace falta que nos creas. Cada caso trae la regla con la que se generaron sus datos, el contrato de entrenamiento, las huellas de todo, el paquete que predice sin instalar MatrixAI y el informe de verificación tal y como sale.

Y el tercero no sale del todo bien. Está aquí precisamente por eso: entrena con observaciones reales, y de ésas no hay receta que las regenere, así que solo UNA de las cuatro etapas llega a un veredicto: dos salen INCOMPARABLE y la cuarta ni se ejecuta — y el informe lo dice en vez de callarlo. El CSV sí se descarga: lo que falta es la regla, no el dato.

Cómo leer cada caso

Cada uno enseña cinco cosas: la RECETA (la regla que decide los datos), los FICHEROS enteros —el modelo y su contrato—, los COMANDOS exactos, lo que SALE al ejecutarlos, y el INFORME de `matrixai verify`, que rehace el dataset, reentrena el modelo y compara las métricas publicadas. Debajo, qué prueba ese informe y qué no.

Qué hace falta

Python 3.10 o superior y `pip install "matrixai-core[export]"`. Nada más: ni cuenta, ni clave de LLM, ni GPU. Los tres casos corren en un portátil.

Celsius a Kelvin

Una regresión cuya respuesta se comprueba con una resta.

dataset 5827acf2b2b6058d · receta 7f332dbb7aa59ebf · 300 filas · semillas dataset 20260825 / split 42 / init 42

Qué enseña

El ciclo entero con las cuatro etapas de verificación en PASS. Es el caso que no admite discusión: si el paquete devuelve 273,15 para 0 °C, funciona; y si devolviera otra cosa, se vería sin saber nada de aprendizaje automático. EN TU MÁQUINA la cuarta etapa dirá INCOMPARABLE y la orden saldrá con código 3, y ésa es la respuesta CORRECTA: la tolerancia se midió en el entorno del paquete y el tuyo es otro, así que una diferencia ahí no probaría nada. Las tres primeras sí salen PASS.

La receta
predicted_kelvin = 1*celsius + 273.15

La receta es el dato, no un adorno: los datos se generan a partir de ella, viaja dentro del paquete como `data_recipe.txt` y `verify` la usa para REGENERAR el dataset y comparar su huella.

Los ficheros, enteros

Cópialos tal cual en un directorio vacío junto a la receta. Son todo lo que hace falta: el resto lo generan los comandos de arriba.

kelvin.mxai
PROJECT CelsiusToKelvin

VECTOR Reading[1]
  celsius: Scalar[-50, 150]
END

PARAM W1 Vector[1]
END

PARAM b1 Scalar
END

FUNCTION PredictedKelvinModel
  predicted_kelvin: Scalar = linear(W1 * Reading + b1)
END

GRAPH
  Reading -> PredictedKelvinModel
END
kelvin.mxtrain
MODEL kelvin.mxai

DATASET KelvinData
  SOURCE csv("datos/celsiustokelvin-synthetic-train.csv")
  INPUT Reading FROM COLUMNS [celsius]
  TARGET predicted_kelvin: Scalar[200, 450]
  SPLIT train=0.8 validation=0.2 seed=42
  BATCH size=8
END

LOSS KelvinLoss
  TYPE mse
  PREDICTION predicted_kelvin
  TARGET predicted_kelvin
END

OPTIMIZER KelvinOptimizer
  TYPE sgd
  LEARNING_RATE 0.5
  UPDATE W1, b1
END

RUN
  EPOCHS 200
END
Descargar los artefactos
  • paquete.zipEL PAQUETE ENTERO: model.onnx + predict.py + inference_spec.json + reproduce.json. Predice con `pip install onnxruntime` y nada más
  • kelvin.mxaiel modelo
  • kelvin.mxtrainel contrato de entrenamiento
  • receta.txtla receta de datos
  • entrada.jsonla entrada del ejemplo (0 °C); las otras dos son entrada_100.json y entrada_-40.json
  • reproduce.jsonel manifiesto del paquete, para comparar huellas
  • salida.txtla salida literal de los cinco pasos
Comandos
matrixai generate-dataset kelvin.mxai --training kelvin.mxtrain \
  --rows 300 --seed 20260825 --mode coherent --recipe receta.txt -o datos
matrixai train kelvin.mxai --training kelvin.mxtrain --output runs/v1 \
  --recipe receta.txt --dataset-manifest datos/celsiustokelvin-synthetic-manifest.json
matrixai export-bundle kelvin.mxai --params runs/v1/params.best.json \
  --outdir paquete --training kelvin.mxtrain --data-recipe receta.txt --from-run runs/v1
cd paquete && python3 predict.py --input ../entrada.json
cd .. && matrixai verify paquete.zip --retrain
Lo que sale
R2: 1.000000
MAE: 6.50521e-17
Equivalence PASS: max_abs_diff=3.57e-08

  0 °C   -> 273.15000146627426
  100 °C -> 373.1500029563904
  -40 °C -> 233.15000236034393
La verificación
manifest  PASS
R1        PASS
training  PASS
R3        PASS
Qué prueba esto

Que el paquete que te descargas contiene ese modelo y no otro (manifest), que el dataset se regenera desde la receta con la misma huella (R1), que reentrenarlo aquí termina (training) y que las métricas publicadas vuelven a salir (R3).

Qué NO prueba

Que el modelo sirva para algo fuera de convertir grados. Es un caso de control: existe para que puedas comprobar la maquinaria, no para resolver un problema.

Riesgo de reingreso (sintético)

Una clasificación con su ficha TRIPOD+AI generada por el comando.

dataset 1cefbf74e237efda · receta 90376b2c20ee3bd8 · 400 filas · semillas dataset 20260825 / split 42 / init 42

Qué enseña

Lo mismo que el anterior más el documento que pide una revista para publicar un modelo de predicción clínica — escrito desde lo que el run guardó, y diciendo qué casillas NO puede rellenar.

La receta
alto: edad > 75 OR reingreso_previo > 0.5
DEFAULT: bajo

Los datos son SINTÉTICOS y la ficha lo dice en su primera línea. Un modelo entrenado así no está validado clínicamente, y publicar el caso sin esa frase sería el problema, no la solución.

Los ficheros, enteros

Cópialos tal cual en un directorio vacío junto a la receta. Son todo lo que hace falta: el resto lo generan los comandos de arriba.

modelo.mxai
PROJECT ClassifierProject

VECTOR Input[4]
  edad: Scalar[18, 100]
  dias_ingresado: Scalar[0, 60]
  num_diagnosticos: Scalar[0, 15]
  reingreso_previo: Scalar[0, 1]
END

NETWORK Classifier
  INPUT Input
  LAYER Dense units=32 activation=relu
  LAYER Dense units=16 activation=relu
  LAYER Dense units=2 activation=softmax
  OUTPUT predicted_class: ProbabilityMap[alto, bajo]
END

GRAPH
  Input -> Classifier
END

AUDIT
  EXPLAIN Input -> Classifier
END
modelo.mxtrain
MODEL modelo.mxai

DATASET Reingreso
  SOURCE csv("datos/classifierproject-synthetic-train.csv")
  INPUT Input FROM COLUMNS [edad, dias_ingresado, num_diagnosticos, reingreso_previo]
  TARGET predicted_class: Label[alto, bajo]
  SPLIT train=0.8 validation=0.2 seed=42
  BATCH size=16
END

LOSS Perdida
  TYPE cross_entropy
  PREDICTION Classifier
  TARGET predicted_class
END

OPTIMIZER Optimizador
  TYPE sgd
  LEARNING_RATE 0.05
  UPDATE Classifier.*
END

RUN
  EPOCHS 60
END
Descargar los artefactos
  • paquete.zipEL PAQUETE ENTERO: model.onnx + predict.py + inference_spec.json + reproduce.json. Predice con `pip install onnxruntime` y nada más
  • modelo.mxaiel modelo
  • modelo.mxtrainel contrato de entrenamiento
  • receta.txtla receta de datos
  • entrada.jsonla entrada del ejemplo (92 años); la otra es entrada_joven.json
  • ficha_tripod.mdla ficha TRIPOD+AI ENTERA, generada por el comando
  • reproduce.jsonel manifiesto del paquete
  • salida.txtla salida literal de los seis pasos
Comandos
matrixai generate-dataset modelo.mxai --training modelo.mxtrain \
  --rows 400 --seed 20260825 --mode coherent --recipe receta.txt -o datos
matrixai train modelo.mxai --training modelo.mxtrain --output runs/v1 \
  --recipe receta.txt --dataset-manifest datos/classifierproject-synthetic-manifest.json
matrixai export-bundle modelo.mxai --params runs/v1/params.best.json \
  --outdir paquete --training modelo.mxtrain --data-recipe receta.txt --from-run runs/v1
matrixai verify paquete.zip --retrain
matrixai report paquete --tripod --locale es -o ficha_tripod.md
Lo que sale
Accuracy: 0.968750

  92 años, reingreso 0,9 -> {"alto": 1.0,    "bajo": 9.9e-11}
  25 años, sin reingreso -> {"alto": 0.0002, "bajo": 0.9998}

# Ficha TRIPOD+AI
> AVISO: los datos de entrenamiento son SINTÉTICOS…
- Predictores: edad (18–100), dias_ingresado (0–60),
  num_diagnosticos (0–15), reingreso_previo (0–1)
## Lo que esta ficha NO puede rellenar
- Datos ausentes · Calibración · Equidad por subgrupos
- Financiación · Conflictos · Aprobación ética
La verificación
manifest  PASS
R1        PASS
training  PASS
R3        PASS
Qué prueba esto

Las tres primeras etapas en PASS, como el anterior —y la cuarta dirá INCOMPARABLE en tu máquina, por el mismo motivo: otro entorno, otra tolerancia—. Y que las predicciones se hacen con valores CRUDOS —92 años, no 0,9— porque el paquete lleva la misma normalización con la que se entrenó.

Qué NO prueba

Nada clínico. Los datos salen de una regla de dos líneas escrita por una persona: sirve para enseñar el circuito, no para decidir sobre nadie.

¿Lloverá mañana? (datos reales)

El caso que NO se puede demostrar entero — y por eso está aquí.

dataset b0bb8777559188aa · 2.189 filas · sin receta · semillas split 42 / init 42

Qué enseña

2.189 días de observaciones meteorológicas reales. No hay receta que regenere esos datos, así que `verify` deja dos etapas en INCOMPARABLE y lo dice con las palabras del propio paquete. Esto es lo que distingue a este producto: lo que no se ha comprobado se declara.

La receta

Aquí no hay receta y no se ha inventado ninguna. Inventarla para que las cuatro etapas salieran verdes habría sido exactamente la mentira que estas páginas dicen evitar.

Los ficheros, enteros

Cópialos tal cual en un directorio vacío junto a la receta. Son todo lo que hace falta: el resto lo generan los comandos de arriba.

lluvia.mxai
PROJECT LluviaManana

VECTOR Parte[6]
  temp_max: Scalar[0, 45]
  humidity: Scalar[30, 100]
  pressure: Scalar[980, 1040]
  pressure_delta: Scalar[-20, 20]
  cloud_cover: Scalar[0, 100]
  precip_hours: Scalar[0, 24]
END

NETWORK Pronostico
  INPUT Parte
  LAYER Dense units=16 activation=relu
  LAYER Dense units=2 activation=softmax
  OUTPUT llueve_manana: ProbabilityMap[no, si]
END

GRAPH
  Parte -> Pronostico
END
lluvia.mxtrain
MODEL lluvia.mxai

DATASET Observaciones
  SOURCE csv("datos/lluvia_nombrada.csv")
  INPUT Parte FROM COLUMNS [temp_max, humidity, pressure, pressure_delta, cloud_cover, precip_hours]
  TARGET llueve_manana: Label[no, si]
  SPLIT train=0.8 validation=0.2 seed=42
  BATCH size=32
END

LOSS Perdida
  TYPE cross_entropy
  PREDICTION Pronostico
  TARGET llueve_manana
END

OPTIMIZER Optimizador
  TYPE sgd
  LEARNING_RATE 0.1
  UPDATE Pronostico.*
END

RUN
  EPOCHS 40
END
Descargar los artefactos
  • paquete.zipEL PAQUETE ENTERO: model.onnx + predict.py + inference_spec.json + reproduce.json. Predice con `pip install onnxruntime` y nada más
  • lluvia.mxaiel modelo
  • lluvia.mxtrainel contrato de entrenamiento
  • lluvia_nombrada.csvlos 2.189 días REALES, con las clases nombradas
  • dia.jsonel día húmedo del ejemplo; el seco es dia_seco.json
  • reproduce.jsonel manifiesto del paquete
  • salida.txtla salida literal de los cinco pasos
De dónde salen los datos

Observaciones diarias de Open-Meteo (open-meteo.com), reanálisis ERA5. Su API es de uso libre para fines no comerciales y sus datos derivan de ERA5 (Copernicus/ECMWF), publicado bajo licencia CC BY 4.0. El CSV que se descarga aquí es una selección de columnas y una etiqueta derivada —«llueve mañana»— calculada por nosotros; no es el dato original.

Comandos
matrixai train lluvia.mxai --training lluvia.mxtrain --output runs/v1
matrixai export-bundle lluvia.mxai --params runs/v1/params.best.json \
  --outdir paquete --training lluvia.mxtrain --from-run runs/v1
cd paquete && python3 predict.py --input ../dia.json
matrixai verify paquete.zip --retrain
Lo que sale
Accuracy: 0.762557   (2.189 días reales)

  día húmedo, presión cayendo -> {"si": 0.943, "no": 0.057}
  día seco, anticiclónico     -> {"si": 0.260, "no": 0.740}
La verificación
manifest  PASS
R1        INCOMPARABLE — «this model has no data recipe, so its dataset
          cannot be regenerated and compared; why there is none is not
          recorded in the package; the dataset generation seed is unknown»
training  INCOMPARABLE — no hay dataset que regenerar
R3        NOT_RUN

El motivo va en inglés porque es lo que el PAQUETE escribió de sí mismo, y aquí se cita en vez de traducirse: esos bytes están cubiertos por su huella, y traducirlos sería ponerle en la boca algo que no dijo.

Qué prueba esto

Que el paquete es íntegro y contiene lo que dice (manifest PASS), y que predice desde valores crudos sin MatrixAI instalado.

Qué NO prueba

Que sus datos sean los que dice, porque no viajan. Un 76,3 % sobre datos que no se pueden regenerar es una afirmación que hay que creerse; el informe lo deja escrito en vez de disimularlo con un PASS.

Si algo no te sale igual

Las semillas y las huellas están publicadas arriba, y cada caso trae su `reproduce.json`: si tu dataset sale con otra huella, algo cambió y merece la pena saber qué. Compara tu `matrixai verify` con el `salida.txt` que se descarga aquí — un caso que no se reproduce es más útil que uno que sí.

Medido el 25 de agosto de 2026 ejecutando los tres guiones de principio a fin. Las cifras de esta página son la salida literal de esos comandos.