Hay una escena que se repite en casi todas las empresas que empiezan con aprendizaje automático, y AlpinaShop está a punto de vivirla.
Lucía abre un notebook en su portátil. Se descarga un CSV con los pedidos del último año, prueba tres modelos, y el tercero acierta un 84 % de las veces qué clientes van a comprar. Enseña el gráfico en la reunión del lunes y todo el mundo se entusiasma. Dirección pregunta cuándo estará en la web.
Y entonces empiezan las preguntas incómodas. ¿De dónde salió exactamente ese CSV? ¿Qué filtros aplicó? ¿Con qué versión de la librería lo entrenó? ¿Dónde está el modelo? ¿En su carpeta de Descargas? ¿Quién lo va a ejecutar cuando llegue una petición de la tienda, y en cuánto tiempo tiene que responder? ¿Qué pasa cuando los datos cambien dentro de seis meses? ¿Y si Lucía se va?
Ninguna de esas preguntas es sobre el modelo. Todas son sobre el sistema alrededor del modelo, y son precisamente las que separan un experimento interesante de un producto que funciona. Esta lección trata de eso: qué es Vertex AI, qué componente resuelve cada pregunta, y cómo se conecta con la plataforma de datos que has construido en el módulo 4.
Y trata también de algo que casi nunca se dice en un curso de machine learning: que la primera decisión honesta de un proyecto de ML es decidir si hace falta ML.
Contenido
- Por qué no basta con un notebook y un portátil
- El ciclo de vida de un modelo
- Qué componente de Vertex AI cubre cada etapa
- Nota histórica: de AI Platform a Vertex AI
- Workbench: notebooks gestionados conectados a los datos
- Conjuntos de datos gestionados y
pedidos-historico - Feature Store y el sesgo entrenamiento/servicio
- Entrenamiento: trabajos personalizados e hiperparámetros
- Model Registry, versiones y evaluación
- Servir el modelo: endpoints en línea y predicción por lotes
- Model Monitoring: cuando el mundo cambia y el modelo no
- BigQuery ML: entrenar con SQL sin salir del almacén
- Cuándo BigQuery ML y cuándo Vertex AI
- Coste de la plataforma y los dos interruptores que hay que apagar
- El problema de AlpinaShop: recomendar sin entrenar nada
- Por qué no basta con un notebook y un portátil
El notebook de Lucía no está mal. Es el sitio correcto para explorar, y todo proyecto de ML empieza ahí. El problema aparece cuando el resultado tiene que sobrevivir fuera de esa sesión.
Los cinco fallos que se repiten siempre:
| Problema del portátil | Qué pasa en la práctica |
|---|---|
| No es reproducible | Nadie puede volver a obtener el mismo modelo. El CSV se filtró a mano, la librería se actualizó, la semilla aleatoria no se fijó. |
| No escala | 5 años de pedidos y 60 GB de imágenes no caben en 16 GB de RAM. Y entrenar en CPU lo que necesita GPU tarda días. |
| No se puede servir | Un modelo en un .pkl en Descargas no responde a peticiones HTTP con latencia acotada ni sobrevive a un reinicio. |
| No hay trazabilidad | En una auditoría no se puede responder "qué datos entrenaron el modelo que tomó esta decisión el 14 de marzo". |
| No se vigila | El modelo se degrada en silencio. Nadie se entera hasta que alguien de negocio dice "esto ya no acierta". |
Una plataforma de ML es el conjunto de servicios que resuelve esos cinco problemas sin que tengas que construirlos. Vertex AI es la de Google Cloud: un paraguas con almacenamiento de características, entrenamiento gestionado, registro de modelos, servicio de predicciones, monitorización y orquestación, todo bajo el mismo IAM, la misma facturación y la misma red que el resto de tu proyecto.
La idea que conviene fijar antes de seguir: el modelo es la parte pequeña del sistema. Es un porcentaje mínimo del código y del esfuerzo real. Todo lo demás —recolección de datos, verificación, extracción de características, servicio, monitorización, gestión de configuración— es el sistema, y es donde fallan los proyectos.
- El ciclo de vida de un modelo
Un modelo no se hace: se cultiva. Y no es una línea recta, es un bucle.
flowchart LR
A[Problema de negocio] --> B[Datos]
B --> C[Características]
C --> D[Entrenamiento]
D --> E[Evaluación]
E -->|no mejora| C
E -->|mejora| F[Despliegue]
F --> G[Monitorización]
G -->|deriva detectada| H[Reentrenamiento]
H --> D
G -->|el problema cambió| A
Las siete etapas, con la pregunta que responde cada una:
- Problema de negocio. ¿Qué decisión va a cambiar por tener este modelo? Si la respuesta es "ninguna, pero es interesante", el proyecto ya ha fracasado.
- Datos. ¿Qué información existe, cuánta, de qué calidad y con qué permiso legal para usarla? Aquí es donde el módulo 4 rinde:
alpinashop_analiticaestá gobernado, catalogado y desidentificado. - Características. Transformar datos brutos en las señales numéricas que el modelo consume. Es la etapa que más determina el resultado final, muy por encima de la elección del algoritmo.
- Entrenamiento. Ajustar los parámetros del modelo con los datos históricos.
- Evaluación. ¿Es mejor que lo que había? ¿Mejor que una heurística simple? ¿Mejor para el negocio, no solo en una métrica?
- Despliegue. Hacer que el modelo responda a peticiones reales, en línea o por lotes.
- Monitorización. Vigilar que los datos que entran siguen pareciéndose a los de entrenamiento, y que las predicciones siguen siendo útiles.
El bucle es lo importante. Un modelo desplegado y olvidado es un pasivo: sigue decidiendo con una visión del mundo que ya caducó.
- Qué componente de Vertex AI cubre cada etapa
| Etapa | Componente de Vertex AI | Para qué sirve exactamente |
|---|---|---|
| Exploración | Workbench | Notebooks gestionados con acceso directo a BigQuery y Cloud Storage |
| Datos | Managed Datasets | Conjuntos versionados (tabular, imagen, texto, vídeo) con divisiones y etiquetado |
| Características | Feature Store | Almacén central de características, con servicio en línea y por lotes |
| Entrenamiento sin código | AutoML | Entrena buscando la arquitectura por ti (lección 05-02) |
| Entrenamiento con código | Custom Training | Tu código en un contenedor, con la máquina que elijas |
| Ajuste | Hyperparameter Tuning | Busca la mejor combinación de hiperparámetros |
| Seguimiento | Experiments + TensorBoard | Compara ejecuciones, métricas y curvas |
| Catálogo de modelos | Model Registry | Versiona modelos, guarda evaluaciones y linaje |
| Evaluación | Model Evaluation | Métricas comparables entre versiones |
| Servicio en línea | Endpoints | API HTTPS con autoescalado y división de tráfico |
| Servicio por lotes | Batch Prediction | Millones de filas de una vez, sin infraestructura viva |
| Vigilancia | Model Monitoring | Deriva de datos y de predicción, con alertas |
| Automatización | Pipelines | El ciclo completo como grafo reproducible (lección 05-07) |
| Modelos generativos | Model Garden + Gemini | Modelos preentrenados y generativos (lección 05-06) |
No hace falta usarlos todos. AlpinaShop, con 40 personas, va a usar cinco o seis. Pero conviene saber que están, porque la alternativa a cada uno es construirlo tú.
- Nota histórica: de AI Platform a Vertex AI
Si buscas documentación o tutoriales antiguos, te vas a encontrar con nombres que ya no existen, y conviene saber traducirlos.
Hasta 2021, Google Cloud tenía dos ofertas de ML separadas y mal comunicadas entre sí:
- AI Platform (antes Cloud ML Engine): entrenamiento y predicción para quien escribía su propio código.
- AutoML (Vision, Natural Language, Tables…): productos independientes, cada uno con su consola y su API, para quien no escribía código.
Eran mundos distintos. Un modelo de AutoML y uno de AI Platform no compartían registro, ni monitorización, ni forma de desplegarse. Vertex AI los unificó bajo una sola API, un solo registro de modelos y una sola consola. Hoy AutoML no es un producto aparte: es una forma de entrenar dentro de Vertex AI.
AI Platform está retirada. Si encuentras un tutorial que use
gcloud ai-platform jobs submito el endpointml.googleapis.com, es material obsoleto. El equivalente actual esgcloud ai custom-jobs createsobreaiplatform.googleapis.com. La confusión es habitual porque el nombre de la API conservó las siglas antiguas.
Es un buen recordatorio de una regla general de este curso: en la nube, verifica siempre contra la documentación oficial vigente. Los nombres, los límites y los precios cambian, y un tutorial de hace tres años puede llevarte a un producto que ya no existe.
- Workbench: notebooks gestionados conectados a los datos
Vertex AI Workbench es un JupyterLab gestionado que corre sobre una VM en tu proyecto. Frente al portátil de Lucía tiene tres ventajas que importan:
- Está donde están los datos. En
europe-west1, dentro de la VPC, sin sacar nada fuera. - Usa una cuenta de servicio, no las credenciales personales. Los permisos son auditables y revocables.
- Escala. Si hace falta más memoria o una GPU para un experimento, se cambia el tipo de máquina y ya está.
Creación de la instancia de Lucía:
gcloud workbench instances create wb-lucia-analitica \
--project=alpinashop-datos \
--location=europe-west1-b \
--machine-type=e2-standard-4 \
--service-account=sa-workbench-datos@alpinashop-datos.iam.gserviceaccount.com \
--disable-public-ip \
--metadata=idle-timeout-seconds=3600Tres opciones merecen explicación:
--service-account: la instancia actúa como esa cuenta de servicio, que tendrároles/bigquery.dataViewersobre las vistas desidentificadas y no sobre las tablas crudas. Lo que aprendiste en 03-04 se aplica aquí sin cambios.--disable-public-ip: sin IP pública. El acceso va por IAP y la salida a internet por Cloud NAT, como en 03-01.idle-timeout-seconds=3600: se apaga sola tras una hora sin uso. Este parámetro es la diferencia entre 40 € y 400 € de factura a fin de mes.
Dentro del notebook, la conexión a los datos gobernados del módulo 4 es directa:
from google.cloud import bigquery
import pandas as pd
cliente = bigquery.Client(project="alpinashop-datos")
consulta = """
SELECT
sku,
categoria,
COUNT(DISTINCT pedido_id) AS pedidos,
SUM(unidades) AS unidades,
ROUND(SUM(importe_linea), 2) AS importe
FROM `alpinashop-datos.alpinashop_analitica.lineas_pedido`
WHERE fecha_pedido >= DATE_SUB(CURRENT_DATE(), INTERVAL 365 DAY)
GROUP BY sku, categoria
ORDER BY importe DESC
"""
df = cliente.query(consulta).to_dataframe()
print(f"{len(df)} SKU con ventas en el ultimo anyo")
print(df.head())Qué hace y por qué así. bigquery.Client se autentica sola con la cuenta de servicio de la instancia: no hay claves ni ficheros JSON, que es exactamente lo que querías evitar tras 03-06. La consulta agrega en BigQuery y baja el resultado ya reducido: unas 2.400 filas en lugar de millones. Este es el patrón correcto y el error más caro es el contrario —SELECT * sobre lineas_pedido y agregar en pandas—, que descarga gigabytes, factura bytes leídos y probablemente agota la memoria del notebook.
Cuando el volumen ya no cabe en memoria, existe bigframes, una API tipo pandas que ejecuta las operaciones dentro de BigQuery en lugar de traer los datos. Es la salida natural cuando el to_dataframe() empieza a doler.
- Conjuntos de datos gestionados y
pedidos-historico
pedidos-historicoUn conjunto de datos gestionado (managed dataset) es un recurso de Vertex AI que apunta a tus datos y les añade lo que un CSV suelto no tiene: identidad, versión, esquema, divisiones train/validación/test y, en imagen y texto, un flujo de etiquetado.
| Tipo | Origen habitual | Uso típico en AlpinaShop |
|---|---|---|
| Tabular | BigQuery o CSV en Cloud Storage | Predecir compra, prever demanda |
| Imagen | Cloud Storage + fichero de índice | Clasificar fotos del catálogo |
| Texto | Cloud Storage o BigQuery | Clasificar opiniones |
| Vídeo | Cloud Storage | No aplica hoy |
AlpinaShop crea el suyo directamente desde el dataset gobernado:
gcloud ai datasets create \
--project=alpinashop-datos \
--region=europe-west1 \
--display-name=pedidos-historico \
--metadata-schema-uri="gs://google-cloud-aiplatform/schema/dataset/metadata/tabular_1.0.0.yaml" \
--metadata="{\"inputConfig\": {\"bigquerySource\": {\"uri\": \"bq://alpinashop-datos.alpinashop_analitica.v_pedidos_analitica\"}}}"Fíjate en un detalle nada casual: el origen es v_pedidos_analitica, la vista seudonimizada que creaste en 04-07, no la tabla pedidos. El modelo nunca ve un email. No porque haga falta para entrenar —no aporta nada—, sino porque cada copia de un dato personal es una obligación legal más y un riesgo más.
¿Es obligatorio usar un conjunto gestionado? No. El entrenamiento personalizado puede leer directamente de BigQuery o de Cloud Storage. Los conjuntos gestionados son obligatorios para AutoML y muy recomendables cuando hay que etiquetar a mano o cuando quieres que quede registrado con qué datos exactos se entrenó cada versión. Para un trabajo personalizado que ya lee de una vista versionada, aportan menos.
- Feature Store y el sesgo entrenamiento/servicio
Este apartado explica el error más caro y más silencioso del machine learning aplicado. Merece leerse despacio.
Una característica (feature) es una señal numérica o categórica que describe una entidad y que el modelo usa para decidir. Para AlpinaShop:
| Entidad | Características de ejemplo |
|---|---|
| Cliente | Pedidos en 90 días, importe medio, días desde el último pedido, categoría favorita |
| Producto | Precio, categoría, ventas en 30 días, puntuación media, veces devuelto |
| Sesión | Productos vistos, minutos en la web, dispositivo, canal de entrada |
El problema aparece así. Lucía entrena en el notebook y calcula "pedidos del cliente en los últimos 90 días" con una consulta SQL sobre pedidos. Funciona: el modelo acierta. Meses después, Dani tiene que servir el modelo en la web, y necesita ese mismo número en tiempo real, en milisegundos, para el cliente que está mirando la pantalla. No puede lanzar una consulta a BigQuery en la petición HTTP. Así que lo reimplementa en Python contra Cloud SQL.
Y ahí, sin que nadie lo note, aparece la diferencia. La consulta de Lucía contaba los pedidos con estado entregado. La de Dani cuenta todos, incluidos los cancelados. El modelo recibe en producción un número que significa algo distinto del que aprendió. Nadie ve un error: no hay excepción, no hay log rojo. Simplemente el modelo acierta menos de lo que prometía, y el equipo tarda meses en entender por qué.
Eso es el sesgo entrenamiento/servicio (training-serving skew): la característica se calcula de dos maneras distintas en dos sitios distintos.
Feature Store lo resuelve con una idea simple: la característica se define y se calcula una sola vez, se guarda, y se sirve tanto al entrenamiento (por lotes, con valores históricos correctos) como al servicio en línea (con baja latencia). Un solo código, una sola definición.
flowchart LR
A[BigQuery: alpinashop_analitica] --> B[Feature Store<br/>cliente_pedidos_90d<br/>cliente_importe_medio]
B --> C[Entrenamiento<br/>lectura historica]
B --> D[Servicio en linea<br/>latencia baja]
C --> E[Modelo]
E --> D
En Vertex AI, la generación actual de Feature Store se apoya en BigQuery como fuente de la verdad: defines una vista de características sobre una tabla o vista, y un almacén en línea la sincroniza para servirla rápido.
# 1) Almacen en linea
gcloud ai feature-online-stores create alpinashop_fos \
--project=alpinashop-datos --region=europe-west1 \
--bigtable-min-node-count=1 --bigtable-max-node-count=2
# 2) Vista de caracteristicas sobre la tabla ya calculada en BigQuery
gcloud ai feature-views create cliente_features \
--project=alpinashop-datos --region=europe-west1 \
--feature-online-store=alpinashop_fos \
--bigquery-source-uri="bq://alpinashop-datos.alpinashop_analitica.features_cliente" \
--entity-id-columns=cliente_hash \
--cron="0 3 * * *"La clave está en --entity-id-columns=cliente_hash y en --cron. La entidad se identifica por el hash del cliente, el mismo que generaste con KMS en 04-07: el almacén de características tampoco contiene datos personales directos. Y la sincronización nocturna significa que las características tienen como mucho 24 horas de antigüedad, algo perfectamente aceptable para "pedidos en 90 días" y no aceptable para "productos vistos en esta sesión", que hay que calcular en caliente.
Una advertencia importante sobre el tiempo: al construir el conjunto de entrenamiento, cada fila debe llevar el valor que la característica tenía en el momento del evento, no el de hoy. Si entrenas un modelo de "¿comprará?" con el número de pedidos actual del cliente, le estás contando el futuro. Volveremos sobre esta trampa —la fuga de datos— en 05-02.
¿Necesita AlpinaShop un Feature Store hoy? Con un modelo y tres características, probablemente no: es una capa más que mantener. Con cinco modelos que comparten características y un equipo de tres personas, sí. La regla práctica: cuando la misma característica la usan dos modelos o la calculan dos personas, ha llegado el momento.
- Entrenamiento: trabajos personalizados e hiperparámetros
Un trabajo de entrenamiento personalizado es tu código ejecutándose en máquinas de Google, sin que tú gestiones ninguna. Dos formas de empaquetarlo:
| Forma | Qué entregas | Cuándo conviene |
|---|---|---|
| Contenedor precompilado | Un .tar.gz con tu script Python |
Usas TensorFlow, PyTorch, scikit-learn o XGBoost estándar |
| Contenedor propio | Una imagen en Artifact Registry | Dependencias raras, versiones fijadas, reproducibilidad total |
AlpinaShop ya tiene Artifact Registry de 02-05 y del pipeline del catálogo, así que la segunda opción no le cuesta nada extra.
gcloud ai custom-jobs create \
--project=alpinashop-datos \
--region=europe-west1 \
--display-name=entrena-recomendador-v1 \
--worker-pool-spec="machine-type=n1-standard-8,replica-count=1,container-image-uri=europe-west1-docker.pkg.dev/alpinashop-prod/alpinashop/entrena-reco:1.0.3" \
--args="--dataset=alpinashop_analitica,--epochs=15,--salida=gs://alpinashop-datalake/modelos/reco/v1"Punto por punto:
--worker-pool-specdefine la máquina. Un soloreplica-countes entrenamiento en una máquina; con más réplicas y la configuración adecuada, distribuido (lo verás en 05-03).- La imagen está etiquetada con versión (
1.0.3), nuncalatest. Si necesitas reproducir el entrenamiento del mes pasado,latestya no es lo que era. - Los artefactos se escriben en Cloud Storage, no dentro del contenedor, que desaparece al acabar.
El trabajo escribe logs en Cloud Logging (06-06) y muere solo. No hay VM que apagar, que es la principal ventaja frente a montarte tú una instancia con GPU y olvidarla encendida el fin de semana.
Hiperparámetros y ajuste automático
Un parámetro lo aprende el modelo durante el entrenamiento (los pesos). Un hiperparámetro lo decides tú antes: tasa de aprendizaje, profundidad del árbol, tamaño del lote, dimensión de los embeddings. Y su efecto sobre el resultado es enorme.
Probar combinaciones a mano es tedioso y sesgado. Vertex AI Hyperparameter Tuning lanza varias ejecuciones en paralelo y busca la mejor combinación con optimización bayesiana: aprende de las pruebas anteriores en lugar de tirar dardos.
# ajuste.yaml
studySpec:
metrics:
- metricId: auc_validacion
goal: MAXIMIZE
parameters:
- parameterId: learning_rate
doubleValueSpec: { minValue: 0.0001, maxValue: 0.1 }
scaleType: UNIT_LOG_SCALE
- parameterId: embedding_dim
discreteValueSpec: { values: [16, 32, 64, 128] }
algorithm: ALGORITHM_UNSPECIFIED # optimizacion bayesiana por defecto
trialJobSpec:
workerPoolSpecs:
- machineType: n1-standard-8
replicaCount: 1
containerSpec:
imageUri: europe-west1-docker.pkg.dev/alpinashop-prod/alpinashop/entrena-reco:1.0.3
maxTrialCount: 20
parallelTrialCount: 4Dos detalles que ahorran dinero y disgustos:
scaleType: UNIT_LOG_SCALEpara la tasa de aprendizaje. Los valores útiles se reparten por órdenes de magnitud, no linealmente: buscar en escala logarítmica explora0,0001,0,001y0,01en vez de veinte valores casi idénticos.parallelTrialCount: 4frente amaxTrialCount: 20. Con paralelismo alto acabas antes, pero cada tanda aprende menos de la anterior. Con paralelismo bajo la búsqueda es más inteligente y más lenta. Un cuarto del total es un equilibrio razonable.
Y la advertencia de coste: 20 pruebas cuestan 20 entrenamientos. Antes de lanzar un ajuste, comprueba que un entrenamiento suelto funciona y mide cuánto tarda y cuánto vale.
- Model Registry, versiones y evaluación
El Model Registry es el catálogo de modelos del proyecto. Cada modelo tiene versiones numeradas, y cada versión guarda su artefacto, su contenedor de servicio, sus métricas y su linaje.
gcloud ai models upload \
--project=alpinashop-datos --region=europe-west1 \
--display-name=recomendador-alpinashop \
--artifact-uri=gs://alpinashop-datalake/modelos/reco/v1 \
--container-image-uri=europe-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-15:latest \
--version-aliases=candidatoLos alias son la pieza más útil y la menos usada. En lugar de que el código de la tienda invoque "la versión 7", invoca al alias produccion. Cambiar de modelo es mover un alias, y volver atrás también:
# Promover la version 8 a produccion
gcloud ai models update-version recomendador-alpinashop@8 \
--region=europe-west1 --add-aliases=produccion --remove-aliases=candidato
# Y si sale mal, revertir en segundos
gcloud ai models update-version recomendador-alpinashop@7 \
--region=europe-west1 --add-aliases=produccionLa evaluación se guarda asociada a la versión. Esto es lo que permite responder, meses después, a "¿por qué se sustituyó el modelo el 3 de junio?" con datos y no con recuerdos. Y es la base de la puerta de decisión que construirás en 05-07: un modelo solo se despliega si su evaluación supera a la del modelo que está en producción.
- Servir el modelo: endpoints en línea y predicción por lotes
Hay dos formas de usar un modelo, y elegir mal es el error de arquitectura más caro de este módulo.
Un endpoint es un servicio HTTPS siempre encendido con una o más versiones desplegadas. Responde en milisegundos, escala solo, y cobra por el tiempo que las máquinas están vivas, haya tráfico o no.
Una predicción por lotes es un trabajo que arranca, lee un fichero o una tabla, predice millones de filas, escribe el resultado y muere. Cobra por el trabajo, no por el tiempo de espera.
| Criterio | Endpoint en línea | Predicción por lotes |
|---|---|---|
| Latencia | Decenas de milisegundos | Minutos u horas |
| Cuándo predice | En el instante de la petición | En una ventana programada |
| Coste | Por hora de máquina, 24×7 | Por trabajo ejecutado |
| Coste con poco tráfico | Malo: pagas por no hacer nada | Óptimo |
| Escala a millones de filas | Cara e ineficiente | Su caso natural |
| Datos frescos | Sí, del momento | Los de la última ejecución |
| Ejemplo AlpinaShop | Recomendación en el carrito | Puntuación nocturna de todo el catálogo |
El criterio de elección, en una frase: si el resultado depende de algo que acaba de pasar y que no podías saber antes, necesitas endpoint; si no, lotes.
Y aquí viene una decisión concreta de AlpinaShop que conviene fijar ahora. Las recomendaciones de producto no cambian cada segundo: qué productos se compran juntos es un patrón estable de semanas. Precalcular cada noche las 20 recomendaciones de cada uno de los 2.400 SKU es una tabla de 48.000 filas que la tienda consulta en microsegundos desde Firestore o Memorystore (02-06).
Coste orientativo de la comparación, para dar la magnitud —verifica siempre los precios vigentes en la documentación oficial, que cambian—: un endpoint modesto encendido todo el mes ronda las decenas de euros como mínimo, incluso sin tráfico; el trabajo por lotes nocturno sobre 2.400 SKU son céntimos. Con dos órdenes de magnitud de diferencia y sin ninguna ventaja funcional, la decisión no requiere debate.
Decisión DA-002. Las recomendaciones de producto de AlpinaShop se calculan por lotes cada noche y se sirven desde una tabla precalculada. Se reservará un endpoint en línea solo si aparece un caso que dependa del comportamiento de la sesión en curso.
- Model Monitoring: cuando el mundo cambia y el modelo no
Un modelo aprende una foto del mundo. El mundo se mueve, la foto no.
Dos fenómenos distintos que conviene no confundir:
| Fenómeno | Qué cambia | Ejemplo en AlpinaShop |
|---|---|---|
| Deriva de datos | La distribución de las entradas | Llega el invierno: entran consultas de crampones donde antes había sandalias de trekking |
| Deriva de concepto | La relación entre entradas y resultado | Un competidor baja precios: los mismos clientes ya no compran igual |
| Sesgo entrenamiento/servicio | Producción no se parece al entrenamiento desde el día uno | El error del apartado 7 |
Model Monitoring compara continuamente las distribuciones de las peticiones reales contra una línea base (los datos de entrenamiento) y avisa cuando la distancia supera un umbral.
gcloud ai model-monitoring-jobs create \
--project=alpinashop-datos --region=europe-west1 \
--display-name=monitor-recomendador \
[email protected] \
--endpoint=ENDPOINT_ID \
--feature-thresholds=precio=0.3,categoria=0.3,pedidos_90d=0.2 \
--prediction-sampling-rate=0.2--feature-thresholds: umbral por característica. Un0,3encategoriasignifica "avísame si la mezcla de categorías que llega se aleja más de eso de la mezcla con la que entrené".--prediction-sampling-rate=0.2: se analiza el 20 % de las peticiones. Analizar el 100 % detecta antes, cuesta más y casi nunca compensa.
Un aviso realista: una alerta de deriva no es una avería. En invierno la distribución de categorías tiene que cambiar, y eso es normal. La alerta te dice "mira esto", y el juicio de si hay que reentrenar es humano. Un umbral demasiado sensible produce ruido, el ruido produce indiferencia, y la indiferencia produce que nadie mire la alerta que sí importaba.
- BigQuery ML: entrenar con SQL sin salir del almacén
Y ahora, la alternativa que muchos equipos deberían probar antes que ninguna otra.
BigQuery ML permite crear y usar modelos con SQL, dentro de BigQuery, sin mover un solo byte y sin escribir Python. Para un equipo que ya vive en SQL —como Lucía después del módulo 4— es la vía más corta desde el dato hasta la predicción.
El caso de AlpinaShop: predecir la probabilidad de que una sesión con carrito acabe en compra, para decidir si merece la pena mostrar un incentivo.
Primero, la tabla de entrenamiento. Es donde se juega el resultado:
CREATE OR REPLACE TABLE `alpinashop-datos.alpinashop_analitica.ml_sesiones` AS
SELECT
v.sesion_id,
v.fecha,
v.dispositivo,
v.canal,
v.paginas_vistas,
v.minutos_sesion,
v.productos_vistos,
v.unidades_carrito,
ROUND(v.importe_carrito, 2) AS importe_carrito,
EXTRACT(DAYOFWEEK FROM v.fecha) AS dia_semana,
IF(p.pedido_id IS NULL, 0, 1) AS compro
FROM `alpinashop-datos.alpinashop_analitica.visitas` v
LEFT JOIN `alpinashop-datos.alpinashop_analitica.v_pedidos_analitica` p
ON p.sesion_id = v.sesion_id
WHERE v.unidades_carrito > 0
AND v.fecha BETWEEN DATE '2024-01-01' AND DATE '2026-03-31';Lo importante de esta consulta no es el SQL, son las decisiones. El filtro unidades_carrito > 0 acota la población a las sesiones que llegaron a tener carrito: predecir sobre visitantes que solo miraron la portada mezclaría dos problemas distintos. Y todas las columnas describen la sesión antes del desenlace: no hay ninguna que solo se conozca después de comprar. Si incluyeras metodo_pago, el modelo alcanzaría un 99 % de acierto y sería completamente inútil, porque el método de pago solo existe si hubo compra. Eso es fuga de datos, y se ve con lupa en 05-02.
Ahora el modelo, en una sola sentencia:
CREATE OR REPLACE MODEL `alpinashop-datos.alpinashop_analitica.m_prob_compra`
OPTIONS(
model_type = 'LOGISTIC_REG',
input_label_cols = ['compro'],
auto_class_weights = TRUE,
data_split_method = 'CUSTOM',
data_split_col = 'es_test',
enable_global_explain = TRUE
) AS
SELECT
* EXCEPT(sesion_id, fecha),
fecha >= DATE '2026-01-01' AS es_test
FROM `alpinashop-datos.alpinashop_analitica.ml_sesiones`;Las opciones, una a una:
LOGISTIC_REG: regresión logística, un clasificador simple, rápido, barato y explicable. Empezar por el modelo más simple que pueda funcionar no es conservadurismo: es la única forma de saber si un modelo complejo aporta algo.auto_class_weights = TRUE: si solo el 12 % de las sesiones acaban en compra, un modelo perezoso puede decir "nadie compra" y acertar el 88 %. Esta opción compensa el desequilibrio.data_split_method = 'CUSTOM'cones_testbasado en la fecha: la división es temporal, no aleatoria. Se entrena con el pasado y se evalúa con el futuro, que es como funcionará en producción. Una división aleatoria mezclaría sesiones de marzo en el entrenamiento y de febrero en la evaluación, y el resultado sería optimista y falso.enable_global_explain = TRUE: habilita la importancia de características.
Evaluar y predecir:
-- Metricas sobre el periodo de test
SELECT * FROM ML.EVALUATE(MODEL `alpinashop-datos.alpinashop_analitica.m_prob_compra`);
-- Que caracteristicas pesan
SELECT * FROM ML.GLOBAL_EXPLAIN(MODEL `alpinashop-datos.alpinashop_analitica.m_prob_compra`);
-- Predecir sobre las sesiones abiertas de hoy
SELECT
sesion_id,
ROUND(predicted_compro_probs[OFFSET(0)].prob, 3) AS prob_compra
FROM ML.PREDICT(
MODEL `alpinashop-datos.alpinashop_analitica.m_prob_compra`,
(SELECT * FROM `alpinashop-datos.alpinashop_analitica.v_sesiones_abiertas`))
WHERE predicted_compro_probs[OFFSET(0)].prob > 0.6;ML.EVALUATE devuelve precisión, exhaustividad, f1_score, log_loss y roc_auc. En 05-02 verás qué significa cada una y por qué la exactitud a secas es la métrica que más engaña.
BigQuery ML soporta bastante más que regresión logística: árboles potenciados, DNN, k-means para segmentación, ARIMA_PLUS para series temporales, matrix factorization para recomendación, importación de modelos de TensorFlow, y llamadas a modelos Gemini desde SQL con ML.GENERATE_TEXT. Un modelo entrenado en BigQuery ML se puede exportar y registrar en Vertex AI para servirlo en un endpoint, así que la elección no es una puerta cerrada.
- Cuándo BigQuery ML y cuándo Vertex AI
| Criterio | BigQuery ML | Vertex AI (AutoML o personalizado) |
|---|---|---|
| Lenguaje | SQL | Python (o sin código con AutoML) |
| Dónde están los datos | Ya en BigQuery | Cualquier sitio |
| Tipos de datos | Tabular (y texto vía Gemini) | Tabular, imagen, texto, vídeo |
| Control del modelo | Limitado a lo que ofrece | Total |
| Tiempo hasta el primer resultado | Minutos | Horas o días |
| Servicio en línea | Vía exportación a Vertex AI | Nativo |
| Perfil de quien lo usa | Analista de datos | Ingeniero de datos o de ML |
| Coste típico | Bajo, se factura como consulta | Medio o alto |
La regla práctica para AlpinaShop: si el dato está en BigQuery, el problema es tabular y quieres una respuesta esta semana, empieza por BigQuery ML. Si no llega —porque necesitas imágenes, texto libre, una arquitectura propia o latencia en línea—, sube a Vertex AI. Lo contrario, empezar por lo complejo, cuesta semanas y muchas veces acaba en un modelo peor.
Y una observación honesta: en una pyme, la mayoría de los problemas de ML útiles son tabulares y caben en BigQuery ML. La sofisticación se reserva para donde de verdad aporte.
- Coste de la plataforma y los dos interruptores que hay que apagar
Vertex AI factura por partes, y la mayoría de las sorpresas vienen de dos de ellas.
| Concepto | Cómo se factura | Riesgo de sorpresa |
|---|---|---|
| Workbench | Por hora de VM encendida | Alto: se queda abierta |
| Entrenamiento | Por hora de máquina, mientras dura | Bajo: acaba solo |
| Endpoint | Por hora de nodo, esté o no en uso | Muy alto: no se apaga solo |
| Predicción por lotes | Por trabajo ejecutado | Bajo |
| Feature Store en línea | Por nodo de servicio | Medio |
| APIs preentrenadas | Por unidad procesada | Bajo y predecible |
| Modelos generativos | Por tokens de entrada y salida | Medio, según volumen |
Los dos interruptores, dichos sin rodeos:
1. Apaga los notebooks. Configura idle-timeout-seconds al crear la instancia. Un e2-standard-4 olvidado un mes cuesta más que todos los entrenamientos del proyecto.
2. Deshaz el despliegue de los endpoints que no usas. Es el error caro del módulo. Un endpoint desplegado para una demo del martes sigue facturando en agosto, sin tráfico y sin que nadie lo mire.
# Ver que hay desplegado y desde cuando
gcloud ai endpoints list --region=europe-west1 --project=alpinashop-datos
# Retirar un modelo de un endpoint (deja de facturar)
gcloud ai endpoints undeploy-model ENDPOINT_ID \
--region=europe-west1 --deployed-model-id=DEPLOYED_MODEL_IDAñade a estos recursos las etiquetas de facturación que definiste en 01-04 (centro-coste:analitica) y una alerta de presupuesto sobre ellas. La optimización de costes a fondo llega en 07-05; aquí basta con la higiene mínima.
- El problema de AlpinaShop: recomendar sin entrenar nada
Cerramos con la decisión que da sentido a todo el módulo, y no es la que se espera de una lección de machine learning.
El problema de negocio es concreto: cuando un cliente añade unos crampones al carrito, ¿qué le sugiere la web? Hoy no sugiere nada. La página de carrito está vacía de contenido y la venta cruzada es cero.
Un ingeniero de ML entusiasta propondría entrenar un modelo de recomendación con embeddings de cliente y de producto. Es lo que verás en 05-03, y es una buena solución. Pero antes de eso hay que hacerse una pregunta: ¿qué se consigue sin entrenar nada?
Y resulta que ya existe la respuesta, calculada en 04-03: la tabla productos_juntos, la matriz de coocurrencia que Spark computó sobre cinco años de líneas de pedido, con soporte, confianza y lift para cada par de productos.
CREATE OR REPLACE TABLE `alpinashop-datos.alpinashop_analitica.reco_baseline` AS
WITH ranking AS (
SELECT
sku_a AS sku,
sku_b AS sku_recomendado,
soporte, confianza, lift,
ROW_NUMBER() OVER (
PARTITION BY sku_a
ORDER BY lift DESC, confianza DESC
) AS posicion
FROM `alpinashop-datos.alpinashop_analitica.productos_juntos`
WHERE soporte >= 0.001 -- el par aparece en al menos 1 de cada 1000 pedidos
AND confianza >= 0.05 -- de quien compra A, al menos un 5% compra B
AND lift > 1.2 -- comprarlos juntos es un 20% mas probable que por azar
)
SELECT r.sku, r.sku_recomendado, r.posicion, r.lift, r.confianza
FROM ranking r
JOIN `alpinashop-datos.alpinashop_analitica.productos` p
ON p.sku = r.sku_recomendado
WHERE r.posicion <= 10
AND p.activo = TRUE
AND p.stock > 0;Léelo despacio, porque cada filtro es una decisión de negocio:
soporte >= 0.001elimina las casualidades. Dos productos que coincidieron en tres pedidos de cinco años no son un patrón, son ruido.confianza >= 0.05exige que la asociación sea razonablemente frecuente en una dirección concreta.lift > 1.2es el filtro que evita el error clásico: sin él, el recomendador sugeriría a todo el mundo el producto más vendido de la tienda. Un lift de 1 significa "se compran juntos por pura popularidad". Solo por encima hay señal real.activo = TRUE AND stock > 0es la regla más aburrida y la que más dinero salva: jamás recomiendes lo que no puedes vender. Ningún modelo, por sofisticado que sea, corrige por sí solo un catálogo con productos descatalogados.
Esto son unas decenas de líneas de SQL, se ejecuta en segundos, cuesta céntimos, no necesita entrenamiento, no necesita endpoint, es completamente explicable ("te sugerimos esto porque el 23 % de quienes compran crampones compran también este piolet") y se puede poner en producción esta semana.
¿Es tan bueno como un modelo entrenado? No. Tiene tres límites conocidos: no personaliza —a todo el mundo le sugiere lo mismo para el mismo producto—, no sabe nada de los productos nuevos que aún no tienen historial (arranque en frío), y no aprovecha información del cliente ni de la sesión.
¿Importa? Depende de contra qué se compare. Y hoy se compara con no recomendar nada. Pasar de cero a una heurística decente captura la mayor parte del valor. Pasar de esa heurística a un modelo entrenado captura un incremento adicional, que puede merecer la pena o no.
Decisión DA-003. AlpinaShop despliega primero el recomendador heurístico basado en
productos_juntoscomo línea base en producción. Cualquier modelo de ML posterior deberá demostrar que supera a esta línea base en una prueba A/B con métricas de negocio, no solo en una métrica offline. Si no la supera, no se despliega.
Esta decisión es la más importante del módulo, y merece decirse claramente: la mejor decisión de machine learning a veces es no hacer machine learning. Un equipo maduro se distingue por tener una línea base contra la que medirse, y por estar dispuesto a aceptar que a veces la línea base gana.
Errores Comunes y Consejos
Empezar por el modelo y no por la decisión. Si nadie sabe qué va a cambiar en la web cuando el modelo prediga, el proyecto ya ha fracasado. Escribe primero la frase: "cuando el modelo diga X, la tienda hará Y".
No tener línea base. Un AUC de 0,84 no significa nada por sí solo. ¿Cuánto daba una regla simple? Si la regla daba 0,81, el modelo aporta muy poco para lo que cuesta mantenerlo.
Dejar endpoints y notebooks encendidos. El error más caro de esta lección. Ponlo en el calendario: una revisión mensual de gcloud ai endpoints list y de instancias de Workbench.
Confundir división temporal con división aleatoria. En cualquier problema con dimensión temporal —y casi todos los de una tienda la tienen—, entrenar con datos posteriores a los de evaluación produce métricas fantásticas que no se reproducen en producción.
Calcular las características dos veces. El sesgo entrenamiento/servicio del apartado 7. Si el mismo número lo calculan dos personas en dos lenguajes, tarde o temprano dejarán de coincidir.
Usar latest en las imágenes de contenedor. Rompe la reproducibilidad. Etiqueta con versión siempre.
Meter datos personales en el modelo por inercia. Un modelo no necesita el email para predecir. Entrena sobre las vistas seudonimizadas de 04-07 y tendrás menos riesgo y menos obligaciones, sin perder nada de calidad.
Consejo: escribe una tarjeta de modelo desde el primer día. Cuatro líneas —para qué sirve, con qué datos se entrenó, qué métrica tiene, qué limitaciones conocidas— escritas cuando aún te acuerdas. En 05-07 verás que es un requisito, no un adorno.
Consejo: fija la semilla aleatoria. Un modelo que da un resultado distinto cada vez que se entrena es imposible de depurar.
Ejercicios
Ejercicio 1
Marta ha recibido la factura de Vertex AI del mes: 612 €, cuando el mes anterior fueron 40 €. El equipo no ha entrenado nada nuevo. Enumera las causas más probables por orden de probabilidad, indica qué comando o vista usarías para confirmarlas, y propón tres medidas preventivas.
Ejercicio 2
Lucía quiere predecir, para cada SKU, cuántas unidades se venderán la semana que viene, con el fin de ajustar el pedido a proveedores. Tiene ventas_diarias_sku en BigQuery con cinco años de historia. Decide entre BigQuery ML y Vertex AI justificando la elección, escribe el esqueleto de la solución y responde: ¿endpoint en línea o predicción por lotes, y por qué?
Ejercicio 3
Dani propone entrenar un modelo que decida automáticamente si un pedido es fraudulento y, en caso afirmativo, cancelarlo sin intervención humana. Analiza la propuesta desde tres ángulos: técnico, de negocio y legal. Propón un diseño alternativo.
Soluciones
Solución 1
Causas, por probabilidad:
- Un endpoint desplegado y olvidado. Es la causa número uno. Un endpoint con dos nodos encendido todo el mes explica por sí solo la mayor parte del salto, sin una sola petición.
- Una instancia de Workbench sin apagar, especialmente si alguien probó con GPU y no la retiró.
- Un ajuste de hiperparámetros lanzado sin mirar: 40 pruebas son 40 entrenamientos.
- Feature Store en línea aprovisionado en una prueba y nunca eliminado.
- Predicciones por lotes en bucle por un Scheduler mal configurado que dispara cada hora en vez de cada noche.
Cómo confirmarlo:
gcloud ai endpoints list --region=europe-west1 --project=alpinashop-datos
gcloud workbench instances list --project=alpinashop-datos
gcloud ai custom-jobs list --region=europe-west1 --project=alpinashop-datos \
--filter="createTime>2026-07-01"
gcloud ai feature-online-stores list --region=europe-west1 --project=alpinashop-datosY en el informe de facturación exportado a BigQuery (01-04), el desglose que da la respuesta directa:
SELECT
service.description AS servicio,
sku.description AS concepto,
ROUND(SUM(cost), 2) AS euros
FROM `alpinashop-datos.facturacion.gcp_billing_export_v1_XXXX`
WHERE DATE(usage_start_time) >= DATE '2026-07-01'
AND service.description LIKE '%Vertex%'
GROUP BY servicio, concepto
ORDER BY euros DESC
LIMIT 15;Medidas preventivas:
- Alerta de presupuesto sobre la etiqueta
centro-coste:analiticaal 50 %, 80 % y 100 % del importe esperado (01-04). No evita el gasto, pero lo detecta en días en vez de en un mes. idle-timeout-secondsobligatorio en toda instancia de Workbench, aplicado por política de organización o por revisión al crear.- Revisión mensual programada de endpoints y notebooks, con la regla explícita: todo endpoint sin tráfico en 14 días se retira. Se puede automatizar consultando las métricas del endpoint en Cloud Monitoring (06-04).
Solución 2
Elección: BigQuery ML, y con bastante claridad.
Justificación: el dato ya está en BigQuery en la tabla ventas_diarias_sku; el problema es una serie temporal univariante por SKU, un caso que BigQuery ML cubre nativamente con ARIMA_PLUS; la salida es un pedido semanal a proveedores, así que no hay ninguna necesidad de latencia baja; y quien lo va a mantener es Lucía, que trabaja en SQL. Subir esto a Vertex AI añadiría semanas de trabajo y coste sin ninguna ventaja.
CREATE OR REPLACE MODEL `alpinashop-datos.alpinashop_analitica.m_demanda_sku`
OPTIONS(
model_type = 'ARIMA_PLUS',
time_series_timestamp_col = 'fecha',
time_series_data_col = 'unidades',
time_series_id_col = 'sku',
holiday_region = 'ES',
auto_arima = TRUE,
data_frequency = 'DAILY'
) AS
SELECT fecha, sku, unidades
FROM `alpinashop-datos.alpinashop_analitica.ventas_diarias_sku`
WHERE fecha >= DATE_SUB(CURRENT_DATE(), INTERVAL 3 YEAR);-- Prevision a 7 dias con intervalo de confianza
SELECT
sku,
DATE(forecast_timestamp) AS fecha,
ROUND(forecast_value, 1) AS unidades_previstas,
ROUND(confidence_interval_lower_bound, 1) AS minimo,
ROUND(confidence_interval_upper_bound, 1) AS maximo
FROM ML.FORECAST(
MODEL `alpinashop-datos.alpinashop_analitica.m_demanda_sku`,
STRUCT(7 AS horizon, 0.9 AS confidence_level))
ORDER BY sku, fecha;Detalles que marcan la diferencia:
time_series_id_col = 'sku'entrena un modelo por SKU en una sola sentencia. Con 2.400 SKU esto ahorra un proyecto entero.holiday_region = 'ES'incorpora los festivos españoles, que en una tienda de montaña importan mucho: Semana Santa y los puentes son picos reales.- El intervalo de confianza es más útil que la predicción puntual. Para decidir un pedido a proveedor interesa el rango, no el número mágico. Con productos de rotación baja, el intervalo será ancho, y eso es información honesta: el modelo te está diciendo que no sabe.
Endpoint o lotes: lotes, sin discusión. La previsión se necesita una vez por semana para hacer un pedido. Un endpoint 24×7 para responder a una consulta semanal es la definición literal de gasto inútil. Se programa con Cloud Scheduler y Workflows (04-06) los domingos por la noche y escribe en una tabla que Lucía consulta el lunes.
Cautela: los SKU con poco historial o muy estacionales darán previsiones malas. Conviene filtrar los que tengan menos de un año de datos y tratarlos con una regla manual, y validar el modelo comparando su previsión contra las últimas cuatro semanas reales antes de fiarse.
Solución 3
Ángulo técnico. El fraude es un problema de clases extremadamente desequilibradas: quizá 3 pedidos fraudulentos de cada 10.000. Un modelo que diga "nunca hay fraude" acierta el 99,97 %, y es inútil. Además, los datos disponibles casi con seguridad no están etiquetados: nadie ha marcado históricamente qué pedidos fueron fraude, y sin etiquetas no hay aprendizaje supervisado. Y el fraude es adversario: los defraudadores cambian de táctica en cuanto detectan la defensa, de modo que el modelo se degrada por diseño, no por accidente.
Ángulo de negocio. Hay que valorar los dos errores por separado, y no cuestan lo mismo. Un falso negativo cuesta el importe del pedido. Un falso positivo cancela la compra de un cliente legítimo: pierdes el margen, pierdes probablemente al cliente, y te ganas una reseña de una estrella. Con un 0,03 % de fraude real, incluso un modelo bueno generará muchos más falsos positivos que fraudes detectados. El coste esperado de la automatización total es casi seguro negativo.
Ángulo legal. Este es el determinante. El artículo 22 del RGPD regula las decisiones basadas únicamente en tratamiento automatizado que produzcan efectos jurídicos o afecten significativamente a una persona. Cancelar el pedido de un cliente automáticamente y acusarle implícitamente de fraude encaja de lleno. Genera obligaciones de información, derecho a obtener intervención humana, a expresar el punto de vista y a impugnar la decisión. A esto se suma el Reglamento Europeo de IA (AI Act), con requisitos de gestión de riesgos, documentación, transparencia y supervisión humana según la clasificación del sistema. Este análisis no sustituye a un dictamen jurídico: la clasificación concreta y las obligaciones aplicables las debe determinar un profesional de compliance o el DPO antes de cualquier implantación.
Diseño alternativo: el modelo puntúa, la persona decide.
flowchart LR
A[Pedido nuevo] --> B[Puntuacion de riesgo]
B -->|< 0,7| C[Aprobacion automatica]
B -->|0,7 - 0,9| D[Cola de revision manual]
B -->|> 0,9| E[Retencion + revision prioritaria]
D --> F[Decision humana registrada]
E --> F
F --> G[Etiqueta para reentrenar]
Cuatro propiedades que lo hacen viable:
- Ninguna cancelación es automática. Siempre hay una persona en el bucle, lo que resuelve el problema del artículo 22 y el requisito de supervisión humana.
- Los umbrales son decisiones de negocio, ajustables según cuánta capacidad de revisión haya. Si hay una persona media jornada, se calibra para que la cola quepa en su jornada.
- Cada decisión humana genera una etiqueta, que es justamente el dato que hoy no existe. En seis meses habrá un conjunto etiquetado real con el que entrenar en serio.
- Cada decisión queda registrada con la versión del modelo, la puntuación y el motivo. Eso es lo que se enseña en una auditoría o ante una reclamación.
Y la primera versión de la puntuación no necesita ser un modelo: media docena de reglas —dirección de envío distinta de la de facturación, cuenta creada hace menos de una hora, importe muy por encima de la media, tres intentos de pago fallidos— capturan buena parte del fraude evidente, son explicables al cliente y se implementan en un día. La misma lógica del apartado 15.
Conclusión
Has visto por qué un modelo en un portátil no es un producto, y qué hace falta alrededor para que lo sea: reproducibilidad, escala, servicio, trazabilidad y vigilancia. Esos cinco huecos son exactamente los que rellena una plataforma de ML.
Conoces el ciclo de vida completo —problema, datos, características, entrenamiento, evaluación, despliegue, monitorización, reentrenamiento— y sabes que es un bucle, no una línea: un modelo desplegado y olvidado es un pasivo. Y sabes qué componente de Vertex AI cubre cada etapa, desde Workbench hasta Pipelines, con la nota histórica de que AI Platform y AutoML eran productos separados y hoy todo vive bajo el mismo paraguas.
Has montado el Workbench de Lucía con cuenta de servicio, sin IP pública y con apagado automático, leyendo de las vistas gobernadas del módulo 4 y agregando en BigQuery en lugar de descargar gigabytes. Has creado el conjunto gestionado pedidos-historico apuntando deliberadamente a v_pedidos_analitica y no a la tabla con emails. Has entendido el sesgo entrenamiento/servicio —el error silencioso de calcular la misma característica de dos maneras— y cómo lo resuelve Feature Store, además de cuándo todavía no compensa montarlo.
Sabes lanzar trabajos de entrenamiento personalizados con contenedor versionado, ajustar hiperparámetros con búsqueda bayesiana sin arruinarte, versionar en el Model Registry con alias que permiten promover y revertir en segundos, y elegir entre endpoint en línea y predicción por lotes con un criterio claro: si el resultado no depende de algo que acaba de ocurrir, va por lotes. De ahí salió la decisión DA-002. Y sabes vigilar la deriva sin convertir las alertas en ruido.
Has entrenado tu primer modelo con BigQuery ML en una sentencia SQL, con división temporal, pesos de clase automáticos y explicabilidad activada, y tienes el criterio de cuándo basta con SQL y cuándo hay que subir a Vertex AI. Y tienes los dos interruptores de coste bien identificados: apaga los notebooks, retira los endpoints.
Pero lo que más va a valer de esta lección es la decisión DA-003. AlpinaShop va a poner en producción un recomendador que no es un modelo: unas decenas de líneas de SQL sobre la matriz productos_juntos que calculó Spark, con filtros de soporte, confianza y lift, y con la regla más importante de todas —no recomendar lo que no hay en stock—. Es explicable, cuesta céntimos, está listo esta semana, y cualquier modelo que venga después tendrá que demostrar que lo supera en negocio, no en una métrica de laboratorio.
En 05-02, AutoML, damos el siguiente paso natural: entrenar modelos de verdad sin escribir código. Verás qué hace AutoML por debajo —búsqueda de arquitectura, ingeniería de características y ensamblado—, qué tipos de problema cubre y con cuántos datos mínimos, y lo aplicarás a dos casos de AlpinaShop: predecir la probabilidad de compra de un carrito partiendo de visitas y v_pedidos_analitica, y clasificar las fotos del catálogo con AutoML Vision. Por el camino aprenderás a leer de verdad una matriz de confusión, a entender por qué el umbral de decisión es una decisión de negocio y no técnica, y a detectar las tres trampas que arruinan más proyectos que ninguna otra cosa: la fuga de datos, el desequilibrio de clases y el sobreajuste.
Y llevarás contigo la línea base. Porque a partir de ahora, cada modelo que entrenes tiene un rival al que batir.
Curso de Google Cloud Platform (GCP)
Módulo 1: Introducción a Google Cloud Platform
- ¿Qué es Google Cloud Platform?
- Configuración de tu cuenta de GCP
- Descripción general de la consola de GCP
- Proyectos, jerarquía de recursos y facturación
- Regiones, zonas y modelo de responsabilidad compartida
- Cloud Shell y la CLI de gcloud
Módulo 2: Servicios principales de GCP
- Compute Engine: máquinas virtuales en Google Cloud
- Cloud Storage: almacenamiento de objetos
- Cloud SQL: bases de datos relacionales gestionadas
- App Engine: plataforma como servicio
- Google Kubernetes Engine (GKE)
- Bases de datos NoSQL: Firestore, Bigtable y Spanner
- Cómo elegir el servicio de cómputo adecuado
Módulo 3: Redes y seguridad
- Redes VPC
- Balanceo de carga en la nube
- Cloud CDN
- Gestión de identidad y acceso (IAM)
- Cloud Armor
- Secretos y cifrado: Secret Manager y Cloud KMS
- Cloud DNS, certificados TLS y publicación segura de servicios
Módulo 4: Datos y análisis
- BigQuery: el almacén de datos analítico
- Cloud Dataflow: procesamiento de datos por lotes y en streaming
- Cloud Dataproc: Spark y Hadoop gestionados
- Cloud Pub/Sub: mensajería asíncrona
- Cloud Data Fusion: integración de datos sin código
- Orquestación de pipelines con Cloud Composer y Workflows
- Gobierno del dato y cuadros de mando con Dataplex y Looker Studio
Módulo 5: Aprendizaje automático e IA
- Vertex AI: la plataforma de machine learning de GCP
- AutoML: modelos a medida sin escribir código
- TensorFlow en GCP: entrenamiento y servicio de modelos
- API de lenguaje natural
- API de visión
- IA generativa en Vertex AI: modelos Gemini y embeddings
- MLOps: del modelo al producto con Vertex AI Pipelines
Módulo 6: DevOps y monitoreo
- Cloud Build: integración continua en GCP
- Cloud Source Repositories y gestión del código fuente
- Cloud Functions: funciones sin servidor
- Cloud Monitoring (antes Stackdriver): métricas, paneles y alertas
- Cloud Deployment Manager e infraestructura como código nativa
- Cloud Logging y Cloud Trace: logs, trazas y diagnóstico
- Terraform en GCP: infraestructura como código en la práctica
Módulo 7: Temas avanzados de GCP
- Híbrido y multinube con Anthos
- Computación sin servidor con Cloud Run
- Redes avanzadas: VPC compartida, peering y conectividad híbrida
- Mejores prácticas de seguridad
- Gestión y optimización de costos
- Fiabilidad: SLO, alta disponibilidad y recuperación ante desastres
- Gobierno a escala: organización, políticas y auditoría
