Cómo construir un sistema de recomendación híbrido
En el primer artículo de esta serie vimos que un sistema de recomendación no es simplemente un modelo de Machine Learning, sino una…
Cómo construir un sistema de recomendación híbrido
En el primer artículo de esta serie vimos que un sistema de recomendación no es simplemente un modelo de Machine Learning, sino una herramienta de decisión: nos ayuda a decidir qué mostrar, a quién, cuándo y con qué objetivo de negocio.
Posteriormente, en el segundo y tercer artículo, abordamos la implementación práctica utilizando el dataset de Instacart. En ellos desarrollamos recomendadores basados en Collaborative Filtering con enfoques user-based e item-based, además de compararlo con baselines, y sistemas Content-Based empleando técnicas de TF-IDF y embeddings.
En estos ejercicios aprendimos que el Collaborative Filtering puede aportar personalización frente a recomendar lo mismo a todo el mundo y que el Content-Based es útil como cold start y descubrimiento de nuevos productos.
En este último artículo, construiremos un modelo híbrido combinando varios sistemas de recomendación. Por último, realizaremos una comparativa de todos los recomendadores desarrollados para evaluarlos y compararlos conjuntamente.
Cómo se construye un recomendador híbrido

El modelo híbrido que vamos a construir mezclará señales de comportamiento, como productos comprados por usuarios similares, con señales de contenido, como productos parecidos a los que el propio usuario ya ha comprado.
- CF user-based: comportamiento de usuarios similares
- CF item-based: productos comprados conjuntamente
- CB TF-IDF: similitud textual del catálogo
- CB embeddings: similitud semántica del catálogo
Este híbrido no pretende ser un modelo definitivo ni optimizado para producción. Lo utilizaremos como una primera aproximación sencilla para entender cómo pueden combinarse distintas fuentes de información dentro de un mismo sistema de recomendación.
Los pasos a seguir son los siguientes:
-
Generamos recomendaciones con cada modelo (ya generadas en los artículos anteriores)
-
Normalizamos los scores de cada ranking
-
Damos un peso a cada modelo. Podemos dar más peso a unos modelos o a otros, en nuestro caso, le vamos a dar el mismo peso a los cuatro.
-
Sumamos scores por producto
-
Nos quedamos con el top 10 para cada usuario
Como ya tenemos generadas las recomendaciones de cada modelo, partimos de los siguientes dataframes:
- df_recommendations_cf_user
- df_recommendations_cf_item
- df_recommendations_cb_tfidf
- df_recommendations_cb_embeddings
Cada uno de ellos contiene 4 columnas: user_id, product_id, score y product_name.
El siguiente paso es llevar todos los scores a una escala comparable. Para ello, definimos una función de normalización:
def normalizar_recomendaciones(recommendations):
recommendations = recommendations.copy()
if recommendations.empty:
recommendations["normalized_score"] = []
return recommendations
# Calculamos el valor mínimo y máximo de score
score_min = recommendations["score"].min()
score_max = recommendations["score"].max()
# Si el máximo y el mínimo son cercanos, lo normalizamos a 1 para no dividir entre un número muy pequeño
if np.isclose(score_min, score_max):
recommendations["normalized_score"] = 1.0
else:
recommendations["normalized_score"] = (recommendations["score"] - score_min) / (score_max - score_min)
return recommendations
Definimos la función para aplicar el modelo híbrido sobre un usuario:
def hibrido_ponderado_usuario(uid, top_k):
# Filtramos las recomendaciones de cada modelo
df_cf_user = df_recommendations_cf_user[
df_recommendations_cf_user["user_id"]==uid
]
df_cf_item = df_recommendations_cf_item[
df_recommendations_cf_item["user_id"]==uid
]
df_cb_tfidf = df_recommendations_cb_tfidf[
df_recommendations_cb_tfidf["user_id"]==ui
]
df_cb_emb = df_recommendations_cb_embeddings[
df_recommendations_cb_embeddings["user_id"]==uid
]
# Asignamos un peso a cada modelo
componentes = [
(df_cf_user, 0.25),
(df_cf_item, 0.25),
(df_cb_tfidf, 0.25),
(df_cb_emb, 0.25),
]
# Calculamos el score ponderado de cada recomendación
frames = []
for recomendaciones, peso in componentes:
recomendaciones = normalizar_recomendaciones(recomendaciones)
recomendaciones["weighted_score"] = recomendaciones["normalized_score"] * peso
frames.append(recomendaciones[["product_id", "weighted_score"]])
# Agrupamos por producto, sumando el score.
# Tomamos sólo los top_k productos a recomendar
recomendaciones_hibridas = (
pd.concat(frames, ignore_index=True)
.groupby("product_id", as_index=False)["weighted_score"]
.sum()
.sort_values(["weighted_score", "product_id"], ascending=[False, True])
.head(top_k)
.rename(columns={"weighted_score": "score"})
)
recomendaciones_hibridas.insert(0, "user_id", int(uid))
recomendaciones_hibridas.insert(0, "model", "hybrid_weighted")
return recomendaciones_hibridas[["model", "user_id", "product_id", "score"]]
Con esto definido, ya podemos aplicar el modelo híbrido para todos los usuarios:
from joblib import Parallel, delayed
from tqdm import tqdm
recommendations_hybrids = Parallel(n_jobs=8, batch_size=100)(
delayed(hibrido_ponderado_usuario)(uid, top_k=top_k)
for uid in tqdm(users_id)
)
df_recommendations_hybrids = pd.concat(
recommendations_hybrids, ignore_index=True
)
# Añadimos información del producto
df_recommendations_hybrids = df_recommendations_hybrids.merge(
df_catalog[["product_id", "product_name", "aisle", "department"]],
on="product_id",
how="left",
)

Nota: esta implementación prioriza la claridad del proceso sobre la eficiencia. A medida que crece el volumen de usuarios o productos, el coste en tiempo y memoria aumenta significativamente, ya que estamos generando recomendaciones de forma iterativa para cada usuario.
En entornos reales, este tipo de cálculos se hacen por batches o de forma vectorizada sobre toda la matriz, utilizando enfoques más eficientes. Sin embargo, eso implica introducir técnicas más avanzadas que se salen del objetivo de este artículo, centrado en entender el funcionamiento del modelo y validar su comportamiento.
Resultados del experimento
Evaluamos ahora todos los recomendadores construidos hasta este punto:
- Los baselines de popularidad global y frecuencia histórica del usuario
- Los modelos de Collaborative Filtering (user-based e item-based)
- Los modelos Content-Based (TF-IDF y embeddings)
Como en los experimentos previos, haremos una evaluación offline, no causal. Es decir, comprobaremos si los productos recomendados coinciden con los que el usuario terminó comprando en su pedido de validación, pero no podremos medir si el recomendador habría cambiado realmente su comportamiento, aumentado las ventas o impulsado el descubrimiento de nuevos productos.
Para ello, usamos el pedido de validación (clasificado como train) como ground truth y calculamos las métricas Precision@k y Recall@k (para esta última, utilizamos la normal y la modificada, excluyendo los productos ya comprados por el usuario).

Como era de esperar, el modelo híbrido se sitúa en un punto intermedio entre los enfoques que combina: mejora claramente a los recomendadores Content-Based puros, pero no supera a los modelos basados en comportamiento ni al baseline de frecuencia del usuario en esta evaluación offline.
Aprendizajes
- Las métricas dependen del contexto de negocio La primera lectura del gráfico podría llevarnos a una conclusión demasiado rápida: los recomendadores Content-Based obtienen métricas más bajas que los modelos de Collaborative Filtering y que los baselines. Pero estamos evaluando el modelo con una compra futura real en grocery, un dominio muy marcado por la recompra. Por eso, los modelos basados en comportamiento histórico parten con ventaja en una evaluación offline de este tipo. El baseline de frecuencia del usuario es un buen ejemplo ya que obtiene métricas muy altas porque recomienda productos que el usuario ya ha comprado antes, pero su recall_unseen@10 es 0, ya que no aporta descubrimiento de productos nuevos.
- El híbrido debe diseñarse según el objetivo El modelo híbrido queda en una posición intermedia: mejora a los recomendadores Content-Based puros, pero no supera a los modelos de Collaborative Filtering ni a los baseline. Este resultado muestra que un híbrido no tiene por qué “ganar” automáticamente en todas las métricas. Su principal ventaja es que permite ajustar el equilibrio entre varios objetivos: recompra, descubrimiento, cobertura del catálogo y diversidad. En un caso real, no optimizaríamos los pesos de forma genérica, sino en función del objetivo del negocio: vender más productos recurrentes, impulsar categorías nuevas, evitar recomendaciones repetitivas o dar visibilidad a una parte más amplia del catálogo.
La clave está en entender qué aporta cada enfoque:
- Collaborative Filtering captura patrones de comportamiento
- Content-Based captura similitud de producto
- Los baselines nos recuerdan que, en algunos dominios, las soluciones simples pueden ser muy competitivas
Mejoras a introducir en un sistema en producción
El ejercicio nos sirve para entender la lógica, pero un sistema en producción tendría que evolucionar.
Además de las mejoras propuestas en los artículos anteriores, hay otras que podemos extraer de este nuevo sistema:
- Ajustar los pesos del híbrido: deberían optimizarse según el objetivo
- Introducir reglas de diversidad: evitar que todo el ranking se llene de productos demasiado parecidos
- Separar objetivos: un carrusel de “compra de nuevo” no debería optimizar lo mismo que uno de “descubre nuevos productos”
- Mejorar la representación de producto: añadir marca, precio, ingredientes, promociones, imágenes o atributos nutricionales en las descripciones de los productos
Conclusión
En este último artículo de la serie hemos construido un recomendador híbrido que combina señales de comportamiento y de contenido, y lo hemos comparado con los baselines, los modelos de Collaborative Filtering y los enfoques Content-Based desarrollados en los artículos anteriores.
La principal conclusión es que no existe un único “mejor” recomendador fuera de contexto. Un híbrido permite combinar distintas lógicas, pero su valor depende de cómo ponderemos cada señal y del objetivo que queramos optimizar: recompra, descubrimiento, diversidad, conversión o cobertura del catálogo.
Por eso, más que elegir un modelo ganador, lo importante es entender qué aporta cada enfoque y diseñar una arquitectura de recomendación alineada con el objetivo de negocio.
메타데이터
- post_id
- f26c8ecc3dff
- slug
- cómo-construir-un-sistema-de-recomendación-híbrido-f26c8ecc3dff
- url
- https://medium.com/kraz-ai-solutions/c%C3%B3mo-construir-un-sistema-de-recomendaci%C3%B3n-h%C3%ADbrido-f26c8ecc3dff
- canonical_url
- https://medium.com/kraz-ai-solutions/c%C3%B3mo-construir-un-sistema-de-recomendaci%C3%B3n-h%C3%ADbrido-f26c8ecc3dff
- author_url
- https://medium.com/@angels.fuertes
- status
- ok
- fetched_at
- 2026-06-20 20:29:01