• Notifications
  • Fork

/MineriaDeDatos

Predicciones de Rating de Películas de Netflix

Daniton2906 edited this page Dec 5, 2017 · 58 revisions

Introducción

Con el paulatino crecimiento de sitios web de streaming como Netflix, cada día son más las personas que cuentan con un servicio de este tipo, y con el basto catálogo que tienden a ofrecer, surge la seria duda de qué película podría ser del gusto del usuario. Considerando que una persona cuenta con una serie de preferencias, el sitio web le permite estar constantemente calificando los filmes que la plataforma ofrece, teniendo un sistema (hasta hace poco) de cinco estrellas, siendo estas un medidor de qué tanto le gustó al usuario dicho filme.

Con la minería de datos resulta posible entonces el predecir cuál será el gusto de una persona dado su historial de preferencias, y dado el contexto en que la plataforma se ve, resulta provechoso tanto para los usuarios como para Netflix el que la página pueda recomendar favorablemente a su público respecto a los filmes que podrían o no gustarle.

Tema central

El proyecto se enfocará en el catálogo de filmes que la plataforma de streaming Netflix ofrece, y junto a ello con el historial de calificaciones que cada usuario les ha dado a las películas que ha visto considerando además la fecha en que se hizo. Con esto se buscará predecir cómo una persona calificará un filme dada una serie de evaluaciones que realizó.

Para la plataforma resulta importante el poder recomendar correctamente a sus usuarios qué filme ver. Sin embargo, los gustos resultan inestables por lo que cosas vagas como temáticas comunes o géneros en particular pueden no ser información suficiente, ya que es probable que alguien que le haya gustado “Star Wars” no tenga la misma opinión de una obra como “Battlefield Earth”, siendo que ambas cintas son de ciencia ficción.

Sin embargo, resulta favorable el que Netflix cuente con un sistema constante de calificación, en que cada vez que un usuario ve una cinta, se le dé la opción de ponerle una nota de uno a cinco, lo que permite tener un historial de opiniones de gran parte de los usuarios que visitan la plataforma. Así, lo que se pretende es predecir la posible calificación que un usuario le dará a una película dada la opinión que gente con gustos parecidos ha tenido.

Por ejemplo: Si una serie de usuarios calificó el día 9/8/2005 unas películas de la siguiente forma:

  • Star Wars : 5/5
  • The Godfather: 3/5
  • Bee Movie: 4/5
  • Shrek: 1/5
  • Shrek 2: 5/5

Y un usuario nuevo calificó ese mismo día unos filmes de la siguiente manera:

  • Star Wars : 5/5
  • The Godfather: 3/5
  • Forest Gump: 2/5
  • Bee Movie: 4/5
  • Shrek: 1/5

Es bastante probable que el 9 de agosto del 2005 el usuario le hubiera puesto a “Shrek 2” un 5/5. Por lo que el sitio debería recomendar esta cinta dado el historial de preferencias de la persona.

Hipótesis y objetivos

Dada la descripción del tema que motivo nuestro proyecto, la hipótesis a comprobar es la siguiente:

"Se puede saber cómo una persona evaluará una película antes que esta la vea a partir de como otros la evaluaron y como esa persona ha evaluado otras películas".

Entonces, para el desarrollo del proyecto se propusieron los siguientes objetivos:

  • Probar distintos métodos para predecir evaluaciones.
  • Medir efectividad usando métricas apropiadas.
  • Concluir respecto a los métodos usados, contrastando ventajas o desventajas de cada uno.

Descripción de los datos:

Los datos fueron liberados para una competición que organizó Netflix llamada “Netflix Prize”, que buscaba encontrar el mejor algoritmo recomendador (más detalles revisar bibliografía).

La información entregada consiste en más de 100 millones de evaluaciones (ratings) de cerca de 480 mil usuarios de Netflix escogidos de manera aleatoria y anónima sobre más de 17 mil películas.

Los ratings son asignados mediante estrellas, que son enteros desde el 1 hasta el 5. Los usuarios son caracterizados por una ID única. Junto con esto, se entrega la fecha en que el usuario hizo tal evaluación, fecha que puede estar entre octubre de 2004 y diciembre de 2005. Las películas están caracterizadas por un ID único, el nombre de la película y el año de lanzamiento.

Las evaluaciones están clasificadas por película, es decir, cada película tiene agrupada todas las evaluaciones que ha recibido. Entonces, la forma en que los datos es la siguiente:

Formato datos

Según lo que se puede apreciar en la figura, la primera línea corresponde a un ID de una película. Luego, las siguientes líneas que anteceden a la siguiente ID de película, son las evaluaciones que esa película recibió, donde el primer valor es la ID de un usuario, el siguiente el puntaje que le dio y finalmente la fecha en que fue realizada. Finalmente, se muestra un extracto de los datos que se manejan:

Ejemplo datos

La información entregada está dividida en cuatro archivos de texto con un peso 500 MB cada uno.

Exploración de los datos:

Dada la explicación anterior sobre el formato de los datos, ahora se va a explicar la forma en que se manejaron para su posterior exploración.

Mediante el uso de herramientas de Python, primero se decidió separar cada película con sus evaluaciones en un archivo de texto propio. El siguiente código muestra como se hizo este proceso:

# separate_movies: str -> int
# lee un archivo tipo "combined_data" para separar cada
# pelicula en diferentes archivos con todos sus ratings
# Retorna la cantidad de archivos creados
def separate_movies(filename):
    global fd, contador
    contador += 1
    first_movie = True
    with open(filename) as infile:
        for line in infile:
            if ':' in line:
                if not first_movie:
                    contador += 1
                    fd.close()
                else:
                    first_movie = False
                fd = open(temp_name + str(contador) + ".txt", "w")
                # print "crear archivo para movie",contador
            fd.write(line)
    return contador

Esto se hacía para cada uno de los archivos de texto que contenía toda la información. Notar que a la función se le entrega un string filename, que sería el nombre de los archivos a leer.

El motivo de separar la información por películas es que después se iba a poder hacer una reducción menos tediosa de la información, dado que el procesamiento continuo de tal cantidad de datos podría generar retrasos innecesarios. Después del procesamiento de los datos, se hicieron distintas separaciones de la información tales como:

Cantidad de evaluaciones recibidas por película

Este análisis tenía por objetivo encontrar si había alguna diferencia significativa en la cantidad de evaluaciones recibidas por cada película. En primer lugar, se notó que las 1000 películas menos evaluadas tenían menos de 100 evaluaciones (el mínimo es 3 evaluaciones recibidas), esta información está representada por la siguiente figura:

Películas menos evaluadas

Lo que podríamos considerar como un dato relevante dado que al otro extremo existen películas con más de 25.000 evaluaciones (en particular hay películas con más de 200.000 evaluaciones), en particular las 1000 películas más evaluadas están visualizadas en el siguiente histograma:

Películas más evaluadas

Esto nos muestra una gran dispersión de datos, por lo que podría ser necesario descartar un grupo de películas o separar el análisis para distintos grupos de películas, diferenciados por la cantidad de evaluaciones que poseen. La última figura muestra una mirada global sobre la cantidad de evaluaciones recibidas por todas las películas, donde se nota una mayor concentración de películas con menos de 25.000 evaluaciones recibidas:

Evaluaciones por película

Cantidad de evaluaciones hechas por usuario

Había que revisar que tipo de usuarios se tienen acorde al número de evaluaciones que han hecho, para esto fue necesario hacer un procesamiento de los archivos obtenidos antes de manera que ahora se clasificaran las evaluaciones según el usuario que las hizo, el siguiente código muestra el procesamiento hecho en Python:

# make_customer_file: str dict int -> None
# Crear archivo con la cantidad de evaluaciones que hizo cada cliente
def make_customer_file(filename, d, max_id=17770):
    print("Leyendo archivos movie")
    m = Printer(max_id)
    new_filename = d['output_name'] + ".csv"
    fd = open(new_filename, "w")
    fd.write("customerid," + d['column_name'] + "\n")

    customer_array = MyArrayList()
    for i in range(1, max_id + 1):
        m.update()
        with open(filename + str(i) + ".txt") as infile:
            for line in infile:
                if ':' in line:
                    continue
                else:
                    customer_array.insert(line[:-1].split(","))

    m.close()
    print("Creando archivo "+new_filename)
    m.reset(customer_array.get_length())

    compare = d['compare']
    customer_array.sort(compare)
    for i in range(0, customer_array.get_length()):
        m.update()
        fd.write(customer_array.toLine(i))

    m.close()
    fd.close()
    return customer_array.get_length() + 1

Luego, se entró a revisar cual es el espectro de usuarios que no son muy participativos a la hora de evaluar películas, donde se notó un número no menor con una muy baja cantidad de evaluaciones comparado al total de películas. Cerca de 10.000 usuarios no han hecho más de 50 evaluaciones, teniendo hasta usuarios que solo han hecho una evaluación. Esto se ve ilustrado en la siguiente figura:

Menos Evaluaciones hechas

A la hora de decidir si esa información es indispensable o no, hay que pensar que el objetivo de este proyecto es predecir ratings de un usuario basándose tanto en las evaluaciones de este usuario, como las hechas por otros usuarios. En esto último es en donde se planta la interrogativa de que quizás eliminar evaluaciones de un usuario podría perjudicar la predicción para otros usuarios con más evaluaciones. La siguiente figura muestra una mirada más global de la cantidad de evaluaciones hechas por todos los usuarios:

Evaluaciones hechas todos

La mayoría se concentra en alrededor de 1000 evaluaciones hechas, pero también existe una cantidad no menor de usuarios con alrededor de 5000 evaluaciones hechas, se espera poder trabajar mejor con los usuarios entre estas cantidades de evaluaciones.

Como dato curioso, si bien no sale ilustrado en la figura anterior, el usuario más activo había evaluado casi todas las 17.700 películas. Usuarios con alta cantidad de evaluaciones pueden servir para corroborar la efectividad del predictor (se predice sobre películas que estos usuarios ya evaluaron).

Promedio de los ratings recibidos por película.

Era necesario corroborar como es la distribución de los ratings recibidos para cada película. Esto para ver si existía una variedad con respecto a las evaluaciones que las películas reciben, es decir, que no haya un exceso de película bien evaluadas o un exceso mal evaluado. El tener esos casos podría entorpecer el funcionamiento del recomendador a desarrollar. Sin embargo, lo que se ve en la siguiente figura es que existe una distribución concentrada en evaluaciones cercanas a las tres estrellas:

Promedio evaluaciones

El uso del promedio como medio para verificar lo explicado anteriormente podría no ser la mejor manera (algunas películas con pocas evaluaciones podrían tener promedios más sesgados), pero de todas formas permite un buen acercamiento para concluir que existe una distribución más o menos cómoda donde el recomendador pueda funcionar.

Experimentos

El trabajo realizado se puede separar en tres experimentos, donde se prueban distintas técnicas basados tanto en sistemas recomendadores como en técnicas vistas durante el curso.

Experimento 1

Este experimento fue un primer acercamiento en métodos para predecir ranking. Se eligió usar dos técnicas diferentes: filtrado colaborativo (con dos variaciones) y factorización matricial.

El filtrado colaborativo para sistemas recomendadores se basa en encontrar patrones similares en el comportamiento de ciertos usuarios, donde el enfoque puede ser basado en usuarios o en películas (ítems). Para el caso basado en usuarios (UC-CF): "si cierto grupo de usuarios evaluaron A, B y C de cierto modo, otro usuario que evaluó A y B se manera similar, dicho usuario debería evaluar C de la misma forma que los otros usuarios". Por otro lado, para el caso basado en ítems (IB-CF): "usuarios que evalúan película A de cierto modo, evalúan C de un modo determinado". La siguiente imagen ilustra lo explicado recién.

Es necesario establecer una forma de cuantificar la similitud entre dos elementos. En este caso, el algoritmo implementado en la librería pyreclab hace uso la similitud de Pearson. Finalmente, se realiza clustering sobre el conjunto de usuarios, clasificándolos según los k vecinos más cercanos (Knn). Para este experimento se decidió separar en 10 clusters y, aunque fue una decisión arbitraria, hubiera sido interesante analizar la efectividad del algoritmo si se variaba la cantidad de clusters.

El uso de filtrado colaborativo puede presentar problemas con escasez de datos, escabilidad o de grey sheep (usuarios con opiniones poco comunes que no son beneficiados del filtrado).

Luego, se decidió usar la técnica de factorización matricial, que consta de obtener factores de latencia para relacionar películas con usuarios. La librería pyreclab ya tenía implementado un algoritmo que se basa principalmente en usar la técnica de Singular Value Descomposition (SVD). Tal método consiste en separar la matriz en 3 sub-matices U, S y U^-1, como se muestra en la imagen:

Las principales desventajas de usar SVD radican en la complejidad O(m2n) del algoritmo y que presenta problemas con matrices poco densas, lo que necesita un prellenado hecho de manera manual.

Manejo de datos para experimento 1

Dada la gran cantidad de datos usados, se decidió usar una porción acotada para reducir los tiempos de ejecución de los algoritmos. Para probar rendimientos se decidió variar con la cantidad de evaluaciones que se tienen para la misma cantidad de usuarios y películas. En particular, se decidió separar en grupos disjuntos de 10.000 usuarios, pero usando las mismas 1.000 películas (seleccionadas al azar). Usando datos conseguidos del procesamiento de datos hechos anteriormente, se separó en 5 conjuntos de usuarios con distinta cantidad de evaluaciones hechas:

Dataset Cantidad de evaluaciones
data1 805353
data2 491012
data3 391070
data4 329538
data5 285781

Donde data1 posee los 10.000 usuarios con más evaluaciones hechas, y los otros dataset se les va asignando los siguientes 10.000 usuarios ordenados (descendentemente) en evaluaciones hechas. Notar que la cantidad de evaluaciones posibles para las cantidades elegidas es de un total de 10.000.000 evaluaciones.

Las métricas usadas para la validación del experimento son el Mean Absolute Error (mae), el Root Mean Squared Error (rmse) y la precisión (accuracy). Los dos primeros entregan una medida para el error cometido considerando todas las predicciones, donde la diferencia radica en que el rmse "castiga" más por errores grandes. Por otro lado, la forma de medir la precisión fue comparando el rating truncado que entrega el algoritmo, con el rating que de verdad fue entregado.

Ya explicado un poco de los algoritmos usados y como se manejaron los datos, se presentan los resultados obtenidos para cada método usado, donde se decide probar la efectividad sacando del set de entrenamiento 100 evaluaciones hechas (elegidas al azar), para ver como se predicen.

Filtrado colaborativo basado en usuarios (UC-CF, 100 predicciones).

Evaluaciones MAE RMSE Accuracy
805353 0,804298413 1,048023389 40
491012 0,871480615 1,057021432 30
391070 0,731837966 0,886049041 41
329538 0,8451324 1,09982476 41
285781 0,791659197 1,011548942 40
Promedio 0,808881718 1,020493513 38,4

Filtrado colaborativo basado en películas (IB-CF, 100 predicciones).

Evaluaciones MAE RMSE Accuracy
805353 0,762449933 0,974009079 39
491012 0,755019002 0,945265487 38
391070 0,682922909 0,846693579 40
329538 0,753670874 0,935523169 41
285781 0,722141719 0,957282769 45
Promedio 0,735240887 0,931754817 40,6

Factorización matricial (SVD, 100 predicciones).

Evaluaciones MAE RMSE Accuracy
805353 0,781172152 0,966798916 34
491012 0,765170979 0,958604284 37
391070 0,70376835 0,854970125 38
329538 0,750886303 0,95848842 39
285781 0,719406873 0,93288589 41
Promedio 0,744080931 0,934349527 37,8

Primer análisis

Después de un primer acercamiento, se notó que el IB-CF presenta un mejor desempeño, tanto en una menor cantidad de error como de precisión entregada (40,6%). Luego está el UC-CF (38,4%) y finalmente SVD (37,8%). Sin embargo, para estos últimos dos, UC-CF presenta errores más grandes que los entregados por SVD.

Dados estos resultados, se decide hacer una nueva prueba solo usando IB-CF y SVD, aumentando la cantidad de predicciones a 10.000, lo que implica que se tienen menos datos para entrenamiento del modelo. Los resultados obtenidos son los siguientes:

Filtrado colaborativo basado en películas (IB-CF, 10.000 predicciones).

Evaluaciones MAE RMSE Accuracy
491012 0,695288123 0,89404083 26
285781 0,725584294 0,93061528 35
Promedio 0,710436209 0,912328055 30,5

Factorización matricial (SVD, 10.000 predicciones).

Evaluaciones MAE RMSE Accuracy
491012 0,683307237 0,871439683 30
285781 0,715318394 0,906832823 37
Promedio 0,699312815 0,889136253 33,5

Análisis final

Si bien se puede ver que el desempeño de ambas técnicas disminuyó (lo que era esperable), en este caso se tiene un resultado distinto. Se puede apreciar que SVD presenta errores más bajos y una mejor precisión (33,5%) que lo obtenido con IB-CF (30,5%). En particular, se ve que el desempeño en precisión de IB-CF bajo en mayor cantidad que el de SVD (el primero bajo cerca de 10 puntos, mientras que el segundo solo 4 puntos aproximadamente). De esto último se podría desprender que el uso de factorización matricial resiste mejor la escasez de datos que el uso de filtrado colaborativo.

Experimento 2

En el experimento 2 se utilizó un tipo de factorización matricial conocido como Factorization Machine, el cual a priori funciona mejor con matrices poco densas, como es el caso de estos datos. Para esto se utilizó la librería lightFM.

El objetivo de este experimento es analizar la precisión que nos entrega esta librería al usar sus métodos.

Primero se intentó analizar todos los datos a la vez, pero eran muchos y tomaba demasiado tiempo, por lo que se optó por usar una porción de estos. Del total de los datos se utilizó los 3000 que más valoraciones habían hecho, los 3000 que menos hicieron y los 3000 que se encontraban en la mitad de la cantidad de valoraciones realizadas.

En un principio se realizó este experimento para 100 usuarios de los grupos antes descritos con los siguientes resultados en precisión:

Aquí se nota claramente que los con mejor precisión son los que obtuvieron más valoraciones, mientras los otros dos grupos no tuvieron un bueno resultado, ya que ambos están cerca de 0.01.

Se obtuvieron los siguientes promedios de las mediciones anteriores:

-100 con más valoraciones: 0.492

-100 del grupo medio: 0.015

-100 con menos valoraciones: 0.012

Luego se decidió aumentar la cantidad de usuarios a 3000 en cada grupo, se aplicó el mismo experimento obteniendo los siguientes resultados: Se mantuvieron los resultados de la parte anterior, los con más valoraciones cerca del 0.5, mientras que los otros grupos muy por debajo, obteniendo resultados cercanos al 0.02.

Con los siguientes promedios:

-3000 con más valoraciones: 0.432

-3000 del grupo medio: 0.033

-3000 con menos valoraciones: 0.025

Experimento 3

Para el tercer experimento se probó con reglas de asociación. La idea en este caso es poder recomendar filmes a usuarios, dada la frecuencia que ciertas películas son recomendadas juntas, dándose itemsets de cintas bien valoradas por un conjunto de usuarios, cosa de poder encontrar pares frecuentes entre el total de los datos.

Para esto primero se filtraron los datos solo conservándose solo aquellos cuyo rating fuera mayor a 3, de esa forma solo se tendrían aquellas películas que fueran calificadas como buenas o muy buenas. A partir de esto, para poder realizar las reglas de asociación se generaron matrices en donde las filas representaban a los usuarios y las columnas las películas. Aquí si la celda era un 1, significaba que el usuario vio la película y le gustó, mientras que si era un 0 implicaba que o no la había visto o no le gustó. Esto se volvió altamente ineficiente ya que al haber filas con una gran cantidad de 0s y un par de 1s, se obtuvo mucho espacio sin información significante. Por lo mismo la cantidad de películas tuvo que reducirse a 1.000, dando en alrededor de 800.000 usuarios

Película 1 Película 2 Película 3
Usuario 1 0 0 1
Usuario 2 1 1 0
Usuario 3 1 0 0

Para procesar los datos se usaron los scripts de Python ordenador.py y generador_de_matrices.py, dándose un programa que primero ordenó las películas por usuario, para luego generar la matriz a través de esos datos.

Con la matriz de datos se generó un archivo .csv el cual se importó a R para poder trabajar sobre los datos. Allí se ejecutaron los comandos vistos en clases para obtener resultados al respecto de las reglas de asociación.

peliculas <- as(a_list, "peliculas_netflix")
frequentItems <- eclat(peliculas, parameter = list(supp = 0.07, maxlen = 15))
items.sorted <- sort(frequentItems, by="support")
inspect(items.sorted)
items support count
1 {30: Pitcher and the Pin-Up} 0.32957951 27276
2 {191: X2: X-Men United} 0.30791445 25483
3 {175: Reservoir Dogs} 0.29119140 24099
4 {197: Taking Lives} 0.18105365 14984
5 {28: Lilo and Stitch} 0.11562349 9569
6 {143: The Game} 0.11370227 9410
7 {199: The Deer Hunter} 0.10778154 8920
8 {175: Reservoir Dogs, 191: X2: X-Men United} 0.09929918 8218
9 {30: Pitcher and the Pin-Up, 191: X2: X-Men United} 0.09046641 7487
itemFrequencyPlot(peliculas, topN=10, type="absolute", main="Item Frequency")

Itemsets más frecuentes

rules <- apriori(peliculas, parameter=list(support=0.001, confidence=0.5))
rules.sorted <- sort(rules, by="lift")
rules.sorted.first10 <- head(rules.sorted, 10)
inspect(rules.sorted.first10)

Reglas de asociación ordenadas por el lift

plot(rules, method="grouped")

Gráfico de las reglas generadas

Conclusiones

Se observa claramente que el experimento que obtuvo mejor precisión es el realizado con Factorization Machine, lo que teóricamente es lógico, ya que es un método creado para soportar matrices dispersas. Dado que Factorization Machine está basado en el uso de factorización matricial, se esperaban mejores resultados. Los métodos de filtrado colaborativo mostraron que poseen un peor desempeño al disminuir la cantidad de datos conocidos.

En el caso de las reglas de asociación, al analizar los resultados no se llegó a nada muy concluyente ya que aquellos datos con mejor desempeño fueron los que tuvieron peor support y confidence. Tampoco se lograron determinar reglas que permitieran predecir datos a futuro de forma destacable.

En resumen y dados los diversos experimentos que se realizaron, en general no se obtuvieron buenos resultados dentro de lo esperado respecto al objetivo propuesto. Ante la imposibilidad de predecir más de la mitad de los resultados, se da cuenta que todavía queda mucho que mejorar en el área de sistemas recomendadores. Sin embargo, las herramientas implementadas pueden servir de complemento o tener otro tipo de aplicaciones con el objetivo de entregar información útil (como el generar una lista de recomendaciones dadas ciertas preferencias).

Decisiones futuras

De acuerdo con lo concluido, quedaron muchos campos por explorar en la labor de analizar el comportamiento de los algoritmos aplicados. Por ejemplo, el uso del filtrado colaborativo necesita definir de cuantificar similitud entre elementos y se decidió usar la similitud de pearson, sería interesante haber investigado más sobre otras formas de definir similitud. Siguiendo la misma línea, faltó un análisis sobre el óptimo de clusters elegidos para generar grupos

También faltó analizar los resultados que se obtendrían con los algoritmos para porciones de datos más distintas, con respecto a la cantidad de valoraciones usadas. Por ejemplo, intentar con datos muy dispersos y otros muy concentrados.

Se podría intentar conseguir otro dataset para agregar más atributos para analizar, como el género de la película, el sexo del usuario o su edad. Analizar si agregar esos atributos ayuda de alguna manera a las predicciones o si es útil para obtener otro tipo de relaciones.

Finalmente, sería interesante ir un poco más allá de solo predecir valoraciones y llegar a reglas más interesantes, como porque a una persona que le haya gustado una película, no le guste otra y viceversa.

Retroalimentación de hitos anteriores

Posterior a la entrega del primer hito, se organizó una reunión con la profesora Bárbara Poblete en la que se aconsejaron una serie de métodos y formas de realizar el proyecto. En particular se intentó implementar la factorización matricial dado que en Python hay una serie de librerías que apoyan esta metodología y que podían permitir lograr el objetivo del proyecto. Además, se aconsejó el usar la librería pyreclab, la cual sirve para hacer problemas muy parecidos al que se tenía planteado.

Respecto a los comentarios de los compañeros, en general había una recepción positiva sobre la presentación en sí, a excepción de una serie de problemas que se intentaron mejorar para el hito posterior. Por un lado, se criticó el que no quedara claro cuál era el objetivo del grupo, ya que la idea de predecir una opinión resultaba muy ambigua, dado eso, se intentó esclarecer que el enfoque del proyecto estaba orientado a las calificaciones que los usuarios ponían sobre las películas de la plataforma.

Por otro lado, la falta de exploración y resultados, por esto, gran parte del hito se dedicó a intentar implementar las distintas librerías y metodologías disponibles para así tener algún resultado y saber si el camino estaba bien enfocado. Lamentablemente no se tuvo tanto éxito como se hubiera deseado en este aspecto dadas las problemáticas presentadas por las mismas librerías. Asimismo, se recomendó revisar trabajos previos sobre el mismo tema, lo que llevó a que consideráramos fuertemente la ya mencionada librería pyreclab, dado su parecido con el trabajo que se estaba desarrollando.

Para el hito 2, lo único rescatable fue la sugerencia de usar el método Factorization Machine sugerido por uno de los compañeros del curso. Además, se retomó la sugerencia de usar reglas de asociación para probar que resultados interesantes podrían salir.

Bibliografía

Además de la materia vista en el curso, los siguientes enlaces fueron visitados tanto para uso de librerías como para información sobre las técnicas/métodos usados en este proyecto: