Avanzado 2 min de lectura

ML con Snowflake: Feature Store y Model Registry

Entrena, registra y despliega modelos de machine learning directamente en Snowflake usando el Feature Store, Model Registry y Snowpark ML.

La stack de ML en Snowflake

Snowflake ofrece un stack completo de MLOps sin salir de la plataforma:

DATOS → Feature Store → Entrenamiento → Model Registry → Inferencia
         (features)     (Snowpark ML)    (registro)      (SPCS o UDF)

Feature Store

El Feature Store permite crear y compartir features (variables) calculadas para entrenamiento y predicción.

from snowflake.ml.feature_store import (
    FeatureStore, FeatureView, Entity, CreationMode
)

# Inicializar el Feature Store
fs = FeatureStore(
    session=session,
    database="ML_DB",
    name="PROD_FEATURE_STORE",
    default_warehouse="ML_WH",
    creation_mode=CreationMode.CREATE_IF_NOT_EXIST
)

# Definir una entidad (el "key" de las features)
cliente_entity = Entity(name="CLIENTE", join_keys=["cliente_id"])
fs.register_entity(cliente_entity)

# Crear features de comportamiento
features_sql = session.sql("""
    SELECT
        cliente_id,
        COUNT(*) AS compras_30d,
        SUM(monto) AS gasto_30d,
        AVG(monto) AS ticket_promedio_30d,
        MAX(fecha) AS ultima_compra
    FROM ventas
    WHERE fecha >= DATEADD('day', -30, CURRENT_DATE())
    GROUP BY cliente_id
""")

fv = FeatureView(
    name="FEATURES_COMPORTAMIENTO",
    entities=[cliente_entity],
    feature_df=features_sql,
    refresh_freq="1 day",
    desc="Features de comportamiento de compra últimos 30 días"
)

fv = fs.register_feature_view(feature_view=fv, version="V1")

Entrenamiento con Snowpark ML

from snowflake.ml.modeling.ensemble import GradientBoostingClassifier
from snowflake.ml.modeling.preprocessing import StandardScaler
from snowflake.ml.modeling.pipeline import Pipeline

# Obtener training data desde el Feature Store
training_data = fs.retrieve_feature_values(
    spine_df=session.table("clientes_etiquetados"),
    features=[fv],
    spine_timestamp_col="fecha_etiqueta"
)

# Pipeline de ML
pipeline = Pipeline([
    ("scaler", StandardScaler(
        input_cols=["compras_30d", "gasto_30d", "ticket_promedio_30d"],
        output_cols=["compras_scaled", "gasto_scaled", "ticket_scaled"]
    )),
    ("model", GradientBoostingClassifier(
        input_cols=["compras_scaled", "gasto_scaled", "ticket_scaled"],
        label_cols=["churn_label"],
        output_cols=["prediccion"]
    ))
])

pipeline.fit(training_data)

Model Registry

from snowflake.ml.registry import Registry

registry = Registry(session=session, database_name="ML_DB", schema_name="MODELS")

# Registrar el modelo
model_version = registry.log_model(
    model=pipeline,
    model_name="modelo_churn_clientes",
    version_name="V1_0",
    comment="Gradient Boosting para predicción de churn",
    metrics={"accuracy": 0.87, "auc": 0.92},
    tags={"team": "data_science", "proyecto": "retencion"}
)

# Inferencia desde SQL
registry.deploy(
    model_name="modelo_churn_clientes",
    version_name="V1_0",
    platform="WAREHOUSE"
)
-- Predicción en batch desde SQL
SELECT
    c.cliente_id,
    c.nombre,
    modelo_churn_clientes!PREDICT(
        compras_30d, gasto_30d, ticket_promedio_30d
    ) AS prediccion_churn
FROM clientes c
JOIN features_comportamiento f ON c.cliente_id = f.cliente_id
WHERE prediccion_churn > 0.7;  -- clientes con >70% probabilidad de churn

Próximos pasos

Combina el ML predictivo con Cortex Agents para crear sistemas de decisión automáticos.

#ml #feature-store #model-registry #snowpark-ml #mlops