EOI-Master BigData&Bussines Anlytics online Ed.Oct22
Módulo 16. Ejercicio 3    Rafael Vera Marañón

RecomiendaME

Algoritmos de recomendación personalizada
dataset: movies_etiquetado.csv /ratings_filtratos.csv

Benchmark de algoritmos

La función Reader se usa para especificar cómo se deben leer los datos de entrada, mientras que la clase Dataset se usa para cargar los datos en un objeto que se puede usar para entrenar y evaluar los modelos.Después de la validación cruzada de los algoritmos, se está almacenando el resultado en un diccionario llamado results, donde la clave es el nombre de la clase del algoritmo (obtenido mediante algo.class.name) y los valores son las métricas de rendimiento (RMSE, MAE, Fit Time y Test Time) calculadas durante la validación cruzada.

# Carga de datos y preparación de datos para Surprise
reader = Reader(ratingscale=(1, 10))
df
Surprise = Dataset.loadfromdf(dfratingfiltrados[['userid', 'imdbid', 'rating']], reader)
# División en conjuntos de entrenamiento y prueba
trainset, testset = traintestsplit(dfSurprise, testsize=0.2, random_state=42)
# Definición de algoritmos
algorithms = [SVD(), SlopeOne(), NormalPredictor(), KNNBaseline(), KNNBasic(), KNNWithMeans(), KNNWithZScore(), BaselineOnly(), CoClustering()]
# Evaluación de los algoritmos mediante validación cruzada
results = {}
for algo in algorithms:
res = crossvalidate(algo, dfSurprise, measures=['RMSE', 'MAE'], cv=5, verbose=False)
results[algo.class.name] = [np.mean(res['testrmse']), np.mean(res['testmae']), np.mean(res['fittime']), np.mean(res['testtime'])]

Recomendaciones con SVD

El algoritmo SVD se utilizará para generar recomendaciones debido a su buen rendimiento en un benchmark previo.Se entrenará con el conjunto completo de entrenamiento y se utilizará el método buildantitestset() para obtener posibles recomendaciones para cada usuario. Luego se usará el método predict() para predecir la valoración que le daría a cada película en la lista de recomendaciones y se recomendarán las N películas con mayor valoración.Por último, se generarán recomendaciones para cada usuario de las 10 películas con mayor valoración.Se muestra la tabla de recomendaciones para un usuario concreto (id usuario 873)

# Definir un objeto de lector de Surprise
reader = Reader(rating_scale=(1, 10))
# Cargar el dataframe en un objeto de datos de Surprise
`AllUsersSurprisedf = Dataset.loadfromdf(recomendacionesAllUsersdf[['userid', 'imdbid', 'rating']], reader)
# Seleccionar un algoritmo de recomendación de Surprise
algo = SVD()
# Entrenar el modelo de recomendación utilizando el método fit()
trainset = AllUsersSurprisedf.buildfulltrainset()
algo.fit(trainset)
# Generar recomendaciones para cada usuario utilizando el método predict()
trainset = AllUsersSurprisedf.buildfulltrainset()algo.fit(trainset)
# Generar recomendaciones para todos los usuarios utilizando la función test() de manera vectorizada
testset = trainset.buildantitestset()
alluserpredictions = algo.test(testset, verbose=False)
# Guardar las mejores recomendaciones en un dataframe
dfrecommendations = pd.DataFrame(columns=['userid', 'imdbid', 'predictedrating']).dropna()
for uid, userpredictions in groupby(alluserpredictions, key=lambda x: x.uid):
topuserpredictions = list(userpredictions)[:10]
for pred in topuserpredictions:
dfrecommendations = dfrecommendations.append({'userid': uid, 'imdbid': pred.iid, 'predictedrating': round(pred.est, 2)}, ignoreindex=True)
# Imprimir las mejores recomendaciones para cada usuario
topn = 10
for uid in trainset.allusers():
dfuserrecommendations = dfrecommendations[dfrecommendations['userid'] == uid].head(topn)

INSIGHTS Adicionales

Top10 películas recomendadas
en DFRatingFiltrados

indeximbdb_idtittle
0tt1454468Gravity
1tt0993846The Wolf of Wall Street
2tt0770828Man of Steel
3tt1670345Now You See Me
4tt0816711World War Z
5tt0816692Interstellar
6tt1300854Iron Man 3
7tt1535109Captain Phillips
8tt1663202The Revenant
9tt1392214Prisoners

INSIGHTS Adicionales

Estadisticos principales para las calificaciones

stdvalor
count54323.0
mean7.2
std1.8
min0.0
25%6.0
50%7.0
75%8.0
max10.0

Text

Text

Distribución de calificaciones
por visualizaciones

En este gráfico se muestra la calificación media realizada por los usuarios frente al número total de calificaciones realizadas por los mismos.Podemos observar como aquellas películas con mayor número de calificaciones destacan por una calificación media inferior a aquellos peliculas con número de calificaciones menores.A menor número de calificaciones parace ser que los usuarios son menos exigentes.No obstante, a menor número de calificaciones, el conjunto se divide aproximadamente al 50% entre buena calificacion (8-10) y entre mala calificacion (0-7). Y a medida que aumenta el número de calificaciones se detecta una tendencia a peores calificaciones.

Valoración media de las películas vistas
por id Usuario

Podemos observar la valoración media de cada usuario respecto a al total de películas visualizadas,en la siguiente gráfica.Destacamos que entorno al 80% de los usuarios han visto entre 1 y 400 películas, las cuales han evaluado entre 6(7) y 10. Usuarios outlayer con valoraciones medias de 0-2. El resto 20% de usuarios han visto entre 400 y 800 películas con valoraciones entorno a 7-10.Como refleja la tabla de estadísticos sobre las calificaciones del conjunto total, observamos en la gráfica una tendencia de calificación entorno a 7.

Distribución temporal de calificaciones
| por hora
| por meses y años

POR HORA DEL DÍA
Según la el diagrama de barras, parece que el horario en el que se realizan mayor número de calificaciones son entre las 18:00 y las 22:00. Mientras que las horas en las que se realizan menos calificaciones son 04:00 - 13:00.



POR MES Y AÑO
Del gráfico de burbujas podemos extraer en primer lugar que con el paso de los años parace que se ven menos peliculas y las valoraciones tienden a ser mas negativas (<7.2).
Parece existir cierta tendencia a que los primeros y últimos meses del año son meses en los que hay mayor número de visiualizaciones, con cierta tendencia a peores calificaciones en los meses centrales del año desde 2012 hasta 2016 y con tendencia a mejores calificaciones en meses centrales del año desde 2016 hasta 2021.

Benchmark algoritmos:
Comparación rendimiento y precisión

AlgoRMSEMAEFit TimeTest Time
BaselineOnly1.5189491.1293750.1593880.114273
SVD1.5297321.1324461.0876390.134463
KNNBaseline1.5744301.1632710.2079400.578067
KNNWithMeans1.6271191.2019130.0972760.760321
KNNWithZScore1.6296001.1911010.1934660.726743
CoClustering1.6497811.2201942.1182730.111457
SlopeOne1.6628091.2402842.7931821.128861
KNNBasic1.7382611.2949640.0573560.475777
NormalPredictor2.5081811.9921780.0960700.124474

RMSE y MAE son medidas de error en la predicción de los ratings, donde un RMSE más bajo y un MAE más bajo indican una mejor precisión del modelo. Por lo tanto, los modelos con valores más bajos para estas métricas son mejores para este conjunto de datos. Además, Fit Time y Test Time indican el tiempo que tarda el modelo en entrenar y predecir, respectivamente.Al observar los resultados del benchmark, podemos ver que BaselineOnly y SVD obtienen los valores más bajos de RMSE y MAE, lo que indica que son los modelos más precisos.Además, BaselineOnly tiene un tiempo de ajuste muy bajo, lo que lo hace más eficiente que SVD. KNNBaseline también tiene un RMSE y MAE decentemente bajos y un tiempo de ajuste corto.KNNBasic, KNNWithMeans y KNNWithZScore tienen un RMSE y MAE más alto, lo que indica que son menos precisos que los modelos anteriores.SlopeOne y CoClustering tienen los valores más altos de RMSE y MAE, lo que indica que son los modelos menos precisos. En términos de tiempo de entrenamiento, SlopeOne y CoClustering tardan significativamente más tiempo que los otros modelos. NormalPredictor tiene el tiempo de ajuste más bajo, pero también los valores más altos de RMSE y MAE, lo que indica que es el modelo menos preciso.

Recomendaciones SVD:
Usuario 873

indexuser_idimdb_idpredicted_ratingimdb_title
0873tt00500839.8212 Angry Men
1873tt04685699.75The Dark Knight
2873tt01724959.60Gladiator
3873tt01111619.51The Shawshank Redemption
4873tt01375239.49Fight Club
5873tt01143699.45Se7en
6873tt00868799.45Amadeus
7873tt01098309.42Forrest Gump
8873tt29805169.41The Theory of Everything
9873tt01148149.41The Usual Suspects

La calificación promedio de las películas en el conjunto de datos es: 9.53El modelo no es adecuado para ciertos tipos de usuarios: Cada modelo de recomendación tiene sus fortalezas y debilidades. Por ejemplo, un modelo de filtrado colaborativo basado en usuarios puede no funcionar bien para usuarios con gustos muy únicos o raros.No se incluyen suficientes valoraciones del usuario: Si un usuario no ha valorado suficientes películas en el conjunto de datos, entonces el modelo puede tener dificultades para hacer recomendaciones precisas para ese usuario. El conjunto de datos puede dividirse en conjuntos de entrenamiento y prueba para evaluar el rendimiento del modelo. Si un usuario en particular no está en el conjunto de prueba, entonces no se generarán recomendaciones para ese usuario.El código puede no estar generando recomendaciones para todos los usuarios porque algunos de ellos pueden no haber proporcionado ninguna calificación en el conjunto de datos original, por lo que no hay datos para generar recomendaciones. Esto puede explicar por qué algunos usuarios no han recibido recomendaciones por el modelo.

GRÁFICO SIMILITUD RECOMENDADAS 6

Las recomendaciones para la película A Terrible Night incluyen una amplia gama de géneros, incluyendo drama, romance, biografía, acción, crimen, entre otros. La similitud de estas recomendaciones con la película varía desde 0.47 hasta 0.52, lo que sugiere que todas tienen algunas similitudes en términos de género y otras características. Las etiquetas asociadas con estas recomendaciones indican que muchas de ellas son adaptaciones de libros o basadas en hechos reales. En general, estas recomendaciones podrían proporcionar al espectador una amplia gama de opciones para explorar, aunque es posible que no todas sean igualmente relevantes para alguien que busca específicamente una película de comedia de terror corta.Faithless (0.518695)
Blue (0.488224)
Black Roses (0.486413)
Story of a Junkie (0.481278)
The Magnificent Ambersons (0.476093)
Gang Related (0.474175)