{"id":1943,"date":"2018-12-12T11:18:43","date_gmt":"2018-12-12T11:18:43","guid":{"rendered":"https:\/\/keepler.io\/2018\/12\/12\/modelos-predictivos-mediante-optimizacion-hiperparametrica-y-machine-learning\/"},"modified":"2023-09-12T13:19:10","modified_gmt":"2023-09-12T13:19:10","slug":"modelos-predictivos-mediante-optimizacion-hiperparametrica-y-machine-learning","status":"publish","type":"post","link":"https:\/\/keepler.io\/es\/2018\/12\/12\/modelos-predictivos-mediante-optimizacion-hiperparametrica-y-machine-learning\/","title":{"rendered":"Modelos predictivos mediante optimizaci\u00f3n hiperparam\u00e9trica y Machine Learning"},"content":{"rendered":"<p>El vino es una de las bebidas alcoh\u00f3licas m\u00e1s consumidas del mundo. No es algo nuevo; existen referencias de que en el per\u00edodo Neol\u00edtico se dieron pr\u00e1cticas vitivin\u00edcolas. Despu\u00e9s se fue extendiendo hasta tal punto de que en la cultura grecorromana exist\u00eda un Dios del vino (Baco o Dionisio). Hoy por hoy, hay numerosas regiones a lo largo de nuestro planeta en las que se elaboran excelentes vinos.<\/p>\n<p>Sin embargo, y a pesar de la larga tradici\u00f3n que hay alrededor del vino, siempre hay que <strong>tomar decisiones a la hora de producirlo<\/strong>. Pong\u00e1monos en la tesitura de que somos productores que queremos hacer un vino exquisito. Tendremos que elegir el tiempo de fermentaci\u00f3n, el tiempo de maduraci\u00f3n, la temperatura\u2026 Lo ideal ser\u00eda <strong>probar todas las combinaciones posibles y ver el resultado<\/strong>, \u00bfno? Sin embargo, esta alternativa no es posible: tenemos restricciones de tiempo (hay vinos que tardan a\u00f1os en madurar) y, probablemente, tengamos restricciones presupuestarias.<\/p>\n<h3>Pero, \u00bfqu\u00e9 tiene que ver esto con el mundo de los datos?<\/h3>\n<p>Bien, acabamos de ver un ejemplo de <strong>caso de uso de optimizaci\u00f3n hiperparam\u00e9trica<\/strong>. En Machine Learning, nos encontramos con este problema constantemente. A la hora de generar un <strong>modelo predictivo<\/strong> (conocer la forma de hacer el mejor vino), necesitamos 3 cosas: los <strong>datos<\/strong> (la vid, las uvas), la <strong>funci\u00f3n de coste<\/strong> (restricciones de tiempo, dinero, instalaciones), y los <strong>hiperpar\u00e1metros<\/strong> (caracterizar esas restricciones, eligiendo sus l\u00edmites).<\/p>\n<p>Como nota aclaratoria, no confundir los par\u00e1metros con los hiperpar\u00e1metros. La diferencia reside en que los par\u00e1metros se \u201caprenden\u201d (de ah\u00ed el nombre de machine learning) mediante el ajuste matem\u00e1tico que subyace al modelo elegido junto con los datos (los coeficientes de una regresi\u00f3n, por ejemplo), mientras que los hiperpar\u00e1metros no se pueden aprender en el proceso de ajuste, son propiedades del modelo que el cient\u00edfico de datos debe elegir para llegar a su objetivo. Es un proceso de prueba y error, poco intuitivo, dado que muchas veces nos encontramos con problemas con muchas dimensiones. Ejemplo de hiperpar\u00e1metros:<\/p>\n<ul>\n<li><em>Learning rate<\/em> en la optimizaci\u00f3n de un gradiente descendente, por ejemplo.<\/li>\n<li>N\u00famero de \u00e1rboles en un <em>random forest<\/em>.<\/li>\n<li>N\u00famero de capas en una red neuronal.<\/li>\n<\/ul>\n<h3>De la magia de la aleatoriedad\u2026<\/h3>\n<p>Definamos formalmente <strong>el problema<\/strong>:<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-27400\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/optimizacion-hiperparametrica-1-3.png?resize=350%2C66&#038;ssl=1\" alt=\"\" width=\"350\" height=\"66\" \/>Nuestro vector \u00f3ptimo de hiperpar\u00e1metros proviene de minimizar el error generalizado <em>F<\/em> para nuestro sampleo <em>x<\/em> proveniente de una distribuci\u00f3n subyacente <em>Gx<\/em>. Dicho error depende de la funci\u00f3n de coste <em>L<\/em>, bajo un algoritmo de entrenamiento <em>A<\/em> optimizado para los hiperpar\u00e1metros <em>\u03b1<\/em>\u00a0y el subespacio de datos de entrenamiento <em>xtrain<\/em>. Resolviendo esta ecuaci\u00f3n, llegamos a<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-27402\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/optimizacion-hiperparametrica-2-3.png?resize=350%2C83&#038;ssl=1\" alt=\"\" width=\"350\" height=\"83\" \/><\/p>\n<p>Donde <em>\u03c8<\/em>\u00a0es una funci\u00f3n de respuesta que desconocemos. Para resolver esta ecuaci\u00f3n, tendremos que evaluar las posibilidades del espacio <em>\u0397<\/em>\u00a0de hiperpar\u00e1metros hasta encontrar el vector \u00f3ptimo de <em>\u03b1<\/em>.<\/p>\n<p>El punto cr\u00edtico es por lo tanto <strong>explorar este espacio de hiperpar\u00e1metros<\/strong>. \u00bfQu\u00e9 formas existen? \u00bfSon todas iguales de eficientes?<\/p>\n<p>La intuici\u00f3n nos dice que tendr\u00edamos que hacer pruebas con cada una de las combinaciones posibles de hiperpar\u00e1metros. Sin embargo, esta soluci\u00f3n, llamada com\u00fanmente <em>Grid Search<\/em>, es <strong>computacionalmente muy ineficiente<\/strong>, debido al problema de la dimensionalidad, es decir, el n\u00famero de combinaciones posibles crece exponencialmente con el n\u00famero de hiperpar\u00e1metros. Al igual que el en\u00f3logo no tiene el tiempo suficiente para explorar todas las v\u00edas posibles de elaboraci\u00f3n, nosotros, como cient\u00edficos de datos, <strong>carecemos de capacidad computacional infinita<\/strong>.<\/p>\n<div id=\"attachment_27404\" style=\"width: 560px\" class=\"wp-caption aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-27404\" class=\"wp-image-27404\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/grafica-modelo-hiperparametrico-1024x553-5.png?resize=550%2C297&#038;ssl=1\" alt=\"\" width=\"550\" height=\"297\" \/><p id=\"caption-attachment-27404\" class=\"wp-caption-text\">Gr\u00e1fica Grid Search. Fuente: Keepler.<\/p><\/div>\n<p>Por otro lado, existen argumentos <strong>a favor<\/strong> del uso esta t\u00e9cnica:<\/p>\n<ul>\n<li>Conocer\u00edamos mejor la funci\u00f3n de respuesta (conocemos mejor las sensibilidades de nuestro modelo a los hiperpar\u00e1metros).<\/li>\n<li>Paralelizar el proceso es trivial.<\/li>\n<li>Es de f\u00e1cil implementaci\u00f3n.<\/li>\n<\/ul>\n<p>Sin embargo, existe tambi\u00e9n otro tipo de <strong>b\u00fasqueda m\u00e1s r\u00e1pida y eficiente<\/strong>, llamada <em>Random Search<\/em>. El motivo por el cual este algoritmo de b\u00fasqueda es mejor que el anterior, es que la funci\u00f3n de respuesta es m\u00e1s sensible a cambios en algunas dimensiones que otras. Al explorar el espacio de combinaciones de manera aleatoria, estamos llegando a encontrar combinaciones que con una b\u00fasqueda uniforme (<em>grid search<\/em>) no lo har\u00edamos, pues en una b\u00fasqueda uniforme los hiperpar\u00e1metros se encuentran equitativamente distantes unos de otros. Con una b\u00fasqueda aleatoria, estamos cubriendo el espacio exploratorio m\u00e1s desigualmente, encontrando zonas donde con una b\u00fasqueda uniforme no encontrar\u00edamos. Si supi\u00e9ramos<em> a priori<\/em> las zonas donde el modelo minimizara m\u00e1s el error, har\u00edamos un <em>grid search<\/em> apropiado sobre esas zonas, pero como generalmente no lo sabemos, debemos <strong>explorar todo el espacio<\/strong>.<\/p>\n<p>En la siguiente imagen se muestra este fen\u00f3meno con un <strong>experimento<\/strong>. Bajo un conjunto de datos generados aleatoriamente (pero con sentido estad\u00edstico), se ejecuta un modelo predictivo dos veces para cada dimensi\u00f3n de complejidad (primer experimento:10, segundo: 50), y se comparan los tiempos y el error. El n\u00famero de computaciones que se ejecutan en cada b\u00fasqueda es exactamente la misma para poder medir la diferencia de tiempo de ejecuci\u00f3n.<\/p>\n<div id=\"attachment_27406\" style=\"width: 710px\" class=\"wp-caption aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-27406\" class=\"wp-image-27406\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/experimento-modelo-hiperparametrico-1024x653-5.png?resize=700%2C446&#038;ssl=1\" alt=\"\" width=\"700\" height=\"446\" \/><p id=\"caption-attachment-27406\" class=\"wp-caption-text\">Experimento sobre modelos hiperparam\u00e9tricos. Fuente: Keepler.<\/p><\/div>\n<p>Como podemos observar, el tiempo es menor a medida que a\u00f1adimos hiperpar\u00e1metros al espacio, llegando en ocasiones a ser un 50% m\u00e1s r\u00e1pido. Si bien con una dimensionalidad de 10, el primer experimento no fue aceptado por nuestra hip\u00f3tesis, el resto de experimentos s\u00ed que lo hicieron. Cabe destacar que tambi\u00e9n la media del error es ligeramente menor (la distribuci\u00f3n se encuentra m\u00e1s hacia la izquierda) en el <em>random search<\/em>. Por tanto, <strong>nunca desvirtuaremos nuestro estudio<\/strong> si utilizamos una b\u00fasqueda aleatoria, pero \u00a1s\u00ed ganaremos eficiencia!<\/p>\n<h3>\u2026al poder del conocimiento<\/h3>\n<p>Existen otras t\u00e9cnicas muy potentes que hacen uso de la informaci\u00f3n generada en cada iteraci\u00f3n de la b\u00fasqueda para saber hacia qu\u00e9 zona del espacio dirigirse, construyendo un modelo probabil\u00edstico sobre la funci\u00f3n de coste. Este m\u00e9todo se llama <strong>optimizaci\u00f3n Bayesiana<\/strong>, y lo deber\u00edamos aplicar en situaciones en las que nuestro algoritmo de machine learning no tiene <em>closed form<\/em>, y se llega a su soluci\u00f3n mediante una optimizaci\u00f3n generalmente costosa de evaluar.<\/p>\n<div id=\"attachment_27408\" style=\"width: 610px\" class=\"wp-caption aligncenter\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-27408\" class=\"wp-image-27408\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/grafico-optimizacion-bayesiana-1024x469-5.png?resize=600%2C275&#038;ssl=1\" alt=\"\" width=\"600\" height=\"275\" \/><p id=\"caption-attachment-27408\" class=\"wp-caption-text\">Optimizaci\u00f3n Bayesiana. Fuente: Keepler.<\/p><\/div>\n<p>Interpretemos este gr\u00e1fico. Dada una funci\u00f3n de utilidad <em>Expected improvement<\/em>,<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-27410\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2020\/10\/funcion-expected-improvement-3.png?resize=350%2C54&#038;ssl=1\" alt=\"\" width=\"350\" height=\"54\" \/>En cada iteraci\u00f3n hacemos lo siguiente:<\/p>\n<ul>\n<li>Evaluamos la funci\u00f3n de coste con los hiperpar\u00e1metros.<\/li>\n<li>Actualizamos nuestra \u201ccreencia\u201d con un proceso gaussiano.<\/li>\n<li>Dada nuestra nueva creencia podemos usar la funci\u00f3n de utilidad para determinar unos nuevos hiperpar\u00e1metros en zonas donde la incertidumbre (o desviaci\u00f3n est\u00e1ndar) del proceso gaussiano sea menor. Es decir, obtenemos un nuevo mejor vector de hiperpar\u00e1metros \u00f3ptimos.<\/li>\n<li>Volvemos al primer paso con los nuevos hiperpar\u00e1metros.<\/li>\n<\/ul>\n<p>Estamos construyendo un modelo probabil\u00edstico de <em>F<\/em> repetidamente hasta que nuestra funci\u00f3n de utilidad no se puede maximizar m\u00e1s. Como vemos en el gr\u00e1fico, la <strong>b\u00fasqueda bayesiana<\/strong> converge hacia la iteraci\u00f3n 20 aproximadamente. Como es de esperar, <strong>tenemos mejores resultados, pues el error es menor<\/strong>.<\/p>\n<p>Si has llegado hasta aqu\u00ed, espero que este <em>recap<\/em> de m\u00e9todos de optimizaci\u00f3n hiperparam\u00e9trica te sea de utilidad. Si te animas a probarlo o tienes alguna consulta, no dudes en dejarme un comentario.<\/p>\n<p>Imagen: unsplash | jefferson santos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El vino es una de las bebidas alcoh\u00f3licas m\u00e1s consumidas del mundo. No es algo nuevo; existen referencias de que en el per\u00edodo Neol\u00edtico se dieron pr\u00e1cticas vitivin\u00edcolas. Despu\u00e9s se fue extendiendo hasta tal punto de que en la cultura grecorromana exist\u00eda un Dios del vino (Baco o Dionisio). Hoy por hoy, hay numerosas regiones [&hellip;]<\/p>\n","protected":false},"author":134360170,"featured_media":831,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","content-type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[227],"tags":[293,269],"class_list":["post-1943","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ciencia-de-datos","tag-data-science-es","tag-machine-learning-es"],"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/p9CeZw-vl","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2018\/12\/keepler-datascience-modelospredictivos.jpg?fit=850%2C350&ssl=1","_links":{"self":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/1943","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/users\/134360170"}],"replies":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/comments?post=1943"}],"version-history":[{"count":1,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/1943\/revisions"}],"predecessor-version":[{"id":2426,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/1943\/revisions\/2426"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media\/831"}],"wp:attachment":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media?parent=1943"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/categories?post=1943"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/tags?post=1943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}