Skip to content

danGO-79/recomm

Repository files navigation

Recomendador de Ciudades

Este proyecto contiene un sistema de recomendación de ciudades que utiliza diferentes algoritmos de machine learning para ayudar a los usuarios a encontrar ciudades que se ajusten a sus preferencias personales. El sistema está compuesto por tres scripts independientes, cada uno con un enfoque diferente para abordar el problema de recomendación.

Los scripts implementan desde sistemas basados en similitud (KNN) hasta modelos supervisados que aprenden de datos históricos (Random Forest), ofreciendo flexibilidad para diferentes escenarios y necesidades. Cada herramienta está diseñada para ser utilizada desde la línea de comandos y puede generar modelos persistentes que se guardan en disco para uso posterior.

Scripts

KNN-recomendation.py

KNN-recomendation.py es un sistema de recomendación basado en el algoritmo K-Nearest Neighbors (KNN) que encuentra ciudades similares a las preferencias de un usuario mediante el cálculo de similitud entre vectores de características. Este script utiliza la métrica de distancia coseno para medir qué tan similares son las preferencias del usuario con respecto a las características de cada ciudad en la base de datos.

El algoritmo funciona de manera no supervisada, lo que significa que no requiere datos históricos de usuarios ni ratings previos. Solo necesita un archivo CSV con las ciudades y sus características numéricas (típicamente 10 características como seguridad, transporte, cultura, gastronomía, etc.). El script normaliza automáticamente todas las características al rango [0, 1] usando MinMaxScaler para asegurar que todas las dimensiones tengan el mismo peso en el cálculo de similitud.

El proceso de trabajo consta de dos fases principales: entrenamiento y predicción. Durante el entrenamiento, el script lee el CSV de ciudades, extrae las características numéricas, las normaliza y entrena el modelo KNN. El modelo entrenado, junto con el scaler y la base de datos completa, se guarda en un archivo .pkl para uso posterior. En la fase de predicción, el script carga el modelo pre-entrenado, normaliza las preferencias del usuario usando el mismo scaler del entrenamiento, y encuentra las ciudades más cercanas (más similares) a esas preferencias.

La salida del script es un DataFrame con las ciudades recomendadas ordenadas por su match_score, un valor entre 0 y 1 donde 1 representa máxima similitud. El score se calcula como (1 - distancia_coseno), por lo que valores más altos indican mejor alineación entre las preferencias del usuario y las características de la ciudad.

Uso:

# Entrenar el modelo
python KNN-recomendation.py train --data ciudades.csv --out city_model.pkl

# Generar recomendaciones
python KNN-recomendation.py predict --model city_model.pkl 8.5 7.2 9.0 6.5 8.0 7.8 9.2 6.0 8.5 7.5

Predict-satisfaction.py

Predict-satisfaction.py es un predictor de satisfacción que evalúa qué tan satisfecho estaría un usuario con diferentes ciudades utilizando un modelo KNN pre-entrenado. A diferencia de KNN-recomendation.py, este script no solo recomienda las ciudades más similares, sino que evalúa todas las ciudades en la base de datos y proporciona métricas de satisfacción más detalladas y fáciles de interpretar.

El script utiliza el mismo modelo KNN entrenado por KNN-recomendation.py, pero en lugar de retornar solo las top N ciudades, calcula la similitud con todas las ciudades disponibles. Esta similitud se convierte en una probabilidad de satisfacción expresada como porcentaje (0-100%), donde valores más altos indican mayor probabilidad de que el usuario esté satisfecho con esa ciudad.

Una característica distintiva de este script es que genera veredictos cualitativos además de los valores numéricos, facilitando la interpretación de los resultados. Los veredictos incluyen categorías como "⭐⭐⭐⭐⭐ Match Perfecto (Te encantará)" para probabilidades ≥95%, "⭐⭐⭐⭐ Muy Alta (Apuesta segura)" para ≥85%, "⭐⭐⭐ Alta (Buena opción)" para ≥70%, "⭐⭐ Media (Tiene pros y contras)" para ≥50%, y "⚠️ Baja (No recomendado)" para valores menores.

El script está diseñado para proporcionar un panorama completo de compatibilidad, mostrando las top 5 ciudades con mejor probabilidad de satisfacción junto con sus veredictos cualitativos. Esto permite a los usuarios entender no solo qué ciudades son similares a sus preferencias, sino también qué tan probable es que disfruten de cada opción.

Uso:

# Requiere un modelo pre-entrenado (generado por KNN-recomendation.py)
python Predict-satisfaction.py --model city_model.pkl 8.5 7.2 9.0 6.5 8.0 7.8 9.2 6.0 8.5 7.5

Random-Forest-Predictivo.py

Random-Forest-Predictivo.py implementa un sistema de recomendación supervisado que utiliza el algoritmo Random Forest Regressor para predecir qué rating daría un usuario a cada ciudad disponible. A diferencia de los enfoques basados en similitud (KNN), este script aprende de datos históricos reales donde usuarios anteriores han calificado ciudades, permitiendo capturar patrones complejos y relaciones no lineales entre las características del usuario, las características de la ciudad y los ratings asignados.

El algoritmo Random Forest construye un conjunto de 100 árboles de decisión que aprenden a predecir ratings basándose en la combinación de características del usuario y características de la ciudad. Durante el entrenamiento, el script realiza un JOIN entre un CSV de historial (que contiene características de usuarios, ciudades visitadas y ratings) y un CSV de ciudades (con las características de cada ciudad), creando un dataset combinado donde cada fila representa una interacción usuario-ciudad con su rating correspondiente.

La principal ventaja de este enfoque supervisado es que puede aprender patrones que no son evidentes mediante simple similitud. Por ejemplo, puede descubrir que ciertas combinaciones específicas de preferencias del usuario con características de ciudad resultan en ratings altos, incluso si la similitud general no es máxima. El modelo es robusto a outliers y no requiere normalización estricta de los datos, aunque se recomienda mantener consistencia en los rangos de valores.

Para realizar predicciones, el script replica las características del usuario tantas veces como ciudades hay en la base de datos, combina estas características con las características de cada ciudad, y el modelo predice un rating para cada combinación. Las ciudades se ordenan por rating predicho descendente, donde ratings más altos indican mayor satisfacción esperada.

Uso:

# Entrenar el modelo (requiere CSV de ciudades y CSV de historial)
python Random-Forest-Predictivo.py train --cities ciudades.csv --history historial.csv --out hybrid_model.pkl

# Predecir ratings para un usuario
python Random-Forest-Predictivo.py predict --model hybrid_model.pkl 8.5 7.2 9.0 6.5 8.0 7.8 9.2 6.0 8.5 7.5

Comparación de Scripts

Cada script está diseñado para diferentes escenarios y necesidades:

  • KNN-recomendation.py: Ideal cuando no se tienen datos históricos de usuarios. Es el más simple de usar ya que solo requiere un CSV de ciudades. Proporciona recomendaciones basadas en similitud pura, encontrando ciudades cuyas características se alinean mejor con las preferencias del usuario. Es rápido y eficiente, perfecto para sistemas de recomendación básicos o cuando se está comenzando un proyecto.

  • Predict-satisfaction.py: Utiliza el mismo modelo KNN pero con un enfoque diferente en la presentación de resultados. Es útil cuando se quiere evaluar todas las ciudades y obtener métricas de satisfacción más interpretables. Los veredictos cualitativos facilitan la comprensión para usuarios no técnicos. Requiere un modelo pre-entrenado por KNN-recomendation.py.

  • Random-Forest-Predictivo.py: La mejor opción cuando se tienen datos históricos de usuarios con ratings reales. Aprende patrones complejos de las interacciones pasadas y puede hacer predicciones más precisas basadas en experiencia real. Requiere más datos (CSV de ciudades + CSV de historial) pero ofrece mayor capacidad de aprendizaje y personalización.

En resumen, si no tienes datos históricos, usa KNN-recomendation.py. Si quieres métricas de satisfacción más detalladas, usa Predict-satisfaction.py. Si tienes historial de usuarios con ratings, Random-Forest-Predictivo.py será la mejor opción para aprovechar ese conocimiento.

Dependencias

Todos los scripts requieren las siguientes librerías de Python:

  • pandas: Manipulación y análisis de datos (lectura de CSV, DataFrames)
  • numpy: Operaciones numéricas y arrays
  • scikit-learn: Algoritmos de machine learning (NearestNeighbors, RandomForestRegressor, MinMaxScaler)
  • joblib: Serialización eficiente de objetos Python (guardado/carga de modelos)

Instalación:

pip install pandas numpy scikit-learn joblib

Requisitos:

  • Python 3.7 o superior
  • pandas >= 1.0.0
  • numpy >= 1.18.0
  • scikit-learn >= 0.22.0
  • joblib >= 0.14.0

Estructura de Datos

CSV de Ciudades (para KNN-recomendation.py y Random-Forest-Predictivo.py)

El archivo CSV debe tener la siguiente estructura:

  • Primera columna: Nombre de la ciudad (texto)
  • Siguientes columnas: 10 características numéricas (ej: Seguridad, Transporte, Cultura, etc.)

Ejemplo:

Ciudad,Seguridad,Transporte,Cultura,Gastronomia,Naturaleza,Entretenimiento,Educacion,Salud,Economia,CalidadVida
Barcelona,8.5,9.0,9.5,9.2,7.0,8.8,8.5,8.0,7.5,8.7
Madrid,8.0,9.2,9.0,8.8,6.5,9.0,9.2,8.5,8.0,8.5

CSV de Historial (solo para Random-Forest-Predictivo.py)

El archivo CSV debe contener:

  • 10 columnas de características del usuario: F1, F2, F3, ..., F10
  • Columna City_Name: Nombre de la ciudad visitada (debe coincidir con la columna de ciudad en el CSV de ciudades)
  • Columna Rating: Rating que el usuario dio a esa ciudad (valor numérico, típicamente 0-10)

Ejemplo:

F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,City_Name,Rating
6,3,10,7,4,6,9,2,6,10,Bali,8.4
10,7,4,3,7,7,2,5,4,1,Oslo,7.2

About

City recommender

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages