Iniciación a AWS Personalize
Enlaces de interés que he ido recopilando y que aconsejo repasar antes de empezar con AWS Personalize:
Si empiezas de cero en el mundo de la IA, te recomiendo, antes que nada, que conozcas que es Jupiter Notebook. Uno de los mejores blogs en español que he encontrado de IA es el siguiente:
https://www.aprendemachinelearning.com/
Dale un buen repaso a todo el blog porque tiene articulos super interesantes que te introducirán de sobra en este mundo.
Además, ha hecho un post especial para preparar el entorno de desarrollo para Machine Learning:
Instalar ambiente de Desarrollo Python Anaconda para Aprendizaje Automático
Si deseas saber mas sobre los sistemas de recomendación, el siguiente enlace es super interesante:
https://www.kaggle.com/johnosorio/retail-rocket-ecommerce-recommender-system
Explican cómo utiliza Retail Rocket su sistema de recomendación.
Además, en esa página web encontrarás el Jupiter Notebook de gente mostrando sus ejemplos y estudios.
Otro apunte interesante, antes de ponerte a probar AWS Personalize, es el siguiente, donde conocerás lo fácil que es crear un entorno de tiempo real propio:
https://towardsdatascience.com/how-to-create-a-production-ready-recommender-system-3c932752f8ea
Y por ultimo, antes de empezar con Amazon Personalize, te recomiendo leer un articulo que he escrito acerca de las numerosas desventajas de utilizar este servicio:
Amazon Personalize – Recomendaciones IA en tiempo real para Prestashop
Si aun así, todavía te quedan ganas de probar este servicio, entonces, empecemos a ingerir documentación acerca de el. En el siguiente enlace explican cada uno de los algoritmos que podremos entrenar con AWS Personalize. Explican como funciona cada una de las recetas, es esencial conocer cada uno de ellos para luego entrenar el modelo:
https://github.com/aws-samples/amazon-personalize-samples/tree/master/personalize_temporal_holdout#hrnn
Con AWS Amplify y AWS Cognito enviaremos los eventos en tiempo real a AWS Personalize, como veis, la cosa se complica por momentos, estos son los enlaces de la documentación:
https://aws-amplify.github.io/docs/js/analytics
https://docs.aws.amazon.com/personalize/latest/dg/recording-events.html#w538aac19c23b7b3
Como decía en uno de los puntos. Es esencial disponer de un sistema intermedio donde vayamos almacenando todos los eventos e interacciones de los usuarios de nuestro eCommerce, si no tienes al menos 100.000 interacciones o mas, no andes perdiendo el tiempo, primero create algo que alimente una base de datos donde puedas almacenar el DATA de las interacciones con las que vas a entrenar los modelos, si no tienes al menos 100.000 eventos o mas este servicio te dará siempre las mismas recomendaciones, sea para el usuario que sea, y habrás perdido el tiempo y dinero.
Hay 5 pasos claros en este servicio:
1 – Paso previo a AWS Personalize, donde alimentemos una base de datos de interacciones.
2 – Carga de nuestras interacciones en los Dataset de AWS Personalize. A parte de los User ID que podremos sacar de los eventos y de nuestro catalogo de productos que podremos sacar de nuestra bbdd en tienda, al final del todo os dejo un script en PHP que os exporta en Prestashop todo el catalogo de una tienda en CSV para que podáis subir directamente.
3 – Con AWS Amplify podréis enviar los eventos e interacciones a AWS Personalize, os dejo el enlace al Github que he creado para que lo tengáis más fácil.
4 – Crear la solución a partir de las recetas que ponía anteriormente. Ojo que esto ya tiene un coste elevado.
5 – Crear una campaña para poder recibir las recomendaciones, ojo, al crear una campaña, mantenerla activa tendrás coste, aunque no hagamos uso de las recomendaciones de la misma.
Cada X tiempo volveremos a repetir los pasos 2, 4 y 5. Dado que AWS Personalize no aprende nada nuevo de los eventos enviados. Solo aprende cosas a través de los Dataset subidos, por lo tanto si queremos que aprenda algo nuevo deberemos repetir el proceso de subida, entrenamiento de modelo y creación de campaña.
A continuación el Github donde podréis tener implementada la solución del FRONT en unos minutos:
https://github.com/descuderosanchez/AWS-Personalize—Amplify-PutEvents
A continuación el codigo PHP que exporta todo un catalogo de productos de prestashop:
<?php set_time_limit(0); require_once(__DIR__ . '/config/config.inc.php'); require_once(__DIR__ . '/init.php'); $db = Db::getInstance(); $result = array(); $sqlProducts = "SELECT s.id_product, (IF (s.quantity >=0, 'IN_STOCK', 'OUT_OF_STOCK')) as stock FROM ps_stock_available s LEFT JOIN ps_product_shop ps ON (s.id_product = ps.id_product AND ps.id_shop = 1) WHERE ps.active = 1 AND s.id_product_attribute=0 ORDER BY s.id_product ASC"; /*Db::getInstance()->execute(' TRUNCATE `'._DB_PREFIX_.'des_productos_relacionados`' );*/ $result = $db->ExecuteS($sqlProducts); $arrayProducts = array(); $arrayProducts[0] = ["ITEM_ID", "CATEGORY", "STOCK"]; foreach($result as $producto){ $count++; $objectProduct = array(); $p = new Product($producto['id_product']); $categories = $p->getCategories(); $primeraCategoria = true; $categoryPaths = ''; foreach($categories as $c){ if($primeraCategoria && $c!=2){ $categoriProd = new Category($c); $nestedCategories = $categoriProd->getParentsCategories(1); $primero = true; foreach($nestedCategories as $categorienested){ if($categorienested['id_category']!=2){ if($primero){ $categoriasRuta = $categorienested['id_category']; $primero = false; }else{ $categoriasRuta = $categorienested['id_category'].'/'.$categoriasRuta; } } } $categoryPaths = $categoriasRuta; $primeraCategoria = false; }elseif($c !=2){ $categoriProd = new Category($c); $nestedCategories = $categoriProd->getParentsCategories(1); $primero = true; foreach($nestedCategories as $categorienested){ if($categorienested['id_category']!=2){ if($primero){ $categoriasRuta = $categorienested['id_category']; $primero = false; }else{ $categoriasRuta = $categorienested['id_category'].'/'.$categoriasRuta; } } } $categoryPaths = $categoryPaths . '|'.$categoriasRuta; } } $idsattributes = Product::getProductAttributesIds($p->id); $first = true; $attributesstring = ''; foreach($idsattributes as $idattribute){ if($first){ $attributesstring = $idattribute['id_product_attribute']; $first = false; }else{ $attributesstring .= ','.$idattribute['id_product_attribute']; } } $objectProduct['id_item'] = $producto['id_product']; $objectProduct['cagegories'] = $categoryPaths; $objectProduct['stock'] = $producto['stock']; array_push($arrayProducts, $objectProduct); } function convert_to_csv($input_array, $output_file_name, $delimiter) { $temp_memory = fopen('php://memory', 'w'); // loop through the array foreach ($input_array as $line) { // use the default csv handler fputcsv($temp_memory, $line, $delimiter); } fseek($temp_memory, 0); // modify the header to be CSV format header('Content-Type: application/csv'); header('Content-Disposition: attachement; filename="' . $output_file_name . '";'); // output the file to be downloaded fpassthru($temp_memory); } convert_to_csv($arrayProducts, 'productos-en-csv.csv', ',');
Por el momento, ya tenéis muchas mas información que cuando yo empecé a probar el servicio, con estas recomendaciones podréis avanzar muy rapido para poder probar el servicio y daros cuenta de que, a mi parecer y desde mi punto de vista, no merece la pena.