{"id":9374,"date":"2019-11-19T09:02:03","date_gmt":"2019-11-19T08:02:03","guid":{"rendered":"https:\/\/www.makingscience.com\/blog\/consejos-para-elegir-el-algoritmo-de-recomendacion-adecuado\/"},"modified":"2019-11-19T09:02:03","modified_gmt":"2019-11-19T08:02:03","slug":"consejos-para-elegir-el-algoritmo-de-recomendacion-adecuado","status":"publish","type":"post","link":"https:\/\/www.makingscience.com\/es\/blog\/consejos-para-elegir-el-algoritmo-de-recomendacion-adecuado\/","title":{"rendered":"Consejos para elegir el algoritmo de recomendaci\u00f3n adecuado"},"content":{"rendered":"<div>Consejos para elegir el algoritmo de recomendaci\u00f3n adecuado<\/div>\n<div><span style=\"font-weight: 400;\">Los servicios que ofrecen Amazon, Netflix, o Facebook no se parecen en nada entre s\u00ed; en cambio, todos ellos tienen un sistema de recomendaci\u00f3n. <\/span>  <strong>\u00bfC\u00f3mo funcionan estos sistemas? \u00bfEn qu\u00e9 datos se basan para recomendar? \u00bfFunciona uno mejor que otro? <\/strong>  <span style=\"font-weight: 400;\">En este art\u00edculo veremos los algoritmos de recomendaci\u00f3n m\u00e1s usados actualmente en la industria, y c\u00f3mo elegir cada uno de ellos en funci\u00f3n de los datos disponibles y del tipo de recomendaciones que se busca ofrecer al usuario.<\/span>  <i><span style=\"font-weight: 400;\">Nota: de ahora en adelante nos referiremos como \u201c\u00edtem\u201d a aquello que el servicio web o aplicaci\u00f3n ofrezca, ya sean productos f\u00edsicos, pel\u00edculas, canciones, eventos culturales, ofertas de trabajo, etc.<\/span><\/i>  &nbsp; <\/p>\n<h2><b>Dos familias de algoritmos de recomendaci\u00f3n<\/b><\/h2>\n<p> <span style=\"font-weight: 400;\">Los algoritmos de <\/span><i><span style=\"font-weight: 400;\">machine learning<\/span><\/i><span style=\"font-weight: 400;\"> para realizar recomendaciones suelen dividirse com\u00fanmente en dos categor\u00edas:<\/span> <\/p>\n<ul>\n<li><b><i>Content-based<\/i><\/b><\/li>\n<\/ul>\n<p> <span style=\"font-weight: 400;\">Como su nombre indica, <\/span><b>se basan en las propiedades o atributos de los \u00edtems presentes en el cat\u00e1logo<\/b><span style=\"font-weight: 400;\">. Considerando un \u00edtem particular, primero se calcula la similitud de cada uno de sus atributos con cada uno de los atributos de los otros \u00edtems disponibles, y despu\u00e9s se decide, asociando un peso, la importancia relativa de cada similitud particular frente a la global (si estoy buscando ordenadores, \u00bfqu\u00e9 es m\u00e1s importante? \u00bfQue el precio sea parecido? \u00bfLa memoria? \u00bfLa velocidad del procesador?). <\/span><span style=\"font-weight: 400;\">Una vez hemos precalculado qu\u00e9 \u00edtems son parecidos entre s\u00ed, podemos ofrecer recomendaciones asociadas a un \u00edtem en particular sin necesidad de saber qu\u00e9 est\u00e1 haciendo o viendo el resto de usuarios; es por ello que este tipo de algoritmos <\/span><b>son ideales para casos en los que no disponemos de un hist\u00f3rico de interacciones del \u00edtem con m\u00faltiples usuarios<\/b><span style=\"font-weight: 400;\">, ya sea porque el servicio acaba de ser puesto en producci\u00f3n, porque ciertos \u00edtems acaban de ser publicados, o porque hay poco tr\u00e1fico.\u00a0<\/span>  <span style=\"font-weight: 400;\">Si el usuario no est\u00e1 interactuando con ning\u00fan \u00edtem en particular, tambi\u00e9n podemos activar este algoritmo usando su hist\u00f3rico de interacciones con otros \u00edtems, estimando o promediando qu\u00e9 tipo de caracter\u00edsticas le interesan m\u00e1s de un \u00edtem en general, y recomendando en base a esa estimaci\u00f3n, de la misma forma que usamos los atributos de un \u00edtem particular para recomendar \u00edtems asociados.<\/span>  &nbsp; <\/p>\n<ul>\n<li><b>Filtro colaborativo<\/b><\/li>\n<\/ul>\n<p> <span style=\"font-weight: 400;\">Estos algoritmos, a diferencia de los de tipo <\/span><i><span style=\"font-weight: 400;\">content-based<\/span><\/i><span style=\"font-weight: 400;\">, <\/span><b>se basan en los datos disponibles de las interacciones de los usuarios con los \u00edtems del cat\u00e1logo<\/b><span style=\"font-weight: 400;\">. Estas interacciones pueden ser de dos tipos: impl\u00edcitas o expl\u00edcitas. Una interacci\u00f3n impl\u00edcita ser\u00eda, por ejemplo, que el usuario hubiese hecho <\/span><i><span style=\"font-weight: 400;\">scroll<\/span><\/i><span style=\"font-weight: 400;\"> hasta el final de la p\u00e1gina de descripci\u00f3n de un \u00edtem, o que hubiese visto m\u00e1s de la mitad de un video que se le ha mostrado. Una expl\u00edcita, que el usuario hubiese valorado activamente un producto, como d\u00e1ndole al bot\u00f3n del like o dejando una valoraci\u00f3n con una puntuaci\u00f3n.<\/span>  <span style=\"font-weight: 400;\">Estos algoritmos <\/span><b>suelen ser m\u00e1s eficientes que los de tipo <\/b><b><i>content-based<\/i><\/b><span style=\"font-weight: 400;\">, ya que son los propios usuarios los que de manera indirecta est\u00e1n recomendando a otros usuarios, adapt\u00e1ndose a las modas e interpretando las caracter\u00edsticas de los \u00edtems como s\u00f3lo un humano puede hacerlo (\u00a1de momento!). El \u00fanico problema que tienen es que <\/span><b>hace falta una cantidad m\u00ednima de tr\u00e1fico para cada \u00edtem<\/b><span style=\"font-weight: 400;\"> para que las recomendaciones tengan sentido; es por este motivo que este tipo de algoritmos suelen complementarse con otros de tipo <\/span><i><span style=\"font-weight: 400;\">content-based<\/span><\/i><span style=\"font-weight: 400;\"> para compensar estos \u201carranques fr\u00edos\u201d sin interacciones.<\/span>  <span style=\"font-weight: 400;\">Dentro de esta categor\u00eda de algoritmos de filtro colaborativo, dos de los que mejor funcionan son:<\/span>  <b><i>i) <\/i><\/b><b>Factorizaci\u00f3n de matrices: <\/b><span style=\"font-weight: 400;\">Es un modelo basado en la factorizaci\u00f3n de la matriz de interacciones items-usuarios. Esta factorizaci\u00f3n produce unas variables ocultas (o latentes), con las cuales se pueden <\/span><b>codificar al mismo tiempo los meta-atributos de los \u00edtems disponibles en el cat\u00e1logo, y las preferencias de los usuarios hacia dichos meta-atributos<\/b><span style=\"font-weight: 400;\">. Una vez hemos realizado esta factorizaci\u00f3n, s\u00f3lo tenemos que cruzar ambas matrices para poder ofrecer recomendaciones personalizadas. Un ejemplo de algoritmo basado en la factorizaci\u00f3n de matrices es <\/span><a href=\"https:\/\/github.com\/benfred\/implicit\" target=\"_blank\" rel=\"noopener\"><i><span style=\"font-weight: 400;\">Implicit<\/span><\/i><\/a><span style=\"font-weight: 400;\"> (que permite ofrecer recomendaciones incluso a usuarios nuevos o an\u00f3nimos), o el incluido en la librer\u00eda <\/span><a href=\"http:\/\/engineering.fb.com\/core-data\/recommending-items-to-more-than-a-billion-people\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Faiss<\/span><\/a><span style=\"font-weight: 400;\"> (usada por Facebook).<\/span>  <img fetchpriority=\"high\" decoding=\"async\" class=\"size-full wp-image-3127 aligncenter\" src=\"https:\/\/www.makingscience.com\/wp-content\/uploads\/2021\/04\/0_ZEaYcKjjV6RK-VfU.png\" alt=\"\" width=\"553\" height=\"352\" \/> <em><span style=\"font-weight: 400;\">Una matriz de interacciones entre usuarios e \u00edtems (izquierda) se puede descomponer en la combinaci\u00f3n de una matriz que codifica los atributos de cada \u00edtem con una serie de valores latentes (medio), y una matriz que codifica las afinidades de cada usuario con dichos valores latentes (derecha).<\/span><\/em>  &nbsp;  <b><i>ii) Nearest neighbors<\/i><\/b><b> (<\/b><b><i>NN<\/i><\/b><b>): <\/b><span style=\"font-weight: 400;\">Recomienda \u00edtems que el usuario no ha visto todav\u00eda, pero que otros usuarios con gustos parecidos han visto. Este tipo de algoritmos funcionan mejor cuando hay muchos \u00edtems disponibles, y son <\/span><b>perfectos para ayudar al usuario a descubrir \u00edtems nuevos y a explorar el cat\u00e1logo disponible<\/b><span style=\"font-weight: 400;\">. Algunos ejemplos de algoritmos de tipo <\/span><i><span style=\"font-weight: 400;\">NN<\/span><\/i><span style=\"font-weight: 400;\"> son <\/span><a href=\"http:\/\/github.com\/spotify\/annoy\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Annoy<\/span><\/a><span style=\"font-weight: 400;\"> (usado por Spotify) o el incluido en la librer\u00eda <\/span><a href=\"http:\/\/github.com\/nmslib\/nmslib\" target=\"_blank\" rel=\"noopener\"><i><span style=\"font-weight: 400;\">Non-Metric Space Library<\/span><\/i> <span style=\"font-weight: 400;\">(<\/span><i><span style=\"font-weight: 400;\">NMSLIB<\/span><\/i><span style=\"font-weight: 400;\">).<\/span><\/a>  &nbsp; <\/p>\n<ul>\n<li><b>(Extra) Algoritmos h\u00edbridos y de Deep Learning:<\/b><\/li>\n<\/ul>\n<p> <b>i) Algoritmos h\u00edbridos:<\/b><span style=\"font-weight: 400;\"> Son algoritmos que simplemente <\/span><b>combinan los algoritmos <\/b><b><i>content-based<\/i><\/b><b> y de filtro colaborativo para que se complementen entre s\u00ed<\/b><span style=\"font-weight: 400;\">. Esto se consigue a trav\u00e9s de un peso que determina la importancia que cada uno de ellos debe de tener en funci\u00f3n de la calidad de las recomendaciones que ofrecen, que depender\u00e1 en general de los datos disponibles. <\/span><span style=\"font-weight: 400;\">El <a href=\"https:\/\/dl.acm.org\/citation.cfm?id=2843948\" target=\"_blank\" rel=\"noopener\">algoritmo<\/a> de Netflix<\/span><span style=\"font-weight: 400;\"> se encuentra entre los de este tipo.<\/span>  <b>ii) <\/b><b><i>Deep Learning<\/i><\/b><b>:<\/b><span style=\"font-weight: 400;\"> Este tipo de algoritmos <\/span><b>codifican los atributos de cada \u00edtem del cat\u00e1logo empleando redes neuronales profundas<\/b><span style=\"font-weight: 400;\">, de una forma parecida a como lo har\u00eda el algoritmo de factorizaci\u00f3n de matrices, pero sin necesidad de depender exclusivamente de interacciones. Son algoritmos bastante m\u00e1s complejos y espec\u00edficos que los anteriores, y merecer\u00edan un post propio para describirlos por encima. Por poner un ejemplo, <\/span><span style=\"font-weight: 400;\"><a href=\"https:\/\/static.googleusercontent.com\/media\/research.google.com\/\/pubs\/archive\/45530.pdf\" target=\"_blank\" rel=\"noopener\">YouTube<\/a> utiliza este tipo de algoritmos<\/span><span style=\"font-weight: 400;\"> para recomendar otros v\u00eddeos a los usuarios.<\/span>  &nbsp; <\/p>\n<h2><b>Conoce tus datos y elige el algoritmo adecuado<\/b><\/h2>\n<p> <span style=\"font-weight: 400;\">Para elegir nuestro algoritmo, en el fondo lo que tenemos que conocer son los datos de los que disponemos:<\/span> <\/p>\n<ul>\n<li><b>El cat\u00e1logo de \u00edtems a recomendar<\/b><\/li>\n<\/ul>\n<p> <b>Si en nuestro cat\u00e1logo disponemos de muchos atributos t\u00e9cnicos<\/b><span style=\"font-weight: 400;\"> con los cuales podemos comparar de una manera anal\u00edtica los \u00edtems entre s\u00ed, como por ejemplo tel\u00e9fonos m\u00f3viles o inmuebles, <\/span><b>funcionar\u00eda bien un algoritmo de tipo <\/b><b><i>content-based<\/i><\/b><span style=\"font-weight: 400;\"> para generar recomendaciones, que podr\u00eda complementarse con uno de filtro colaborativo si el tr\u00e1fico de usuarios es suficientemente elevado. Si por el contrario nuestro cat\u00e1logo se compone de \u00edtems menos cuantificables, como canciones o pel\u00edculas, no tenemos muchos atributos para comparar m\u00e1s all\u00e1 del estilo musical o el g\u00e9nero, que a menudo es irrelevante a la hora de hacer comparaciones, y por lo tanto habr\u00eda que emplear necesariamente un algoritmo de filtro colaborativo.<\/span>  &nbsp; <\/p>\n<ul>\n<li><b>El tr\u00e1fico y las interacciones de los usuarios<\/b><\/li>\n<\/ul>\n<p> <span style=\"font-weight: 400;\">Si nuestro servicio <\/span><b>tiene mucho tr\u00e1fico, lo ideal ser\u00eda usar un algoritmo tipo factorizaci\u00f3n de matrices <\/b><span style=\"font-weight: 400;\">usando las valoraciones expl\u00edcitas de los usuarios si las hay (en cuyo caso disponemos de una fuente valios\u00edsima de informaci\u00f3n para generar recomendaciones), <\/span><b>o un <\/b><b><i>nearest neighbors<\/i><\/b><b> si el cat\u00e1logo es muy grande<\/b><span style=\"font-weight: 400;\">. En cambio, si acabamos de lanzar el servicio o introducimos items nuevos en el cat\u00e1logo, tendremos que o bien recurrir a un algoritmo tipo <\/span><i><span style=\"font-weight: 400;\">content-based<\/span><\/i><span style=\"font-weight: 400;\"> (si el tipo de \u00edtem lo permite), o bien recolectar datos durante un tiempo para poder usar de manera eficiente el hist\u00f3rico de interacciones usuario-\u00edtem en el futuro con un algoritmo de filtro colaborativo.<\/span>  &nbsp; <\/p>\n<h2><b>Vigila tus algoritmos<\/b><\/h2>\n<p> <span style=\"font-weight: 400;\">Hay que tener en cuenta que aunque los modelos de <\/span><i><span style=\"font-weight: 400;\">machine learning<\/span><\/i><span style=\"font-weight: 400;\"> suelen funcionar muy bien, tambi\u00e9n <\/span><b>pueden producir resultados indeseados que conviene filtrar <\/b><b><i>ad hoc<\/i><\/b><span style=\"font-weight: 400;\">. Aqu\u00ed entran en juego consideraciones varias, como la imagen de marca que se quiere proyectar, o si queremos primar la felicidad o fidelidad de los usuarios frente al volumen de ventas. Por ejemplo, para un portal de noticias: \u00bfprefiero evitar que, aunque suelan ser populares, se recomienden noticias amarillistas por encima de noticias de contrastada calidad? O si tengo un eCommerce: \u00bfprefiero que se recomienden productos bien valorados antes que otros productos menos fiables pero que quiz\u00e1s se venden mejor?<\/span>  &nbsp; <\/p>\n<h2><b>Evaluaci\u00f3n del recomendador<\/b><\/h2>\n<p> <span style=\"font-weight: 400;\">Por \u00faltimo, conviene considerar cu\u00e1l es el objetivo del recomendador: \u00bfquiero recomendar al usuario lo que creo que m\u00e1s le puede interesar, o que descubra \u00edtems que no hubiese conocido de otra manera? \u00bfQuiero que los usuarios pasen m\u00e1s tiempo en la p\u00e1gina? \u00bfQuiero que se recomienden \u00edtems de todo el cat\u00e1logo y no s\u00f3lo los m\u00e1s populares? Para analizar la consecuci\u00f3n de estos objetivos, suelen utilizarse algunas m\u00e9tricas comunes, como por ejemplo:<\/span> <\/p>\n<ul>\n<li><b>CTR (<\/b><b><i>Click Through Rate<\/i><\/b><b>)<\/b><span style=\"font-weight: 400;\">: El n\u00famero total de clicks en recomendaciones frente al n\u00famero total de recomendaciones ofrecidas.<\/span><\/li>\n<li><b><i>Recall<\/i><\/b><b>:<\/b><span style=\"font-weight: 400;\"> Es la \u201cprecisi\u00f3n\u201d con la que el recomendador ofrece recomendaciones relevantes. Si tengo un hist\u00f3rico de interacciones de los usuarios con los \u00edtems del cat\u00e1logo, puedo dividir este set en un subset \u201cde entrenamiento\u201d (interacciones iniciales) y un subset \u201ctest<\/span><i><span style=\"font-weight: 400;\">\u201d<\/span><\/i><span style=\"font-weight: 400;\"> (interacciones posteriores), y calcular recomendaciones usando el primero y ver si \u00e9stas eran adecuadas usando el segundo.<\/span><\/li>\n<li><b>Cobertura: <\/b><span style=\"font-weight: 400;\">Es el porcentaje de \u00edtems presentes en el cat\u00e1logo que el sistema de recomendaci\u00f3n es capaz de recomendar.<\/span><\/li>\n<li><b>Personalizaci\u00f3n:<\/b><span style=\"font-weight: 400;\"> Define la similitud entre las recomendaciones ofrecidas a distintos usuarios. Si esta similitud es baja, significa que el recomendador est\u00e1 ofreciendo una experiencia personalizada a cada usuario.<\/span><\/li>\n<\/ul>\n<p> <span style=\"font-weight: 400;\">Una vez puesto en producci\u00f3n, la mejor forma de optimizar el sistema de recomendaci\u00f3n, teniendo en cuenta estas m\u00e9tricas y otras, es mediante tests A\/B que ofrezcan algoritmos con par\u00e1metros o caracter\u00edsticas diferentes, e ir iterando hasta obtener el mejor resultado posible.<\/span><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Consejos para elegir el algoritmo de recomendaci\u00f3n adecuado Los servicios que ofrecen Amazon, Netflix, o Facebook no se parecen en nada entre s\u00ed; en cambio, todos ellos tienen un sistema de recomendaci\u00f3n. \u00bfC\u00f3mo funcionan estos sistemas? \u00bfEn qu\u00e9 datos se basan para recomendar? \u00bfFunciona uno mejor que otro? En este art\u00edculo veremos los algoritmos de [&hellip;]<\/p>\n","protected":false},"author":21,"featured_media":9376,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[910],"tags":[],"class_list":["post-9374","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology-ai-es"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/posts\/9374","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/comments?post=9374"}],"version-history":[{"count":0,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/posts\/9374\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/media\/9376"}],"wp:attachment":[{"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/media?parent=9374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/categories?post=9374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.makingscience.com\/es\/wp-json\/wp\/v2\/tags?post=9374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}