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.
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.
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
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.
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.
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.
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
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- paquete.zip — EL PAQUETE ENTERO: model.onnx + predict.py + inference_spec.json + reproduce.json. Predice con `pip install onnxruntime` y nada más
- kelvin.mxai — el modelo
- kelvin.mxtrain — el contrato de entrenamiento
- receta.txt — la receta de datos
- entrada.json — la entrada del ejemplo (0 °C); las otras dos son entrada_100.json y entrada_-40.json
- reproduce.json — el manifiesto del paquete, para comparar huellas
- salida.txt — la salida literal de los cinco pasos
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
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
manifest PASS R1 PASS training PASS R3 PASS
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).
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
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.
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.
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.
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
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- paquete.zip — EL PAQUETE ENTERO: model.onnx + predict.py + inference_spec.json + reproduce.json. Predice con `pip install onnxruntime` y nada más
- modelo.mxai — el modelo
- modelo.mxtrain — el contrato de entrenamiento
- receta.txt — la receta de datos
- entrada.json — la entrada del ejemplo (92 años); la otra es entrada_joven.json
- ficha_tripod.md — la ficha TRIPOD+AI ENTERA, generada por el comando
- reproduce.json — el manifiesto del paquete
- salida.txt — la salida literal de los seis pasos
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
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 éticamanifest PASS R1 PASS training PASS R3 PASS
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ó.
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
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.
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.
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.
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
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- paquete.zip — EL PAQUETE ENTERO: model.onnx + predict.py + inference_spec.json + reproduce.json. Predice con `pip install onnxruntime` y nada más
- lluvia.mxai — el modelo
- lluvia.mxtrain — el contrato de entrenamiento
- lluvia_nombrada.csv — los 2.189 días REALES, con las clases nombradas
- dia.json — el día húmedo del ejemplo; el seco es dia_seco.json
- reproduce.json — el manifiesto del paquete
- salida.txt — la salida literal de los cinco pasos
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.
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
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}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_RUNEl 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.
Que el paquete es íntegro y contiene lo que dice (manifest PASS), y que predice desde valores crudos sin MatrixAI instalado.
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.