<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Aprendizaje Automatico - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Aprendizaje Automatico - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 22 May 2026 15:16:32 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/aprendizaje-automatico/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Estadística para Ciencia de Datos: Una Guía Completa para Aspirantes a Practicantes de ML ]]>
                </title>
                <description>
                    <![CDATA[ En este mundo hiperconectado, los datos se generan y consumen a un ritmo sin precedentes. Por mucho que disfrutemos de esta superconductividad de datos, también invita al abuso. Los profesionales de datos deben estar capacitados para utilizar métodos estadísticos no solo para interpretar números, sino también para descubrir tales abusos ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/estadistica-para-ciencia-de-datos-una-guia-completa-para-aspirantes-a-practicantes-de-ml/</link>
                <guid isPermaLink="false">6722db2d62fb9a044255788e</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                    <category>
                        <![CDATA[ ciencia de datos ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Estadística ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Diego Lopez ]]>
                </dc:creator>
                <pubDate>Tue, 12 Nov 2024 02:32:39 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/11/image-1-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>En este mundo hiperconectado, los datos se generan y consumen a un ritmo sin precedentes.</p><p>Por mucho que disfrutemos de esta superconductividad de datos, también invita al abuso. Los profesionales de datos deben estar capacitados para utilizar métodos estadísticos no solo para interpretar números, sino también para descubrir tales abusos y protegernos de ser engañados.</p><p>No muchos científicos de datos tienen una formación formal en estadística. También hay muy pocos libros y cursos buenos que enseñen estos métodos estadísticos desde una perspectiva de ciencia de datos.</p><p>A través de esta publicación, pretendo arrojar algo de luz sobre lo siguiente:</p><ul><li>¿Qué es estadística?</li><li>Estadística en relación con el aprendizaje de máquina.</li><li>¿Por qué debes profesionalizarte en estadística?</li><li>¿Qué curriculum debes seguir para dominar estos temas?</li><li>¿Cómo estudiar estadística para convertirse en un practicante en lugar de un examinador?</li><li>Consejos prácticos y recursos de aprendizaje.</li></ul><h2 id="-qu-es-estad-stica">¿Qué es Estadística?</h2><p>La estadística es un conjunto de métodos y herramientas matemáticas que nos permiten responder preguntas importantes sobre los datos. Se divide en dos categorías:</p><ol><li><strong>Estadística Descriptiva:</strong> este ofrece métodos para resumir datos transformando observaciones sin modificar en información significativa que sea fácil de interpretar y compartir.</li><li><strong>Estadística Inferencial</strong>: este ofrece métodos para estudiar experimentos hechos en pequeños ejemplos de datos y eliminar las interferencias a toda la población (dominio entero).</li></ol><p>Ahora, las estadísticas y el aprendizaje automático son dos áreas de estudio estrechamente ralacionadas. Las estadísticas es un pre-requisito importante para el aprendizaje automático aplicado, ya que nos ayuda a seleccionar, evaluar e interpretar modelos predictivos. </p><h2 id="estad-sticas-y-aprendizaje-autom-tico">Estadísticas y Aprendizaje Automático</h2><p>El núcleo principal del aprendizaje automático está centrado alrededor de las estadísticas. No puedes resolver problemas del mundo real con aprendizaje automático si no tienes un buen conocimiento de los fundamentos estadísticos.</p><p>Ciertamente hay factores que hacen el aprendizaje de estadística muy difícil. Hablo acerca de las ecuaciones matemáticas, notación griega, y conceptos meticulosamente definidos que hace difícil generar interés en el tema.</p><p>Podemos abordar estos problemas con explicaciones claras y simples, tutoriales a un ritmo adecuado, y proyectos prácticos para resolver problemas con métodos estadísticos aplicados.</p><p>Desde el análisis de datos exploratorio a el diseño de experimentos de pruebas de hipótesis, las estadísticas juegan un rol importante en resolución de problemas principales que abarcan todas las industrias y dominios.</p><p>Cualquiera que desee desarrollar una comprensión profunda del aprendizaje automático debe aprender cómo los métodos estadísticos forman la base de los algoritmos de regresión y clasificación, cómo las estadísticas nos permiten aprender de los datos y cómo nos ayudan a extraer significado de datos no etiquetados.</p><h2 id="-por-qu-debes-dominar-la-estad-stica">¿Por qué debes dominar la estadística?</h2><p>Cada organización se esfuerza por convertirse en una organización basada en datos. Por eso estamos siendo testigos de un aumento en la demanda de cientifícos y analistas de datos.</p><p>Ahora, para resolver problemas, responder preguntas, y trazar una estrategia, necesitamos hacer sentido de los datos. Afortunadamente, las estadísticas ofrecen una colección de herramientas para producir esos resultados.</p><h3 id="de-los-datos-al-conocimiento">De los datos al conocimiento</h3><p>De manera aislada, las observaciones sin modificar son solo datos. Utilizamos estadísticas descriptivas para transformar estas observaciones en información que tenga sentido. </p><p>Luego podemos utilizar estadísticas inferenciales para estudiar pequeñas muestras de datos y extrapolar nuestros hallazgos a toda la población.</p><h3 id="las-estad-sticas-ayudan-a-responder-preguntas-como-">Las estadísticas ayudan a responder preguntas como...</h3><ul><li>¿Qué características son las más importantes?</li><li>¿Cómo deberíamos diseñar el experimento para desarrollar nuestra estrategia de producto?</li><li>¿Qué métricas de rendimiento deberíamos medir?</li><li>¿Cuál es el resultado más común y esperado?</li><li>¿Cómo diferenciamos entre ruido y datos válidos?</li></ul><p>Todas estas son preguntas comunes e importantes que los equipos de datos deben responder a diario.</p><p>Las respuestas nos ayudan a tomar decisiones de manera eficaz. Los métodos estadísticos no solo nos ayudan a establecer proyectos de modelado predictivo, sino también a interpretar los resultados.</p><h2 id="proyectos-de-estad-stica-y-aprendizaje-autom-tico">Proyectos de estadística y aprendizaje automático</h2><p>Casi todos los proyectos de aprendizaje automático consisten en las siguientes tareas, y las estadísticas desempeñan un papel central en todos ellos de una forma u otra. A continuación, se explica cómo:</p><h3 id="definici-n-de-un-enunciado-del-problema">Definición de un enunciado del problema</h3><p>La parte más crucial del modelado predictivo es la definición real del problema que nos brinda el objetivo real que debemos perseguir.</p><p>Esto nos ayuda a decidir el tipo de problema con el que nos enfrentamos (es decir, regresión o clasificación). Y también nos ayuda a decidir la estructura y los tipos de entradas, salidas y métricas con respecto al objetivo.</p><p>Pero la formulación del problema no siempre es sencilla. Si eres nuevo en el aprendizaje automático, es posible que requieras una exploración significativa de las observaciones en el dominio. Dos conceptos principales que debes dominar aquí son el análisis exploratorio de datos (EDA) y la minería de datos.</p><h3 id="exploraci-n-inicial-de-datos">Exploración inicial de datos</h3><p>La exploración de datos implica obtener un conocimiento profundo tanto de las distribuciones de las variables como de las relaciones entre las variables de los datos.</p><p>En parte, la experiencia en un campo le ayuda a adquirir este dominio sobre un tipo específico de variable. Sin embargo, tanto los expertos como los recién llegados al campo se benefician al manejar realmente observaciones reales del campo.</p><p>Los conceptos importantes relacionados con las estadísticas se reducen al aprendizaje de las estadísticas descriptivas y la visualización de datos.</p><h3 id="limpieza-de-datos">Limpieza de datos</h3><p>A menudo, los puntos de datos que se ha recopilado de un experimento o un repositorio de datos no están en un estado perfecto. Es posible que los datos hayan sido sometidos a procesos o manipulaciones que dañaron su integridad. Esto afecta aún más a los procesos o modelos posteriores que utilizan los datos.</p><p>Algunos ejemplos comunes incluyen valores faltantes, corrupción de datos, errores de datos (debido a un sensor defectuoso) y datos sin formato (observaciones con diferentes escalas).</p><p>Si desea dominar los métodos de limpieza, debe aprender sobre la detección de valores atípicos y la imputación de valores faltantes.</p><h3 id="preparaci-n-de-datos-y-configuraci-n-de-canales-de-transformaci-n">Preparación de datos y configuración de canales de transformación</h3><p>Si los datos contienen errores e inconsistencias, a menudo no se pueden utilizar directamente para el modelado.</p><p>Primero, es posible que los datos deban pasar por un conjunto de transformaciones para cambiar su forma o estructura y hacerlos más adecuados para el problema que ha definido o los algoritmos de aprendizaje que está utilizando.</p><p>Luego, puedes desarrollar un canal de dichas transformaciones que aplique a los datos para producir una entrada consistente y compatible para el modelo.</p><p>Debes dominar conceptos como el muestreo de datos y los métodos de selección de características, las transformaciones de datos, el escalado y la codificación.</p><h3 id="selecci-n-y-evaluaci-n-de-modelos">Selección y evaluación de modelos</h3><p>Un paso clave para resolver un problema predictivo es seleccionar y evaluar el método de aprendizaje. Las estadísticas de estimación le ayudan a puntuar las predicciones del modelo a partir de datos no vistos.</p><p>El diseño experimental es un subcampo de la estadística que impulsa el proceso de selección y evaluación de un modelo. Exige una buena comprensión de las pruebas de hipótesis estadísticas y las estadísticas de estimación.</p><h3 id="ajuste-fino-del-modelo">Ajuste fino del modelo</h3><p>Casi todos los algoritmos de aprendizaje automático tienen un conjunto de hiperparámetros que permiten personalizar el método de aprendizaje para el marco del problema elegido.</p><p>Este ajuste de hiperparámetros suele ser de naturaleza empírica, en lugar de analítica. Requiere grandes conjuntos de experimentos para evaluar el efecto de diferentes configuraciones de hiperparámetros en el rendimiento del modelo.</p><h2 id="plan-de-estudios-de-estad-stica-para-profesionales">Plan de estudios de estadística para profesionales</h2><p>Un buen plan de estudios de estadística para profesionales no solo debe cubrir la gran cantidad de métodos y herramientas que acabo de mencionar. También debe cubrir y explorar los problemas más comunes que enfrenta la industria.</p><p>La siguiente es una lista de habilidades ampliamente utilizadas que necesitará conocer para tener éxito en las entrevistas de ciencia de datos y aprendizaje automático y conseguir un trabajo en el campo.</p><h3 id="habilidades-de-estad-stica-general">Habilidades de estadística general</h3><ul><li>Cómo definir preguntas que se puedan responder estadísticamente para una toma de decisiones eficaz.</li><li>Calcular e interpretar estadísticas comunes y cómo utilizar técnicas de visualización de datos estándar para comunicar los hallazgos. </li><li>Comprensión de cómo se aplica la estadística matemática al campo, conceptos como el teorema del límite central y la ley de los grandes números.</li><li>Realizar inferencias a partir de estimaciones de ubicación y variabilidad (<strong>ANOVA</strong>).</li><li>Cómo identificar la relación entre las variables objetivo y las variables independientes.</li><li>Cómo diseñar experimentos de prueba de hipótesis estadísticas, pruebas A/B, etc.</li><li>Cómo calcular e interpretar métricas de rendimiento como el valor p, alfa, errores tipo 1 y tipo 2, etc.</li></ul><h3 id="conceptos-estad-sticos-importantes">Conceptos estadísticos importantes</h3><ul><li><strong>Introducción:</strong> comprensión de los tipos de datos (rectangulares y no rectangulares), estimación de la ubicación, estimación de la variabilidad, distribuciones de datos, datos binarios y categóricos, correlación, relación entre diferentes tipos de variables.</li><li><strong>Distribución de estadísticas:</strong> números aleatorios, ley de los grandes números, teorema del límite central, error estándar, etc.</li><li><strong>Muestreo y distribuciones de datos:</strong> muestreo aleatorio, sesgo de muestreo, sesgo de selección, distribución de muestreo, arranque, intervalo de confianza, distribución normal, distribución t, distribución binomial, distribución de chi-cuadrado, distribución F, distribución de Poisson y exponencial.</li><li><strong>Experimentos estadísticos y pruebas de significancia:</strong> pruebas A/B, realización de pruebas de hipótesis (nula/alternativa), remuestreo, significancia estadística, intervalo de confianza, valor p, alfa, pruebas t, grado de libertad, ANOVA, valores críticos, covarianza y correlación, tamaño del efecto, potencia estadística.</li><li><strong>Métodos estadísticos no paramétricos</strong>: datos de rango, pruebas de normalidad, normalización de datos, correlación de rango, pruebas de significación de rango, prueba de independencia</li></ul><h2 id="consejos-pr-cticos-de-aprendizaje">Consejos prácticos de aprendizaje</h2><p>La mayoría de las universidades han diseñado sus programas de estudio de estadística para poner a prueba la capacidad de memorización de los estudiantes. Solo comprueban si los estudiantes pueden resolver ecuaciones, definir terminologías e identificar gráficos que deriven ecuaciones, en lugar de centrarse en la aplicación de estos métodos para resolver problemas del mundo real.</p><p>Sin embargo, los aspirantes a profesionales deben seguir un proceso paso a paso de aprendizaje e implementación de métodos estadísticos en diferentes problemas utilizando código de Python ejecutable.</p><p>Veamos los dos enfoques principales para estudiar estadística un poco más en profundidad:</p><h3 id="enfoque-descendente">Enfoque descendente</h3><p>Supongamos que le piden que diseñe un experimento para probar la eficiencia de dos versiones de una característica de un producto. Se supone que esta característica aumenta la participación de los usuarios en un portal en línea.</p><p>Con un enfoque descendente, primero aprenderá más sobre el problema. Luego, una vez que el objetivo esté claro, puede aprender a aplicar los métodos estadísticos adecuados.</p><p>Esto lo mantiene involucrado y ofrece una mejor experiencia de aprendizaje práctico.</p><h3 id="enfoque-ascendente">Enfoque ascendente</h3><p>Este enfoque es el que utilizan la mayoría de las universidades y cursos en línea para enseñar estadística. Se centra en aprender los conceptos teóricos con notación matemática, la historia de ese concepto y cómo implementarlo.</p><p>Para las personas como yo, que tienden a perder interés en el aprendizaje teórico, esta no es la forma correcta de aprender estadística aplicada. Lo vuelve demasiado metafórico, lo que hace que el tema sea árido y deprimente sin ningún vínculo directo con la resolución de problemas.</p><p>Como probablemente puedes deducir, recomiendo un enfoque descendente para estudiar estadística.</p><p>Veamos ahora algunos recursos específicos que recomiendo para comenzar por el camino correcto.</p><h3 id="recursos-de-aprendizaje">Recursos de aprendizaje</h3><ul><li><strong><a href="https://learning.oreilly.com/library/view/practical-statistics-for/9781491952955/">Libro sobre estadística práctica</a> (en inglés)</strong>: este libro le enseñará estadística desde el punto de vista de la ciencia de datos. Debe leer al menos los primeros tres capítulos de este libro.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/10/image-2.png" class="kg-image" alt="image-2" width="580" height="672" loading="lazy"></figure><ul><li><strong><a href="https://www.khanacademy.org/math/statistics-probability">Estadística y probabilidad | Khan Academy</a> (en inglés)</strong>: este curso te preparará bien para todas las preguntas relacionadas con la estadística y la probabilidad durante la entrevista. Un curso gratuito con una buena recopilación de videoconferencias y problemas prácticos.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/10/image-3.png" class="kg-image" alt="image-3" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/10/image-3.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/10/image-3.png 700w" width="700" height="139" loading="lazy"></figure><ul><li><strong><a href="https://wwnorton.com/books/Naked-Statistics/">Estadística al desnudo</a>:</strong> para las personas que temen a las matemáticas y prefieren entender ejemplos prácticos, este es un libro increíble que explica cómo se aplica la estadística en situaciones de la vida real.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/10/image-4.png" class="kg-image" alt="image-4" width="258" height="389" loading="lazy"></figure><ul><li><strong>Métodos estadísticos para el aprendizaje automático (en inglés)</strong>: este libro sirve como curso intensivo sobre métodos estadísticos para profesionales del aprendizaje automático. Idealmente, para aquellos con experiencia como desarrolladores.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/10/image-5.png" class="kg-image" alt="image-5" width="385" height="553" loading="lazy"></figure><h2 id="a-continuaci-n-">A continuación…</h2><p>Crearé una serie de tutoriales sobre cada uno de los temas mencionados anteriormente siguiendo un enfoque de código primero para que podamos comprender y visualizar el significado y la aplicación de estos conceptos.</p><p>Si me he olvidado de algún detalle o si quieres que cubra algún otro aspecto de las estadísticas, responde a esta historia y lo agregaré al plan de estudios.</p><h2 id="ciencia-de-datos-con-harshit">Ciencia de datos con Harshit</h2><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/_ANbV9lVA-M?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="How to build an Effective Data Science Portfolio" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>Con este canal, planeo lanzar un par de <a href="https://towardsdatascience.com/hitchhikers-guide-to-learning-data-science-2cc3d963b1a2?source=---------8------------------">series que cubran todo el espacio de la ciencia de datos</a>. Aquí está el motivo por el cual deberías suscribirte al canal:</p><ul><li>Esta serie cubriría todos los tutoriales de calidad requeridos/exigidos sobre cada uno de los temas y subtemas, como los <a href="https://towardsdatascience.com/python-fundamentals-for-data-science-6c7f9901e1c8?source=---------5------------------">fundamentos de Python para la ciencia de datos</a>.</li><li>Explicación de <a href="https://towardsdatascience.com/practical-reasons-to-learn-mathematics-for-data-science-1f6caec161ea?source=---------9------------------">las matemáticas y las derivaciones</a> de por qué hacemos lo que hacemos en ML y Deep Learning.</li><li><a href="https://www.youtube.com/watch?v=a2pkZCleJwM&amp;t=2s">Podcasts con científicos e ingenieros de datos</a> de Google, Microsoft, Amazon, etc., y directores ejecutivos de empresas impulsadas por big data.</li><li><a href="https://towardsdatascience.com/building-covid-19-analysis-dashboard-using-python-and-voila-ee091f65dcbb?source=---------2------------------">Proyectos e instrucciones</a> para implementar los temas aprendidos hasta ahora. Obtén información sobre nuevas certificaciones, Bootcamp y recursos para aprobar esas certificaciones, como este <strong><a href="https://youtu.be/yapSsspJzAw">Examen de Certificación de Desarrollador de TensorFlow de Google</a></strong>.</li></ul><p>Si este tutorial te resultó útil, deberías consultar mis cursos de ciencia de datos y aprendizaje automático en <a href="https://www.wiplane.com/">Wiplane Academy</a>. Son completos pero compactos y te ayudan a construir una base sólida de trabajo para exhibir.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Descenso de gradiente: ejemplo de algoritmo de aprendizaje automático ]]>
                </title>
                <description>
                    <![CDATA[ ¿Qué es el algoritmo de descenso de gradiente? El descenso de gradiente es probablemente el algoritmo de aprendizaje automático más popular. En esencia, el algoritmo existe para minimizar los errores tanto como sea posible. El objetivo del descenso de gradiente como algoritmo es minimizar la función de costo de un ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/descenso-de-gradiente-ejemplo-de-algoritmo-de-aprendizaje-automaticod/</link>
                <guid isPermaLink="false">6461b30ecc6454089f94bd5e</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Fri, 19 May 2023 01:50:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/05/pexels-pixabay-159751.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/gradient-descent-machine-learning-algorithm-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Gradient Descent – Machine Learning Algorithm Example</a>
      </p><p>¿Qué es el algoritmo de descenso de gradiente?</p><p>El descenso de gradiente es probablemente el algoritmo de aprendizaje automático más popular. En esencia, el algoritmo existe para minimizar los errores tanto como sea posible.</p><p>El objetivo del descenso de gradiente como algoritmo es minimizar la función de costo de un modelo. Podemos decir esto por los significados de las palabras '<em>Gradiente</em>' y '<em>Descenso</em>'.</p><p>Mientras que gradiente significa la brecha entre dos puntos definidos (esa es la función de costo en este contexto), el descenso se refiere al movimiento hacia abajo en general (es decir, minimizar la función de costo en este contexto).</p><p>Entonces, en el contexto del aprendizaje automático, Descenso de Gradiente (Gradient Descent en inglés) se refiere al <strong>intento iterativo de minimizar el error de predicción de un modelo de aprendizaje automático </strong>ajustando sus parámetros para producir el menor error posible.</p><p>Este error se conoce como la Función de Costo. La función de costo es un gráfico de la respuesta a la pregunta "¿En cuánto difiere el valor predicho del valor real?". Si bien la forma de evaluar las funciones de costo a menudo difiere para diferentes modelos de aprendizaje automático, en un modelo de regresión lineal simple, generalmente se refiere al error cuadrático medio del modelo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/image.png" class="kg-image" alt="image" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/image.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/image.png 688w" width="688" height="417" loading="lazy"><figcaption>Un gráfico 3D de la función de costo de un modelo de regresión lineal simple con M que representa el punto mínimo.</figcaption></figure><p>Es importante tener en cuenta que para los modelos más simples como la regresión lineal, un gráfico de la función de costo suele tener forma de arco, lo que facilita determinar el punto mínimo. </p><p>Sin embargo, este no es siempre el caso. Para modelos más complejos (por ejemplo, redes neuronales), es posible que el gráfico no tenga forma de arco. Es posible que la función de costo tenga múltiples puntos mínimos como se muestra en la imagen a continuación.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/image-1.png" class="kg-image" alt="image-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/image-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/image-1.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="519" loading="lazy"><figcaption>Un gráfico 3D de la función de costo de una red neuronal. Fuente: <a href="https://www.coursera.org/lecture/machine-learning/gradient-descent-2f2PA">Coursera</a></figcaption></figure><h2 id="-c-mo-funciona-el-descenso-de-gradiente">¿Cómo funciona el descenso de gradiente?</h2><p>En primer lugar, es importante tener en cuenta que, como la mayoría de los procesos de aprendizaje automático, el algoritmo de descenso de gradiente<strong> es un proceso iterativo.</strong></p><p>Suponiendo que tiene la función de costo para un modelo de regresión lineal simple como j(w,b) donde j es una función de w y b, el algoritmo de descenso de gradiente funciona de tal manera que <strong>comienza con una conjetura aleatoria inicial para w y b.</strong> El algoritmo <strong>seguirá modificando los parámetros w y b</strong> en un intento de <strong>optimizar</strong> la función de costo, j.</p><p>En la regresión lineal, la elección de los valores iniciales no importa mucho. Una opción común es cero.</p><p>La analogía perfecta para el algoritmo de descenso de gradiente que minimiza la función de costo j(w, b) y alcanza su mínimo local ajustando los parámetros w y b es caminar hasta el pie de una montaña o colina (como se muestra en la gráfica 3D de la función de costo de un modelo de regresión lineal simple mostrado anteriormente). </p><p>O bien, podemos imaginar que estamos tratando de llegar al punto más bajo de un campo de golf. En cualquier caso, darán pasos cortos, repetitivos hasta llegar al pie de la montaña o colina.</p><h2 id="la-f-rmula-de-descenso-de-gradiente">La fórmula de descenso de gradiente</h2><p><strong>Aquí está la fórmula para el descenso de gradiente: b = a - γ Δ f(a)</strong></p><p>La ecuación anterior describe el accionar del algoritmo de descenso de gradiente.</p><p>Es decir, b es la siguiente posición del excursionista, mientras que representa la posición actual. El signo menos es para la parte de minimización del algoritmo de descenso de gradiente, ya que el objetivo es minimizar el error tanto como sea posible. γ en el medio es un factor conocido como tasa de aprendizaje, y el término Δf(a) es un término de gradiente que define la dirección del punto mínimo.</p><p>Como tal, esta fórmula indica la siguiente posición para el excursionista/la persona en el campo de golf (esa es la dirección del descenso más empinado). </p><p>Es importante notar que el término γΔ f(a) se resta de a porque el objetivo es moverse contra el gradiente, hacia el mínimo local.</p><h2 id="-qu-es-la-tasa-de-aprendizaje">¿Qué es la tasa de aprendizaje?</h2><p><strong>La tasa de aprendizaje es el determinante de cuán grandes son los pasos que toma el descenso del gradiente en la dirección del mínimo local. </strong>Determina la <strong><em>velocidad </em></strong>con la que el algoritmo se mueve hacia los valores óptimos de la función de coste.</p><p>Debido a esto, la elección de la tasa de aprendizaje, γ, es importante y tiene un impacto significativo en la efectividad del algoritmo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/05/image-2.png" class="kg-image" alt="image-2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/05/image-2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2023/05/image-2.png 788w" sizes="(min-width: 720px) 720px" width="788" height="366" loading="lazy"><figcaption>La tasa de aprendizaje de la izquierda es excesiva, por lo que la función no encuentra el punto óptimo. En el caso de la derecha, como los pasos son muy pequeños, es muy probable que el algoritmo acierte, aunque de forma <em>muy</em> lenta.</figcaption></figure><p><strong>Si la tasa de aprendizaje es demasiado grande</strong> como se muestra arriba, en un intento por encontrar el punto óptimo, se mueve desde el punto de la izquierda hasta el punto de la derecha (como la tasa de aprendizaje es muy grande, los "saltos" también lo son, por lo que es muy difícil que el algoritmo acierte en el punto óptimo).En ese caso, vemos<strong> que la función de costo ha empeorado.</strong></p><p>Por otro lado, si la tasa de aprendizaje es demasiado pequeña, los descensos de gradiente funcionarán, aunque <em>muy</em> lentamente. Es decir, como los pasos son muy pequeños, es muy probable que el algoritmo acierte, aunque la optimización irá muy despacio.</p><p>Es por ello, importante elegir cuidadosamente la tasa de aprendizaje.</p><h2 id="c-mo-implementar-el-descenso-de-gradiente-en-la-regresi-n-lineal">Cómo implementar el descenso de gradiente en la regresión lineal</h2><pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt

class Linear_Regression:
	def __init__(self, X, Y):
		self.X = X
		self.Y = Y
		self.b = [0, 0]
	
	def update_coeffs(self, learning_rate):
		Y_pred = self.predict()
		Y = self.Y
		m = len(Y)
		self.b[0] = self.b[0] - (learning_rate * ((1/m) * np.sum(Y_pred - Y)))
		self.b[1] = self.b[1] - (learning_rate * ((1/m) * np.sum((Y_pred - Y) * self.X)))
        
	def predict(self, X=[]):
		Y_pred = np.array([])
		if not X: X = self.X
		b = self.b
		for x in X:
			Y_pred = np.append(Y_pred, b[0] + (b[1] * x))

		return Y_pred
	
	def get_current_accuracy(self, Y_pred):
		p, e = Y_pred, self.Y
		n = len(Y_pred)
		return 1-sum(
			[
				abs(p[i]-e[i])/e[i]
				for i in range(n)
				if e[i] != 0]
		)/n
	#def predict(self, b, yi):

	def compute_cost(self, Y_pred):
		m = len(self.Y)
		J = (1 / 2*m) * (np.sum(Y_pred - self.Y)**2)
		return J

	def plot_best_fit(self, Y_pred, fig):
				f = plt.figure(fig)
				plt.scatter(self.X, self.Y, color='b')
				plt.plot(self.X, Y_pred, color='g')
				f.show()


def main():
	X = np.array([i for i in range(11)])
	Y = np.array([2*i for i in range(11)])

	regressor = Linear_Regression(X, Y)

	iterations = 0
	steps = 100
	learning_rate = 0.01
	costs = []
	
	#original best-fit line
	Y_pred = regressor.predict()
	regressor.plot_best_fit(Y_pred, 'Initial Best Fit Line')
	

	while 1:
		Y_pred = regressor.predict()
		cost = regressor.compute_cost(Y_pred)
		costs.append(cost)
		regressor.update_coeffs(learning_rate)
		
		iterations += 1
		if iterations % steps == 0:
			print(iterations, "epochs elapsed")
			print("Current accuracy is :",
				regressor.get_current_accuracy(Y_pred))

			stop = input("Do you want to stop (y/*)??")
			if stop == "y":
				break

	#final best-fit line
	regressor.plot_best_fit(Y_pred, 'Final Best Fit Line')

	#plot to verify cost function decreases
	h = plt.figure('Verification')
	plt.plot(range(iterations), costs, color='b')
	h.show()

	# if user wants to predict using the regressor:
	regressor.predict([i for i in range(10)])

if __name__ == '__main__':
	main()
</code></pre><p>En esencia, puedes ver que el bloque de código entrena un algoritmo de descenso de gradiente para un modelo de aprendizaje automático de regresión lineal usando <code>0.01</code> &nbsp;como tasa de aprendizaje, basándose en <code>100</code> pasos.</p><p>Al ejecutar el código, tenemos lo siguiente:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/10/image-43.png" class="kg-image" alt="image-43" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/10/image-44.png" class="kg-image" alt="image-44" width="600" height="400" loading="lazy"></figure><h2 id="conclusi-n"><strong><strong>Conclusi</strong>ó<strong>n</strong></strong></h2><p>En conclusión, es importante tener en cuenta que el algoritmo de descenso de gradiente es especialmente importante en los dominios de inteligencia artificial y aprendizaje automático, ya que los modelos deben optimizarse para la precisión.<br>En este artículo, aprendimos qué es el algoritmo de descenso de gradiente, cómo funciona, su fórmula, qué tasa de aprendizaje es y la importancia de elegir la tasa de aprendizaje correcta. También vimos una ilustración de código de cómo funciona Gradient Descent.<br>Finalmente, compartí mis escritos sobre inteligencia artificial, aprendizaje automático y Microsoft Azure en<a href="https://twitter.com/SalimOpines"> Twitter</a> si disfrutaste este artículo y quieres ver más.<br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Introducción a Q-Learning: aprendizaje por refuerzo ]]>
                </title>
                <description>
                    <![CDATA[ Q-learning es un algoritmo de aprendizaje basado en valores en el aprendizaje por refuerzo. En este artículo, aprenderemos sobre Q-Learning y sus detalles:  * ¿Qué es Q-Learning?  * Matemáticas detrás de Q-Learning Q-Learning — Una visión general simplificada Digamos que un robot tiene que cruzar un laberinto y ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/introduccion-a-q-learning-aprendizaje-por-refuerzo/</link>
                <guid isPermaLink="false">63333b7e36d7bd096041b890</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Leandro Guiñazú ]]>
                </dc:creator>
                <pubDate>Mon, 23 Jan 2023 20:37:48 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/09/traduc-2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">An introduction to Q-Learning: reinforcement learning</a>
      </p><p>Q-learning es un algoritmo de aprendizaje basado en valores en el aprendizaje por refuerzo. En este artículo, aprenderemos sobre Q-Learning y sus detalles:</p><ul><li>¿Qué es Q-Learning?</li><li>Matemáticas detrás de Q-Learning</li></ul><h3 id="q-learning-una-visi-n-general-simplificada"><strong>Q-Learning — Una v</strong>isión general simplificada</h3><p>Digamos que un <strong>robot</strong> tiene que cruzar un <strong>laberinto</strong> y llegar al punto final. Hay <strong>minas</strong>, y el robot sólo puede moverse una casilla a la vez. Si el robot pisa una mina, el robot muere. El robot tiene que llegar al punto final en el menor tiempo posible.</p><p>El sistema de puntuación/recompensa es el siguiente:</p><ol><li>El robot pierde 1 punto en cada paso. Esto se hace para que el robot tome el camino más corto y llegue a la meta lo más rápido posible.</li><li>Si el robot pisa una mina, la pérdida de puntos es de 100 y el juego termina.</li><li>Si el robot obtiene poder ⚡️, gana 1 punto.</li><li>Si el robot alcanza la meta, el robot obtiene 100 puntos.</li></ol><p>Ahora, la pregunta obvia es: <strong>¿Cómo entrenamos a un robot para llegar a la meta final con el camino más corto sin pisar una mina?</strong></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/3JXI06jyHegMS1Yx8rhIq64gkYwSTM7ZhD25" class="kg-image" alt="3JXI06jyHegMS1Yx8rhIq64gkYwSTM7ZhD25" width="345" height="300" loading="lazy"></figure><p>Entonces, ¿cómo resolvemos esto?</p><h3 id="introducci-n-a-q-table">Introducción a Q-Table</h3><p>Q-Table es sólo un nombre elegante para una simple tabla de búsqueda donde calculamos las máximas recompensas futuras esperadas por acción en cada estado. Básicamente, esta tabla nos guiará a la mejor acción en cada estado.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/CcNuUwGnpHhRKkERqJJ6xl7N2W8jcl1yVdE8" class="kg-image" alt="CcNuUwGnpHhRKkERqJJ6xl7N2W8jcl1yVdE8" width="345" height="291" loading="lazy"></figure><p>Habrá cuatro números de acciones en cada mosaico sin bordes. Cuando un robot está en un estado puede moverse hacia arriba, hacia abajo, hacia la derecha o la izquierda.</p><p>Por lo tanto, modelemos este entorno en nuestra Q-Table.</p><p>En la Q-Table, las columnas son las acciones y las filas son los estados.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/AjVvggEquHgsnMN8i4N35AMfx53vZtELEL-l" class="kg-image" alt="AjVvggEquHgsnMN8i4N35AMfx53vZtELEL-l" width="315" height="296" loading="lazy"></figure><p>Cada puntuación de la Q-Table será la máxima recompensa futura esperada que el robot recibirá si toma esa acción en ese estado. Se trata de un proceso iterativo, ya que necesitamos mejorar la Q-Table en cada iteración.</p><p>Pero las preguntas son:</p><ul><li>¿Cómo calculamos los valores de la Q-Table?</li><li>¿Los valores están disponibles o predefinidos?</li></ul><p>Para aprender cada valor de la Q-Table, utilizamos el <strong>algoritmo Q-Learning<strong>.</strong></strong></p><h3 id="matem-ticas-el-algoritmo-q-learning"><strong>Matemáticas: </strong>el algoritmo Q-Learning</h3><h4 id="q-function"><strong>Q-function</strong></h4><p>La Q-function utiliza la ecuación de Bellman y toma dos entradas: estado (<strong>s</strong>) y acción (<strong>a</strong>).</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/s39aVodqNAKMTcwuMFlyPSy76kzAmU5idMzk" class="kg-image" alt="s39aVodqNAKMTcwuMFlyPSy76kzAmU5idMzk" width="552" height="232" loading="lazy"></figure><p>Usando la función anterior, obtenemos los valores de <strong>Q</strong> para las celdas de la tabla.</p><p>Cuando empezamos, todos los valores de la Q-Table son ceros.</p><p>Hay un proceso iterativo de actualización de los valores. A medida que comenzamos a explorar el entorno, la Q-function nos da mejores y mejores aproximaciones, actualizando continuamente los Q-values de la tabla.</p><p>Ahora, vamos a entender cómo se lleva a cabo la actualización.</p><h3 id="introducci-n-al-proceso-del-algoritmo-q-learning">Introducción al proceso del algoritmo Q-Learning</h3><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/oQPHTmuB6tz7CVy3L05K1NlBmS6L8MUkgOud" class="kg-image" alt="oQPHTmuB6tz7CVy3L05K1NlBmS6L8MUkgOud" width="800" height="450" loading="lazy"></figure><p>Cada una de las cajas de colores es un paso. Vamos a entender cada uno de estos pasos en detalle.</p><h4 id="paso-1-inicializar-la-q-table">Paso 1: Inicializar la Q-Table</h4><p>Primero construiremos una Q-Table. Hay n columnas, donde n= número de acciones. Hay m filas, donde m= número de estados. Inicializaremos los valores en 0.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/TQ9Wy3guJHUecTf0YA5AuQgB9yVIohgLXKIn" class="kg-image" alt="TQ9Wy3guJHUecTf0YA5AuQgB9yVIohgLXKIn" width="322" height="308" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/gWnhK5oLqjcQkSzuuT8WgMVOGdCEp68Xvt6F" class="kg-image" alt="gWnhK5oLqjcQkSzuuT8WgMVOGdCEp68Xvt6F" width="345" height="300" loading="lazy"></figure><p>En nuestro ejemplo de robot, tenemos cuatro acciones (a=4) y cinco estados (s=5). Así que vamos a construir una tabla con cuatro columnas y cinco filas.</p><h4 id="pasos-2-y-3-elegir-y-realizar-una-acci-n">Pasos 2 y 3: elegir y realizar una acción</h4><p>Esta combinación de pasos se realiza por un tiempo indefinido. Esto significa que este paso se ejecuta hasta el momento en que detenemos el entrenamiento, o el bucle de entrenamiento se detiene como se define en el código.</p><p>Elegiremos una acción (a) en el estado (s) basado en la Q-Table. Pero, como se mencionó anteriormente, cuando el episodio comienza inicialmente, cada valor de Q es 0.</p><p>Así que ahora entra en juego el concepto de compensación de exploración y explotación.</p><p>Vamos a utilizar algo llamado la <strong>estrategia codiciosa de Épsilon</strong>.</p><p>Al principio, las tasas de épsilon serán más altas. El robot explorará el entorno y elegirá acciones al azar. La lógica detrás de esto es que el robot no sabe nada sobre el medio ambiente.</p><p>A medida que el robot explora el entorno, la velocidad de épsilon disminuye y el robot comienza a explotar el entorno.</p><p>Durante el proceso de exploración, el robot adquiere progresivamente más confianza en la estimación de los Q-values.</p><p><strong>Para el ejemplo del robot, hay cuatro acciones para elegir:</strong> arriba, abajo, izquierda y derecha. Comenzamos el entrenamiento ahora — nuestro robot no sabe nada sobre el medio ambiente. Así que el robot elige una acción al azar, la derecha.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/k0IARc6DzE3NBl2ugpWkzwLkR9N4HRkpSpjw" class="kg-image" alt="k0IARc6DzE3NBl2ugpWkzwLkR9N4HRkpSpjw" width="644" height="311" loading="lazy"></figure><p>Ahora podemos actualizar los Q-values para estar en el comienzo y mover a la derecha usando la ecuación de Bellman.</p><h4 id="pasos-4-y-5-evaluar"><strong>Pasos</strong> 4 y 5: evaluar</h4><p>Ahora hemos tomado una acción y observado un resultado y recompensa.Necesitamos actualizar la función Q(s,a).</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/TnN7ys7VGKoDszzv3WDnr5H8txOj3KKQ0G8o" class="kg-image" alt="TnN7ys7VGKoDszzv3WDnr5H8txOj3KKQ0G8o" width="598" height="299" loading="lazy"></figure><p>En el caso del juego del robot, para reiterar la estructura de puntuación/recompensa es:</p><ul><li><strong><strong>power</strong></strong> = +1</li><li><strong><strong>mine</strong></strong> = -100</li><li><strong><strong>end</strong></strong> = +100</li></ul><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/EpQDzt7lCbmFyMVUzNGaPam3WCYNuD1-hVxu" class="kg-image" alt="EpQDzt7lCbmFyMVUzNGaPam3WCYNuD1-hVxu" width="611" height="123" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/xQtpQAhBocPC46-f0GRHDOK3ybrz4ZasaDo4" class="kg-image" alt="xQtpQAhBocPC46-f0GRHDOK3ybrz4ZasaDo4" width="643" height="306" loading="lazy"></figure><p>Repetiremos esto una y otra vez hasta que el aprendizaje se detenga. De esta manera se actualizará la Q-Table.</p><h3 id="vamos-a-recapitular">Vamos a recapitular<strong> </strong></h3><ul><li>Q-Learning es un algoritmo de aprendizaje por refuerzo basado en valores que se utiliza para encontrar la política óptima de selección de acciones utilizando una función Q.</li><li>Nuestro objetivo es maximizar la función de valor Q.</li><li>La Q-Table nos ayuda a encontrar la mejor acción para cada estado.</li><li>Ayuda a maximizar la recompensa esperada seleccionando la mejor de todas las acciones posibles.</li><li>Q(estado, acción) devuelve la recompensa futura esperada de esa acción en ese estado.</li><li>Esta función se puede estimar usando Q-Learning, que actualiza iterativamente Q(s,a) usando la <strong>ecuación de Bellman<strong>.</strong></strong></li><li>Inicialmente, exploramos el entorno y actualizamos la Q-Table. Cuando la Q-Table esté lista, el agente comenzará a explotar el entorno y comenzará a tomar mejores medidas.</li></ul><p>Si usted tiene alguna pregunta, por favor hágamelo saber en un comentario en <strong><a href="https://twitter.com/I_AM_ADL">Twitter</a></strong>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprendizaje automático: Una introducción al error cuadrático medio y las líneas de regresión. ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Moshe Binieli  Artículo original Machine learning: an introduction to mean squared error and regression lines [https://www.freecodecamp.org/news/machine-learning-mean-squared-error-regression-line-c7dde9a26b93/] Traducido y adaptado por andres-torres [/espanol/news/author/andres-torres/] Introducción Este artículo tratará acerca del tema estadístico de error cuadrático medio y describirá la relación de este método con la regresión lineal, ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/aprendizaje-automatico-una-introduccion-al-error-cuadratico-medio-y-las-lineas-de-regresion/</link>
                <guid isPermaLink="false">6156503fc757580942e5c718</guid>
                
                    <category>
                        <![CDATA[ Matemáticas ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Thu, 14 Oct 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/10/MACHINE-LEARNING-FREECODECAMP.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong>Artículo original escrito por </strong>Moshe Binieli <br><strong>Artículo original </strong><a href="https://www.freecodecamp.org/news/machine-learning-mean-squared-error-regression-line-c7dde9a26b93/">Machine learning: an introduction to mean squared error and regression lines</a><br><strong> Traducido y adaptado por</strong> <a href="https://www.freecodecamp.org/espanol/news/author/andres-torres/">andres-torres</a></p><h3 id="introducci-n">Introducción</h3><p>Este artículo tratará acerca del tema estadístico de <strong>error cuadrático medio</strong> y describirá la relación de este método con la regresión lineal, la regresión más básica en el contexto del aprendizaje automático (machine learning). </p><p>El ejemplo consiste de puntos en el eje cartesiano. Definiremos una función matemática que nos dará la línea recta que pasa en medio de todos los puntos del eje cartesiano.</p><p>De esta manera, aprenderemos la conexión entre estos dos métodos y cómo los resultados de su conexión aparecen juntos.</p><h3 id="explicaci-n-general">Explicación General</h3><p><strong>Contexto</strong></p><blockquote>El error cuadrático(MSE) mide el promedio de los errores elevados al cuadrado.</blockquote><p>El hecho que el MSE es casi siempre estrictamente positivo(y no zero) es debido a la aleatoriedad o a que el estimador carece de información con la que pueda producir una mejor estimación. </p><h3 id="la-estructura-del-art-culo">La estructura del artículo</h3><ul><li>Obtén una idea del ECM y su visualización gráfica.</li><li>La parte matemática que contiene manipulaciones algebraicas y una derivación de una función de dos variables encontrando su mínimo.</li><li>Esta sección es para quienes desean comprender el proceso de cómo obtenemos las fórmulas matemáticas finales. Puedes saltarte esta parte si tu interés no es este.</li><li>Una explicación del rol de cada variable en la fórmula.</li><li>Ejemplos.</li></ul><p><strong>Ideas Generales:</strong></p><p>Supongamos que tenemos siete puntos, nuestro objetivo es encontrar la línea que <strong>minimiza </strong>la suma de las distancias elevadas al cuadrado de estos puntos.</p><p>Tratemos de comprender esto.</p><p>Tomemos un ejemplo y tracemos una línea en medio de siete puntos aleatorios.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/MNskFmGPKuQfMLdmpkT-X7-8w2cJXulP3683" class="kg-image" alt="MNskFmGPKuQfMLdmpkT-X7-8w2cJXulP3683" width="581" height="572" loading="lazy"><figcaption>Puntos en una simple gráfica</figcaption></figure><p>Podrías estar preguntándote ¿Qué significa esta gráfica?</p><ul><li>Los <strong>puntos púrpuras</strong> son los siete puntos aleatorios en la gráfica. Cada punto posee una coordenada X y una coordenada Y.</li><li>La<strong> línea azul</strong> es nuestra línea de predicción. Es una línea que pasa a través de todos los puntos y que se ajusta a ellos de la mejor manera posible, de este modo esta línea contiene todos los puntos.</li><li>La <strong>línea roja</strong> entre cada punto púrpura y la línea de predicción son los <strong>errores. </strong>Cada error es la distancia desde el punto hasta su punto estimado. </li></ul><p>Puede que ahora recuerdes esta ecuación en tus días de escuela, <strong><em>y=Mx+B</em></strong>, donde <strong>M </strong> es la pendiente de la recta, y &nbsp;<strong>B</strong> es su intercepto.</p><p>Queremos encontrar la pendiente M y él interceptó B &nbsp;que &nbsp;<strong>minimiza el error cuadrático.</strong></p><p>Definamos la ecuación matemática que nos proporcionará el error cuadrático medio para todos nuestros puntos. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/hmZydSW9YegiMVPWq2JBpOpai3CejzQpGkNG" class="kg-image" alt="hmZydSW9YegiMVPWq2JBpOpai3CejzQpGkNG" width="638" height="176" loading="lazy"><figcaption>Fórmula General para el Error Cuadrático Medio.</figcaption></figure><p>Analicemos el significado de esta ecuación.</p><ul><li>Sigma representa la suma de la secuencia de números desde i=1 hasta n. Imaginemos esto cómo un arreglo de puntos, donde en el proceso se pasa a través de todos los puntos, desde el primero (i=1) hasta el último (i=n).</li><li>Por cada punto, tomamos la coordinada y del punto, y la coordenada &nbsp;<em>y</em>’. Sustraemos la coordenada y, de nuestra coordenada &nbsp;<em>y</em>’ (es decir los valores estimados) y calculamos el cuadrado del resultado.</li><li>La tercera parte es tomar la suma de todos los valores &nbsp;(y-y’)², es decir, la diferencia entre los valores reales y estimados elevados al cuadrado. </li><li>Finalmente procedemos a dividir esas diferencias al cuadrado por n y así obtenemos la media.</li></ul><p>Nuestro objetivo es minimizar esta media. Lo que nos proveerá con la mejor línea que pasa a través de los puntos. </p><h3 id="del-concepto-a-las-ecuaciones-matem-ticas">Del concepto a las ecuaciones matemáticas</h3><p>Esta parte es para las personas que quieren comprender cómo obtenemos las ecuaciones matemáticas. </p><p>Cómo vimos anteriormente, tenemos la ecuación y=mx+b.</p><p>Tomemos cada punto en la gráfica, y luego haremos nuestro propio cálculo (y-y’)².<br>¿Pero cómo calculamos y? No tenemos qué porque es parte de los datos.</p><p>Recordemos la definición algebraica, de (y-y’)². A partir de aquí, obtenemos el desglose de la ecuación del error cuadrático medio (MSE):</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/wSige6ZLxM-QaVt3fRWXIAzsHvX7wdcJ4XOy" class="kg-image" alt="wSige6ZLxM-QaVt3fRWXIAzsHvX7wdcJ4XOy" width="800" height="82" loading="lazy"></figure><p>Reescribimos la ecuación y simplificamos.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/JFi5pzT7YtJ-0Fkx59jP0hCNHzc8tvsrXgPg" class="kg-image" alt="JFi5pzT7YtJ-0Fkx59jP0hCNHzc8tvsrXgPg" width="800" height="62" loading="lazy"></figure><p>Comenzamos operando los paréntesis en la ecuación. Nótese la distinción anaranjada y morado de las ecuaciones. </p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/vWLTze9HzNDSg4LRM5dbpkYUpkXkhTW6TnRl" class="kg-image" alt="vWLTze9HzNDSg4LRM5dbpkYUpkXkhTW6TnRl" width="800" height="39" loading="lazy"></figure><p>Ahora, apliquemos otra manipulación. Juntaremos cada parte de la ecuación. Tomaremos todas la y, así como todas las (-2ymx) etc. En otras palabras, agrupación de términos.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/y3gkwSWxwAOcxfxMILLV0teW1273PFtFiqW4" class="kg-image" alt="y3gkwSWxwAOcxfxMILLV0teW1273PFtFiqW4" width="800" height="40" loading="lazy"></figure><p>En este punto, podemos tomar la media de todos los valores elevados al cuadrado de y, xy, x, x².</p><p>Definamos para cada uno, un nuevo carácter que representará la media de todos los valores al cuadrado.</p><p>Veamos un ejemplo, tomemos todos los valores y, y luego dividamos por <strong>n</strong> (n representa el número de elementos), entonces obtendremos la media, y la llamaremos<strong> Y promedio.</strong></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/L3NWDFs1LUKgQU223EAFXXUXX3OTFWR0gLtE" class="kg-image" alt="L3NWDFs1LUKgQU223EAFXXUXX3OTFWR0gLtE" width="512" height="150" loading="lazy"></figure><p>Si multiplicamos ambos lados de la ecuación por <strong>n</strong>, obtendremos:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/jyiOt9MVCg460395d6mkHlrmK9ssfr8nQGJC" class="kg-image" alt="jyiOt9MVCg460395d6mkHlrmK9ssfr8nQGJC" width="304" height="55" loading="lazy"></figure><p>Esto nos llevará a la siguiente ecuación:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/bv3wucYBgHc3Zch115zMYjhH-zYe5VgwjMAH" class="kg-image" alt="bv3wucYBgHc3Zch115zMYjhH-zYe5VgwjMAH" width="730" height="67" loading="lazy"></figure><p>Tenemos una ecuación de tres dimensiones. Queremos encontrar los valores M y B(recordar la ecuación de la recta) que <strong>minimizan</strong> la función. </p><p>Debido a que es un problema de minimización, entramos al mundo del cálculo diferencial, la forma de minimizar una ecuación consiste en igualar a cero y luego derivar. Sin embargo, en este caso tenemos que tomar una <strong>derivada parcial. Tomamos la derivada parcial con respecto a M y la derivada parcial con respecto a B de nuestro MSE.</strong></p><p>Ya que estamos buscando un punto mínimo, tomaremos las derivadas parciales, igualándolas a cero.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/88voRjo799rIopVP8YjsHlNhrBSJ8REg26hY" class="kg-image" alt="88voRjo799rIopVP8YjsHlNhrBSJ8REg26hY" width="331" height="117" loading="lazy"><figcaption>Minimización de MSE con respecto a M y B</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/6t-4Uq4Y4GMGg9mYWPUUmHHsmaTvxuDPZCj3" class="kg-image" alt="6t-4Uq4Y4GMGg9mYWPUUmHHsmaTvxuDPZCj3" width="775" height="203" loading="lazy"><figcaption>Derivadas Parciales</figcaption></figure><p>Tomemos las dos ecuaciones que acabamos de obtener, separando la variable b de ambas, y luego sustrayendo la primera ecuación de la segunda. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/-I3Ly2wOtJf9WiecfOjvFiY6U9DXB4PJBQ6t" class="kg-image" alt="-I3Ly2wOtJf9WiecfOjvFiY6U9DXB4PJBQ6t" width="357" height="156" loading="lazy"><figcaption>Diferente escritura de las ecuaciones luego de la derivación por partes.&nbsp;</figcaption></figure><p>Pasamos a sustraer la primera ecuación de la segunda. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/6WzsJxr0jSG8XPYz-F2dSmINqnexxJLxWsxi" class="kg-image" alt="6WzsJxr0jSG8XPYz-F2dSmINqnexxJLxWsxi" width="499" height="132" loading="lazy"><figcaption>Así unimos ambas ecuaciones</figcaption></figure><p>Nos deshacemos de los denominadores en la ecuación.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/Ac05NR92faqptoFE35F2XFcKjllJhJPdwGnE" class="kg-image" alt="Ac05NR92faqptoFE35F2XFcKjllJhJPdwGnE" width="412" height="122" loading="lazy"><figcaption>Ecuación final para encontrar M.</figcaption></figure><p>Y aquí estamos, esta es la ecuación para encontrar M, tomamos esta para escribir la ecuación B.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/pjxjeSICBJNckegf3WXCHtfrf7dyIxVfqbBB" class="kg-image" alt="pjxjeSICBJNckegf3WXCHtfrf7dyIxVfqbBB" width="369" height="58" loading="lazy"><figcaption>Ecuación final para econtrar B.</figcaption></figure><h3 id="ecuaciones-para-la-pendiente-y-l-intercept-y-">Ecuaciones para la pendiente y él interceptó y. </h3><p>Estas serán las ecuaciones matemáticas que nos ayudarán a encontrar la pendiente y él interceptó. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/290zZ8roKAfKNCrfq1LN7QuTooJjbH19Isiv" class="kg-image" alt="290zZ8roKAfKNCrfq1LN7QuTooJjbH19Isiv" width="629" height="180" loading="lazy"><figcaption>Ecuaciones Pendiente Intercepto</figcaption></figure><p>Hablemos un poco más acerca de estas ecuaciones:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/KTFy4uhGXnGSrCoyInhSWfHH4VTEnAJyncpm" class="kg-image" alt="KTFy4uhGXnGSrCoyInhSWfHH4VTEnAJyncpm" width="475" height="153" loading="lazy"><figcaption>Suma de x dividido por n</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/lQSFx0h7KiRB0uOcriwpFrmhsev3kt4cCUU5" class="kg-image" alt="lQSFx0h7KiRB0uOcriwpFrmhsev3kt4cCUU5" width="574" height="172" loading="lazy"><figcaption>Suma de x² dividido por n</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/LYZL8LPc8vyZ0wPV2J2sp-pXiuCzvslY8EAQ" class="kg-image" alt="LYZL8LPc8vyZ0wPV2J2sp-pXiuCzvslY8EAQ" width="580" height="172" loading="lazy"><figcaption>Suma de xy dividido por n</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/0E27klUj208HeeecnRKR9Eokb2PmKfUNoO-O" class="kg-image" alt="0E27klUj208HeeecnRKR9Eokb2PmKfUNoO-O" width="453" height="154" loading="lazy"><figcaption>Suma de y dividido por n</figcaption></figure><h3 id="ejemplos">Ejemplos</h3><p>Muchas Gracias a <a href="https://www.khanacademy.org/" rel="noopener">Khan Academy</a> por los ejemplos.</p><h4 id="ejemplo-1">Ejemplo #1</h4><p>Tomemos 3 puntos, (1,2), (2,1), (4,3).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/IudmVD0mo4BMYqPEjFyETchb5GGsDv5ikxwB" class="kg-image" alt="IudmVD0mo4BMYqPEjFyETchb5GGsDv5ikxwB" width="691" height="582" loading="lazy"><figcaption>Puntos en la Gráfica</figcaption></figure><p>Encontremos M y B para la ecuación y=mx+b.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/KFDixcE4WidM6Pez8RNDwOgBorpnj1QuLw5S" class="kg-image" alt="KFDixcE4WidM6Pez8RNDwOgBorpnj1QuLw5S" width="290" height="118" loading="lazy"><figcaption>Suma de los valores x y su división por n</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/Rqkh4dC9zZ11V4McMwJFspxv5UySTiI9Sv1L" class="kg-image" alt="Rqkh4dC9zZ11V4McMwJFspxv5UySTiI9Sv1L" width="300" height="105" loading="lazy"><figcaption>Suma de los valores y y su división por n</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/tkUVYMlF-9qDaK69dWj0bFy1ApEK4DHw05vK" class="kg-image" alt="tkUVYMlF-9qDaK69dWj0bFy1ApEK4DHw05vK" width="447" height="141" loading="lazy"><figcaption>Suma de los valores xy y su división por n</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/80W3OcjPxF9ek2HIjv0VYnwCEhpzURavMAlj" class="kg-image" alt="80W3OcjPxF9ek2HIjv0VYnwCEhpzURavMAlj" width="411" height="106" loading="lazy"><figcaption>Suma de los valores x2 y su división por n</figcaption></figure><p>Luego de haber calculado las partes relevantes de nuestras ecuaciones pendientes e intercepto, sustituyamos algunos valores en las ecuaciones &nbsp;veamos cómo obtenemos una pendiente y un intercepto y.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/Hri9luC8oVUAgZLnLoDgey4X0T6LEZwIFMav" class="kg-image" alt="Hri9luC8oVUAgZLnLoDgey4X0T6LEZwIFMav" width="547" height="127" loading="lazy"><figcaption>Cálculo de la pendiente&nbsp;</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/H4Ss6UYBdSfJgx63lz93uXaubcE3-6e1niFS" class="kg-image" alt="H4Ss6UYBdSfJgx63lz93uXaubcE3-6e1niFS" width="351" height="96" loading="lazy"><figcaption>Cálculo del intercepto</figcaption></figure><p>Tomemos estos resultados y definámoslos cómo una sola ecuación y=mx+b.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/S9EESO6mBvglt1o--YlQZQFqhNGPg4we6Kju" class="kg-image" alt="S9EESO6mBvglt1o--YlQZQFqhNGPg4we6Kju" width="149" height="67" loading="lazy"></figure><p>Ahora dibujemos la línea y veamos cómo esta pasa a través de los puntos a la vez que <strong>minimiza sus distancias elevadas al cuadrado</strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/DlKy-Eekc0SdHpcOeQPGJobo7jYLfTh0pI8Q" class="kg-image" alt="DlKy-Eekc0SdHpcOeQPGJobo7jYLfTh0pI8Q" width="669" height="564" loading="lazy"><figcaption>Línea de Regresión que minimiza MSE.</figcaption></figure><h4 id="ejemplo-2">Ejemplo #2</h4><p>Tomemos 4 puntos, (-2,-3), (-1,-1), (1,2), (4,3).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/MrlSNVYUJEh-4OcRGXEe3hbeU10wjTH-vmDB" class="kg-image" alt="MrlSNVYUJEh-4OcRGXEe3hbeU10wjTH-vmDB" width="739" height="595" loading="lazy"><figcaption>Points on graph.</figcaption></figure><p>Vamos a encontrar M y B para la ecuación y = mx + b.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/MqNv9HXhu7koehCq1WgBSH2Mje3VoHUM6Dsb" class="kg-image" alt="MqNv9HXhu7koehCq1WgBSH2Mje3VoHUM6Dsb" width="427" height="106" loading="lazy"><figcaption>Suma de los valores x y división por n&nbsp;</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/I8bZESRhxejhmNWbxMlusVlxfCgnrJPbn2En" class="kg-image" alt="I8bZESRhxejhmNWbxMlusVlxfCgnrJPbn2En" width="431" height="110" loading="lazy"><figcaption>Suma de los valores y y división por n&nbsp;</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/Sbo7-PaRePrfBM1sOME5du5GDQ-1r1ntdoD1" class="kg-image" alt="Sbo7-PaRePrfBM1sOME5du5GDQ-1r1ntdoD1" width="365" height="101" loading="lazy"><figcaption>Suma de los valores x2 y división por n&nbsp;</figcaption></figure><p>Lo mismo que antes, sustituyamos estos valores en las ecuaciones para encontrar &nbsp;M y B. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/LUideJM-zrCgulLv83Gh08ySgcChQXY6BpxC" class="kg-image" alt="LUideJM-zrCgulLv83Gh08ySgcChQXY6BpxC" width="442" height="128" loading="lazy"><figcaption>Cálculo de la pendiente</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/F9K53LF0Dp3kjIYYC3UJoLfGJqICCIhtqTMo" class="kg-image" alt="F9K53LF0Dp3kjIYYC3UJoLfGJqICCIhtqTMo" width="321" height="100" loading="lazy"><figcaption>Cálculo del intercepto</figcaption></figure><p>Definiendo estos resultados cómo una sola ecuación.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/0o5OFw2QwtBJYntrz4vRJn9ywrdsumLxH5rg" class="kg-image" alt="0o5OFw2QwtBJYntrz4vRJn9ywrdsumLxH5rg" width="238" height="98" loading="lazy"></figure><p>Ahora graficamos la línea y vemos cómo esta pasa a través de los puntos a la vez que <strong>minimiza sus distancias elevadas al cuadrado</strong>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/yAMNsNJmTBdZ2MKPbD8JX-es3d-5Oj4OIHRl" class="kg-image" alt="yAMNsNJmTBdZ2MKPbD8JX-es3d-5Oj4OIHRl" width="736" height="600" loading="lazy"><figcaption>Línea de Regresión que minimiza MSE</figcaption></figure><h3 id="en-conclusi-n">En Conclusión</h3><p>Cómo puedes ver, la idea es simple. Solo es necesario comprender las partes principales y cómo trabajar con ellas.</p><p>Puedes trabajar con las fórmulas para encontrar la línea en otra gráfica, y así efectuar un cálculo simple, obteniendo los resultados para la pendiente y él interceptó.</p><p>Este artículo ha hecho más énfasis en el error cuadrático medio y &nbsp;los aspectos matemáticos de la línea de regresión que minimiza el MSE. No tanto así en el aspecto intuitivo y de aplicación práctica que se encuentran fuera del alcance del artículo.</p><p>No obstante, la regresión lineal suele ser de las primeras lecciones en aprendizaje automático e inteligencia artificial, por lo tanto es muy importante conocer su aspecto matemático. </p><p>Muchas Gracias por tu atención.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprendizaje automático en Python: Las principales características nuevas de Scikit-Learn 0.24 que debes saber. ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Davis David [https://www.freecodecamp.org/news/author/davis/] Artículo original Machine Learning in Python – The Top New Scikit-Learn 0.24 Features You Should Know [https://www.freecodecamp.org/news/machine-learning-python-new-scikit-learn-features-you-should-know/] Traducido y adaptado por andres-torres [/espanol/news/author/andres-torres/] Scikit-learn es uno de los open-source y bibliotecas de aprendizaje automático más populares en Python. La biblioteca scikit ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/aprendizaje-automatico-en-python-las-principales-caracteristicas-nuevas-de-scikit-learn-que-debes-saber/</link>
                <guid isPermaLink="false">614bf6446534fb0945712466</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Wed, 13 Oct 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/09/scikit-learn-image-freecodecamp.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong>Artículo original escrito por </strong><a href="https://www.freecodecamp.org/news/author/davis/"><strong>Davis David</strong></a><br><strong>Artículo original </strong><a href="https://www.freecodecamp.org/news/machine-learning-python-new-scikit-learn-features-you-should-know/">Machine Learning in Python – The Top New Scikit-Learn 0.24 Features You Should Know</a><br><strong> Traducido y adaptado por</strong> <a href="https://www.freecodecamp.org/espanol/news/author/andres-torres/">andres-torres</a></p><p>Scikit-learn es uno de los open-source y bibliotecas de aprendizaje automático más populares en Python.</p><p>La biblioteca scikit-learn contiene muchas herramientas eficientes para aprendizaje automático y modelado estadístico, incluyendo clasificación, regresión, agrupación, y reducción de dimensionalidad. </p><p>Varios científicos de datos, ingenieros de aprendizaje automático e investigadores dependen de esta biblioteca para sus proyectos. Personalmente, me encanta usar scikit-learn porque ofrece muchísima flexibilidad, siendo además fácil de comprender debido a una documentación que ofrece una multitud de ejemplos.</p><p>En este artículo, estaré feliz de compartir contigo las cinco nuevas características en scikit-learn 0.24.</p><h3 id="instalemos-la-ltima-versi-n-de-la-biblioteca-scikit-learn-">Instalemos la última versión de la biblioteca Scikit-Learn.</h3><p>Primero que nada, asegúrate de instalar la última versión (con pip):</p><pre><code>pip install --upgrade scikit-learn</code></pre><p>Si estás usando Anaconda, emplea el siguiente comando:</p><pre><code>conda install -c conda-forge scikit-learn</code></pre><p><strong>Nota:</strong>Esta versión soporta las versiones de Python <strong>3.6</strong> hasta <strong>3.9</strong>.</p><p>Ahora, veamos las nuevas características.</p><h2 id="error-porcentual-absoluto-medio-">Error Porcentual Absoluto Medio.</h2><p>Esta nueva versión de scikit-learn introduce una nueva métrica de evaluación para un problema de regresión llamado Error Porcentual Absoluto Medio, conocido en inglés como "Mean Absolute Percentage Error" (MAPE). Anteriormente teníamos que calcularlo así.</p><pre><code class="language-python">np.mean(np.abs((y_test — preds)/y_test))</code></pre><p>Ahora simplemente llamas a la función <strong>mean_absolute_percentage_error &nbsp; </strong>a partir del módulo de<strong> sklearn.metrics. </strong></p><p>Con esto puedes evaluar que tan bien funciona tu modelo.</p><p><strong>Por ejemplo:</strong></p><pre><code class="language-python">from sklearn.metrics import mean_absolute_percentage_error
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]

print(mean_absolute_percentage_error(y_true, y_pred))</code></pre><p>0.3273809523809524</p><p><strong>Nota: </strong>Recuerda que la función en sí, no expresa su resultado cómo un porcentaje en el rango [0, 100]. En su lugar, el resultado se representa en un rango de &nbsp;[0, 1]. &nbsp;El mejor valor posible es<strong> 0.0.</strong></p><h2 id="onehotencoder-resuelve-la-insuficiencia-de-datos-">OneHotEncoder resuelve la insuficiencia de datos.</h2><p>OneHot Encoder , a <em>grosso modo</em> consiste en reemplazar una variable categórica por una variable binaria (0,1) mediante una transformación. Este puede resolver la falta de datos en caso de presentarse en una hoja de datos, puesto que trata cualquier valor faltante cómo una categoría. Veamos un ejemplo para entender más a detalle de qué se trata.</p><p>Primero importa pandas, numpy y scikit-learn:</p><pre><code class="language-python">import pandas as pd 
import numpy as np
from sklearn.preprocessing import OneHotEncoder</code></pre><p>Crea un simple marco de datos con variables categóricas que posean valores faltantes:</p><pre><code class="language-python"># intialise data of lists.
datos = {'nivel_educacion':['primaria', 'segundaria', 'pregrado', np.nan,'master',np.nan]}
  
# Create DataFrame
df = pd.DataFrame(datos)
  
# imprime el resultado.
print(df)</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/09/image-26.png" class="kg-image" alt="image-26" width="162" height="142" loading="lazy"><figcaption>Resultado</figcaption></figure><p>Cómo puedes ver, tenemos dos valores nulos en nuestra columna de educación.</p><p>A continuación creamos la instancia de OneHotEncoder:</p><pre><code class="language-python">ohe = OneHotEncoder()</code></pre><p>Luego ajustamos y transformamos nuestros datos:</p><pre><code class="language-python">ohe.fit_transform(df).toarray()</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2021/06/zVaxL0LohRUpfDQhznRQ9z3y5tj1-pn3531g0.jpeg" class="kg-image" alt="zVaxL0LohRUpfDQhznRQ9z3y5tj1-pn3531g0" width="600" height="400" loading="lazy"></figure><p>Nuestra columna de educación ha sido transformada y todos los valores nulos han sido incluidos en una nueva categoría (Observa la última columna en el arreglo).</p><h2 id="nuevo-m-todo-para-selecci-n-de-variables-">Nuevo método para selección de variables.</h2><p><strong>SequentialFeatureSelector</strong> es un nuevo método de selección de caracteristicas en scikit-learn. Existen dos formas de selección de variables, las definiciones técnicas son las siguientes: <em>forward selection</em> y <em>backward selection.</em></p><h3 id="forward-selection-selecci-n-hacia-adelante-">Forward Selection (selección hacia adelante)</h3><p>En palabras simples, el método de <code>Forward Selection</code> interactivamente encuentra la nueva característica y luego<strong> </strong>la añade al conjunto de características previamente seleccionadas. </p><p>Es decir, que comenzamos con cero características y luego encontramos una característica que maximiza la puntuación de validación cruzada de un estimador. La característica seleccionada es añadida al conjunto de variables y el proceso es repetido hasta lograr el número deseado de variables seleccionadas.</p><h3 id="backward-selection-selecci-n-hacia-atr-s-">Backward Selection (selección hacia atrás)</h3><p>Esta segunda selección sigue la misma idea que la anterior, pero en una dirección diferente. Aquí empieza con todas las características y luego <strong>remueve </strong>una característica del conjunto hasta que alcanzar el número deseado de características seleccionadas.</p><h4 id="ejemplos-">Ejemplos:</h4><p>Importa los paquetes más importantes:</p><pre><code class="language-python">from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris</code></pre><p>Utiliza un conjunto de datos<em> &nbsp;</em>que forma<em> </em> parte de los ejemplos que proporciona scikit-learn. Define los nombres de sus variables:</p><pre><code class="language-python">X, y = load_iris(return_X_y=True, as_frame=True)
feature_names = X.columns</code></pre><p>Crea la instancia de un estimador (En este caso por K-Nearest Neighbors):</p><pre><code class="language-python">knn = KNeighborsClassifier(n_neighbors=3)</code></pre><p>Crea la instancia responsable de seleccionar las variables (<em>SequentialFeatureSelector</em>), fijando el número de variables a seleccionar igual a <strong>2</strong>, y la dirección “<strong>backward</strong>”:</p><pre><code class="language-python">sfs = SequentialFeatureSelector(knn, n_features_to_select=2,direction='backward')</code></pre><p>Finalmente ajusta las variables seleccionadas:</p><pre><code class="language-python">sfs.fit(X,y)</code></pre><p>Para mostrar las variables necesitaremos:</p><pre><code class="language-python">print("Features selected by backward sequential selection: "f{feature_names[sfs.get_support()].tolist()}")</code></pre><h2 id="nuevos-m-todos-para-ajustar-hiperpar-metros-">Nuevos métodos para ajustar Hiperparámetros.</h2><p>Cuando se trata de ajustar Hiperparámetros, GridSearchCV y RandomizedSearchCv en Scikit-learn han sido la primera elección en Data Science.</p><p>Sin embargo, en esta nueva versión, tenemos dos nuevas clases para ajustar Hiperparámetros; <strong>HalvingGridSearchCV</strong> y <strong>HalvingRandomSearchCV</strong>.</p><p>HalvingGridSearchCV y HalvingRandomSearchCV usan un nuevo algorithmo llamado <strong>successive halving, </strong>para encontrar los hiperparámetros óptimos. &nbsp;</p><h3 id="-c-mo-funciona-el-algorithmo-successive-halving">¿Cómo funciona el algorithmo successive halving?</h3><p>En la primera iteración, se entrena una combinación de hiperparámetros en un subconjunto de observaciones, (datos de entrenamiento).</p><p>Luego en la próxima iteración, se selecciona solamente la combinación de hiperparámetros que tuvieron un buen desempeño en la primera iteración. De este modelo serán entrenados nuevamente solo que en número de observación más extenso. </p><p>Por último, se repite este proceso de selección en cada iteración hasta que selecciona la mejor combinación de hiperparámetros en la última iteración.</p><p><strong>Nota:</strong> Todas estas clases de Scikit-learn son todavía experimentales:</p><h4 id="ejemplo-">Ejemplo:</h4><p>Importamos los paquetes importantes:</p><pre><code class="language-python">from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.experimental import enable_halving_search_cv  
from sklearn.model_selection import HalvingRandomSearchCV
from scipy.stats import randint</code></pre><p>Ya que estas clases son todavía experimentales, para usarlas, importamos explícitamente, es decir, usamos import <strong>enable_halving_search_cv</strong>.</p><p>Creamos un conjunto de datos para clasificación usando el método make_classification:</p><pre><code class="language-python">X, y = make_classification(n_samples=1000)</code></pre><p>Creamos la instancia del estimador. Usando un clasificador basado en bosques aleatorios, es decir, Random Forest Classifier:</p><pre><code class="language-python">clf = RandomForestClassifier(n_estimators=20)</code></pre><p>Creamos la distribución del parámetro para el ajuste:</p><pre><code class="language-python">param_dist = {"max_depth": [3, None],
              "max_features": randint(1, 11),
              "min_samples_split": randint(2, 11),
              "bootstrap": [True, False],
              "criterion": ["gini", "entropy"]}</code></pre><p>Definiendo con rsh la instancia de clase HalvingGridSearchCV con nuestro RandomForestClassifier(estimator=clf) como estimador, obtendremos la lista de distribuciones de nuestros parámetros:</p><pre><code class="language-python">rsh = HalvingRandomSearchCV(
    estimator=clf,
    param_distributions=param_dist,
    cv = 5,
    factor=2,
    min_resources = 20)</code></pre><p>Hay dos parámetros muy importantes en HalvingRandomSearchCV a tomar en cuenta.</p><ol><li><strong>factor</strong> — Determina la proporción de la combinación de hiperparámetros que son seleccionados para cada iteración subsecuente. Por ejemplo, <em><em><strong>factor=3</strong></em></em> significa que solo un tercio de los candidatos son seleccionados para la nueva iteración.</li><li><strong>min_resources</strong> &nbsp;es el total de recursos (número de observaciones) asignadas en la primera iteración para cada combinación de hiperparámetros.</li></ol><p>Finalmente, podemos ajustar los parámetros del objeto de búsqueda (rsh) que hemos creado en nuestro conjunto de datos. </p><pre><code class="language-python">rsh.fit(X,y)</code></pre><p>Podemos ver los resultados luego de haber entrenado nuestros datos:</p><ol><li>El número de iteraciones</li></ol><pre><code class="language-python">print(rsh.n_iterations_ )</code></pre><p>que es 6.</p><p> 2. El número de parámetros candidatos a ser evaluados en cada iteración.</p><pre><code class="language-python">print(rsh.n_candidates_ )</code></pre><p><strong>Los cuales son [50, 25, 13, 7, 4, 2]</strong>.</p><p>3. El número de recursos a utilizados en cada iteración:</p><pre><code class="language-python">print(rsh.n_resources_)</code></pre><p>que es <strong>[20, 40, 80, 160, 320, 640]</strong>.</p><p>4. Los parámetros que proporcionan los mejores resultados:</p><pre><code class="language-python">print(rsh.best_params_)</code></pre><p>Resultando:</p><p><strong>{‘bootstrap’: False,</strong><br><strong>‘criterion’: ‘entropy’,</strong><br><strong>‘max_depth’: None,</strong><br><strong>‘max_features’: 5,</strong><br><strong>‘min_samples_split’: 2}</strong></p><h2 id="nuevo-meta-estimador-de-entrenamiento-autom-tico-para-aprendizaje-semi-supervisado-">Nuevo meta-estimador de entrenamiento automático para aprendizaje semi-supervisado. </h2><p>Scikit-learn 0.24 ha introducido una nueva implementación de auto-entrenamiento para aprendizaje semi-supervisado llamado <code>SelfTrainingClassifier</code>. Puedes utilizar el clasificador de autoaprendizaje con cualquier clasificador supervisado que retorne estimaciones de probabilidad para cada clase. </p><p>Esto significa que cualquier clasificador supervisado puede funcionar como un clasificador semi-supervisado, con el propósito de facilitar el aprendizaje de observaciones de datos no etiquetados, (datos no etiquetados).</p><p><strong>Nota: Los valores no etiquetados en la columna de destino devén tener un valor de -1.</strong></p><p>Entendamos más cómo funciona. </p><p>Una vez importados los elementos importantes, definimos una semilla aleatoria con Numpy, &nbsp;luego procedemos a llamar a nuestro conjunto de datos anterior. &nbsp;Finalmente, empleamos nuestro clasificador semi-supervisado con los valores no etiquetados (datos no etiquetados).</p><pre><code class="language-python">import numpy as np
from sklearn import datasets
from sklearn.semi_supervised import SelfTrainingClassifier
from sklearn.svm import SVC
rng = np.random.RandomState(42)
iris = datasets.load_iris()
random_unlabeled_points = rng.rand(iris.target.shape[0]) &lt; 0.3
iris.target[random_unlabeled_points] = -1</code></pre><p>Cómo puedes ver, los valores no etiquetados en el arreglo se expresan con valor de -1. </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/06/zVaxL0LohRUpfDQhznRQ9z3y5tj1-jcah31ok.jpeg" class="kg-image" alt="zVaxL0LohRUpfDQhznRQ9z3y5tj1-jcah31ok" width="600" height="400" loading="lazy"></figure><p>Creando una instancia del estimador supervisado:</p><pre><code class="language-python">svc = SVC(probability=True, gamma="auto")</code></pre><p>Por otra parte, creando una instancia del nuevo SelfTrainingClassifier, añadiendo svc como nuestro estimador:</p><pre><code class="language-python">self_training_model = SelfTrainingClassifier(base_estimator=svc)</code></pre><p>Finalmente, ajustamos nuestro modelo y sus correspondientes valores no etiquetados:</p><pre><code class="language-python">self_training_model.fit(iris.data, iris.target)</code></pre><p>Resultado:</p><p>SelfTrainingClassifier(base_estimator=SVC(gamma=’auto’, probability=True))</p><h2 id="reflexiones-finales-acerca-de-scikit-learn-0-24">Reflexiones finales acerca de Scikit-Learn 0.24</h2><p>Cómo mencioné, scikit-learn permanece cómo uno de los &nbsp;de los open-source y bibliotecas de aprendizaje automático más populares en Python. Posee todas las herramientas necesarias para construir un proyecto de aprendizaje automático de extremo a extremo.</p><p>También puedes implementar las nuevas funciones presentadas en este artículo en tu propio proyecto de aprendizaje automático.</p><p>Felicitaciones ?? llegaste al final de este artículo. Espero que hayas aprendido algo nuevo que te ayude en tu proyecto de aprendizaje automático o ciencia de datos. </p><p>¡Feliz aprendizaje!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo funcionan los clasificadores Naive Bayes: con ejemplos de código de Python ]]>
                </title>
                <description>
                    <![CDATA[ Los clasificadores Naive Bayes (NBC por su siglas en inglés) son algoritmos de aprendizaje automático simples pero potentes. Se basan en la probabilidad condicional y el teorema de Bayes. En esta publicación, explico "el truco" detrás de NBC y les daré un ejemplo que podemos usar para resolver un problema ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-funcionan-los-clasificadores-naive-bayes-con-ejemplos-de-codigo-de-python/</link>
                <guid isPermaLink="false">6015cfe562984e09f60851c3</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Fernando Cardellino ]]>
                </dc:creator>
                <pubDate>Wed, 28 Apr 2021 05:08:20 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/naive_bayes_classif.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Los clasificadores Naive Bayes (NBC por su siglas en inglés) son algoritmos de aprendizaje automático simples pero potentes. Se basan en la probabilidad condicional y el teorema de Bayes.</p><p>En esta publicación, explico "el truco" detrás de NBC y les daré un ejemplo que podemos usar para resolver un problema de clasificación.</p><p>En las próximas secciones, hablaré sobre las matemáticas detrás de NBC. Siéntete libre de omitir esas secciones y pasar a la parte de implementación si no estás interesado en las matemáticas.</p><p>En la sección de implementación, te mostraré un algoritmo NBC simple. Luego lo usaremos para resolver un problema de clasificación. La tarea será determinar si cierto pasajero del Titanic sobrevivió al accidente o no.</p><h2 id="probabilidad-condicional">Probabilidad condicional</h2><p>Antes de hablar sobre el algoritmo en sí, hablemos de las matemáticas detrás de él. Necesitamos entender qué es la probabilidad condicional y cómo podemos usar el teorema de Bayes para calcularla.</p><p>Piense en un dado equilibrado con seis lados. ¿Cuál es la probabilidad de obtener un seis al lanzar el dado? Eso es fácil, es 1/6. Tenemos seis resultados posibles e igualmente probables, pero solo nos interesa uno de ellos. Entonces, 1/6 lo es.</p><p>Pero, ¿qué pasa si te digo que ya lancé el dado y el resultado es un número par? ¿Cuál es la probabilidad de que tengamos un seis ahora?</p><p>Esta vez, los posibles resultados son solo tres porque solo hay tres números pares en el dado. Todavía estamos interesados en solo uno de esos resultados, por lo que ahora la probabilidad es mayor: 1/3. ¿Cuál es la diferencia entre ambos casos?</p><p>En el primer caso, no teníamos información <strong>previa</strong> sobre el resultado. Por lo tanto, necesitábamos considerar todos los resultados posibles.</p><p>En el segundo caso, se nos dijo que el resultado era un número par, por lo que podíamos reducir el espacio de posibles resultados a solo los tres números pares que aparecen en un dado normal de seis caras.</p><p>En general, al calcular la probabilidad de un evento A, dada la ocurrencia de otro evento B, decimos que estamos calculando la <strong>probabilidad condicional</strong> de A dado B, o simplemente la probabilidad de A dado B. Lo denotamos <code>P(A|B)</code>.</p><p>Por ejemplo, la probabilidad de obtener un seis dado que el número que tenemos es par: <code>P(Seis|Par) = 1/3</code>. Aquí, denotamos con <strong>Seis</strong> el evento de obtener un seis y con <strong>Par</strong> el evento de obtener un número par.</p><p>Pero, ¿cómo calculamos las probabilidades condicionales? ¿Existe una fórmula?</p><h2 id="c-mo-calcular-probabilidades-condicionales-y-el-teorema-de-bayes">Cómo calcular probabilidades condicionales y el teorema de Bayes</h2><p>Ahora, te daré un par de fórmulas para calcular probabilidades condicionales. Prometo que no serán difíciles y son importantes si deseas comprender la ideas detrás de los algoritmos de aprendizaje automático de los que hablaremos más adelante.</p><p>La probabilidad de un evento A dada la ocurrencia de otro evento B se puede calcular de la siguiente manera:</p><pre><code class="language-pseudocode">P(A|B) = P(A,B)/P(B)
</code></pre><p>Donde <code>P(A,B)</code> denota la probabilidad de A y B ocurriendo al mismo tiempo, y <code>P(B)</code> denota la probabilidad de B.</p><p>Observa que necesitamos <code>P(B) &gt; 0</code> porque no tiene sentido hablar de la probabilidad de A dado B si la ocurrencia de B no es posible.</p><p>También podemos calcular la probabilidad de un evento A, dada la ocurrencia de múltiples eventos B1, B2, ..., Bn:</p><pre><code class="language-pseudocode">P(A|B1,B2,...,Bn) = P(A,B1,B2,...,Bn)/P(B1,B2,...,Bn)
</code></pre><p>Hay otra forma de calcular probabilidades condicionales. Esta forma es el llamado Teorema de Bayes.</p><pre><code class="language-pseudocode">P(A|B) = P(B|A)P(A)/P(B)

P(A|B1,B2,...,Bn) = P(B1,B2,...,Bn|A)P(A)/P(B1,B2,...,Bn)
</code></pre><p>Observa que estamos calculando la probabilidad del evento A dado el evento B, <em>invirtiendo</em> el orden de ocurrencia de los eventos.</p><p>Ahora suponemos que ha ocurrido el evento A y queremos calcular la probabilidad del evento B (o eventos B1, B2, ..., Bn en el segundo y más general ejemplo).</p><p>Un dato importante que se puede derivar de este Teorema es la fórmula para calcular <code>P(B1,B2,...,Bn,A)</code>. Eso se llama la regla de la cadena para las probabilidades.</p><pre><code class="language-pseudocode">P(B1,B2,...,Bn,A) = P(B1 | B2, B3, ..., Bn, A)P(B2,B3,...,Bn,A)
= P(B1 | B2, B3, ..., Bn, A)P(B2 | B3, B4, ..., Bn, A)P(B3, B4, ..., Bn, A)
= P(B1 | B2, B3, ..., Bn, A)P(B2 | B3, B4, ..., Bn, A)...P(Bn | A)P(A)
</code></pre><p>Esa es una fórmula fea, ¿no? Pero bajo algunas condiciones podemos hacer una solución y evitarlo.</p><p>Hablemos del último concepto que necesitamos saber para entender los algoritmos.</p><h2 id="independencia">Independencia</h2><p>El último concepto del que vamos a hablar es el de independencia. Decimos que los eventos A y B son independientes si</p><pre><code class="language-pseudocode">P(A|B) = P(A)
</code></pre><p>Eso significa que la probabilidad del evento A no se ve afectada por la ocurrencia del evento B. Una consecuencia directa es que <code>P(A,B) = P(A)P(B)</code>.</p><p>En términos sencillos, esto significa que la probabilidad de la ocurrencia de A y B al mismo tiempo es igual al producto de las probabilidades de los eventos A y B que ocurren por separado.</p><p>Si A y B son independientes, también se sostiene que:</p><pre><code class="language-pseudocode">P(A,B|C) = P(A|C)P(B|C)
</code></pre><p>¡Ahora estamos listos para hablar sobre los clasificadores Naive Bayes!</p><h2 id="clasificadores-naive-bayes">Clasificadores Naive Bayes</h2><p>Supongamos que tenemos un vector <strong>X</strong> de <em>n</em> características (features) y queremos determinar la clase de ese vector a partir de un conjunto de <em>k</em> clases <em>y1, y2, ..., yk</em>. Por ejemplo, si queremos determinar si lloverá hoy o no.</p><p>Tenemos dos clases posibles <em>(k = 2)</em>: <em>lluvia</em>, <em>no lluvia</em>, y la longitud del vector de características podría ser 3 (<em>n = 3</em>).</p><p>La primera característica podría ser si está nublado o soleado, la segunda característica podría ser si la humedad es alta o baja, y la tercera característica sería si la temperatura es alta, media o baja.</p><p>Entonces, estos podrían ser posibles vectores de características.</p><pre><code class="language-pseudocode">&lt;Nublado, H_Alta, T_Baja&gt;
&lt;Soleado, H_Baja, T_Media&gt;
&lt;Nublado, H_Baja, T_Alta&gt;
</code></pre><p>Nuestra tarea es determinar si lloverá o no, dadas las características meteorológicas.</p><p>Después de conocer las probabilidades condicionales, parece natural abordar el problema tratando de calcular la probabilidad de que llueva dadas las características:</p><pre><code class="language-pseudocode">R = P(Llueve | Nublado, H_Alta, T_Baja)
NR = P(NoLlueve | Nublado, H_Alta, T_Baja)
</code></pre><p>Si <code>R &gt; NR</code> respondemos que va a llover, de lo contrario decimos que no.</p><p>En general, si tenemos <em>k</em> clases <em>y1, y2, ..., yk</em>, y un vector de <em>n</em> características <strong>X = &lt;X1, X2, ..., Xn&gt;</strong>, queremos encontrar la clase yi que maximiza</p><pre><code class="language-pseudocode">P(yi | X1, X2, ..., Xn) = P(X1, X2,..., Xn, yi)/P(X1, X2, ..., Xn)
</code></pre><p>Observa que el denominador es constante y no depende de la clase <em>yi</em>. Entonces, podemos ignorarlo y enfocarnos en el numerador.</p><p>En una sección anterior, vimos cómo calcular <code>P(X1, X2,..., Xn, yi)</code> descomponiéndolo en un producto de probabilidades condicionales (la fórmula fea):</p><pre><code>P(X1, X2,..., Xn, yi) = P(X1 | X2,..., Xn, yi)P(X2 | X3,..., Xn, yi)...P(Xn | yi)P(yi)
</code></pre><p>Suponiendo que todas las características <strong>Xi</strong> son independientes y usando el teorema de Bayes, podemos calcular la probabilidad condicional de la siguiente manera:</p><pre><code>P(yi | X1, X2,..., Xn) = P(X1, X2,..., Xn | yi)P(yi)/P(X1, X2, ..., Xn)
= P(X1 | yi)P(X2 | yi)...P(Xn | yi)P(yi)/P(X1, X2, ..., Xn)
</code></pre><p>Y solo tenemos que centrarnos en el numerador.</p><p>Al encontrar la clase <em>yi</em> que maximiza la expresión anterior, estamos clasificando el vector de entrada. Pero, ¿cómo podemos obtener todas esas probabilidades?</p><h2 id="c-mo-calcular-las-probabilidades">Cómo calcular las probabilidades</h2><p>Al resolver este tipo de problemas necesitamos tener un conjunto de ejemplos previamente clasificados.</p><p>Por ejemplo, en el problema de adivinar si lloverá o no, necesitamos tener varios ejemplos de vectores de características y sus clasificaciones que se obtendrían de pronósticos meteorológicos anteriores.</p><p>Entonces, tendríamos algo como esto:</p><pre><code class="language-pseudocode">...
&lt;Nublado, H_Alta, T_Baja&gt; -&gt; Llueve
&lt;Soleado, H_Baja, T_Media&gt; -&gt; No Llueve
&lt;Nublado, H_Baja, T_Alta&gt; -&gt; No Llueve
...
</code></pre><p>Supongamos que necesitamos clasificar un nuevo vector <code>&lt;Nublado, H_Baja, T_Alta&gt;</code>. Necesitamos calcular:</p><pre><code>P(Llueve | Nublado, H_Baja, T_Baja) = P(Nublado | H_Baja, T_Baja, Llueve)P(H_Baja | T_Baja, Llueve)P(T_Baja | Llueve)P(Llueve)/P(Nublado, H_Baja, T_Baja)
</code></pre><p>Obtenemos la expresión anterior aplicando la definición de probabilidad condicional y la regla de la cadena. Recuerda que solo necesitamos enfocarnos en el numerador por lo que podamos eliminar el denominador.</p><p>También necesitamos calcular la probabilidad para <code>NoLlueve</code>, pero podemos hacerlo de una forma similar.</p><p>Podemos encontrar <code>P(Llueve) = # Llueve/Total</code>. Eso significa contar las entradas en el conjunto de datos que se clasifican con <em>Llueve</em> y dividir ese número por el tamaño del conjunto de datos.</p><p>Para calcular <code>P(Nublado | H_Baja, T_Baja, Llueve)</code> necesitamos contar todas las entradas que tienen las características <em>H_Baja, T_Baja</em> y <em>Nublado</em>. Esas entradas también deben clasificarse como <code>Llueve</code>. Luego, ese número se divide por la cantidad total de datos. Calculamos el resto de factores de la fórmula de forma similar.</p><p>Hacer esos cálculos para todas las clases posibles es muy costoso y lento. Por tanto, necesitamos hacer suposiciones sobre el problema que simplifiquen los cálculos.</p><p>Los clasificadores Naive Bayes asumen que todas las características son independientes entre sí. Entonces podemos reescribir nuestra fórmula aplicando el teorema de Bayes y asumiendo la independencia entre cada par de características:</p><pre><code>P(Llueve | Nublado, H_Baja, T_Baja) = P(Nublado | Llueve)P(H_Baja | Llueve)P(T_Baja | Llueve)P(Llueve)/P(Nublado, H_Baja, T_Baja)
</code></pre><p>Ahora calculamos <code>P(Nublado | Llueve)</code> contando el número de entradas que están clasificadas como <code>Llueve</code> y estaban <code>Nublado</code>.</p><blockquote>El algoritmo se llama Naive (que significa ingenuo en inglés) debido a esta suposición de independencia. Hay dependencias entre las características (features) la mayor parte del tiempo. No podemos decir que en la vida real no existe una dependencia entre la humedad y la temperatura, por ejemplo. Los clasificadores Naive Bayes también se denominan Bayes Indepentientes o Bayes Simples.</blockquote><p>La fórmula general sería:</p><pre><code>P(yi | X1, X2, ..., Xn) = P(X1 | yi)P(X2 | yi)...P(Xn | yi)P(yi)/P(X1, X2, ..., Xn)
</code></pre><p>Recuerda que puedes deshacerte del denominador. Solo calculamos el numerador y respondemos la clase que lo maximiza.</p><p>Ahora, implementemos nuestro NBC y usémoslo en un problema.</p><h2 id="-programemos-">¡Programemos!</h2><p>Les mostraré una implementación de un NBC simple y luego lo veremos en la práctica.</p><p>El problema que vamos a resolver es determinar si un pasajero del Titanic sobrevivió o no, dadas algunas características como su género y su edad.</p><p>Aquí puedes ver la implementación de un NBC muy simple:</p><pre><code class="language-python">class NaiveBayesClassifier:
    
    def __init__(self, X, y):
        
        '''
        X e y denotan las características y las etiquetas de destino respectivamente
        '''
        self.X, self.y = X, y 
        
        self.N = len(self.X) # Tamaño del conjunto de entrenamiento

        self.dim = len(self.X[0]) # Dimensión del vector de características

        self.attrs = [[] for _ in range(self.dim)] # Aquí almacenaremos las columnas del conjunto de entrenamiento.

        self.output_dom = {} # Clases de salida con el número de ocurrencias en el conjunto de entrenamiento. En este caso solo tenemos 2 clases

        self.data = [] # To store every row [Xi, yi]
        
        
        for i in range(len(self.X)):
            for j in range(self.dim):
                # si nunca hemos visto este valor para este atributo antes, 
                # luego lo agregamos a la matriz attrs en la posición correspondiente
                if not self.X[i][j] in self.attrs[j]:
                    self.attrs[j].append(self.X[i][j])
                    
            # si nunca hemos visto esta clase de salida antes,
            # luego lo agregamos a output_dom y contamos una ocurrencia por ahora
            if not self.y[i] in self.output_dom.keys():
                self.output_dom[self.y[i]] = 1
            # de lo contrario, incrementamos la ocurrencia de esta salida en el conjunto de entrenamiento en 1
            else:
                self.output_dom[self.y[i]] += 1
            # almacenar la fila
            self.data.append([self.X[i], self.y[i]])
            
            

    def classify(self, entry):

        solve = None # Resultado final
        max_arg = -1 # máximo parcial

        for y in self.output_dom.keys():

            prob = self.output_dom[y]/self.N # P(y)

            for i in range(self.dim):
                cases = [x for x in self.data if x[0][i] == entry[i] and x[1] == y] # all rows with Xi = xi
                n = len(cases)
                prob *= n/self.N # P *= P(Xi = xi)
                
            # si tenemos una probabilidad mayor para esta salida que el máximo parcial ...
            if prob &gt; max_arg:
                max_arg = prob
                solve = y

        return solve
</code></pre><p>Aquí, asumimos que cada característica tiene un dominio discreto. Eso significa que toman un valor de un conjunto finito de valores posibles.</p><p>Lo mismo ocurre con las clases. Ten en cuenta que almacenamos algunos datos en el método <code>__init__</code> por lo que no es necesario repetir algunas operaciones. La clasificación de una nueva entrada se lleva a cabo en el método <code>classify</code>.</p><blockquote>Este es un ejemplo simple de implementación. En las aplicaciones del mundo real, no necesitas (y es mejor si no creas) tu propia implementación. Por ejemplo, la biblioteca <code>sklearn</code> en Python contiene varias buenas implementaciones de NBC.</blockquote><p>¡Observa lo fácil que es implementarlo!</p><p>Ahora, apliquemos nuestro nuevo clasificador para resolver un problema. Tenemos un conjunto de datos con la descripción de 887 pasajeros en el Titanic. También podemos ver si un pasajero determinado sobrevivió a la tragedia o no.</p><p>Entonces, nuestra tarea es determinar si otro pasajero que no está incluido en el conjunto de entrenamiento lo hizo o no.</p><p>En este ejemplo, usaré la biblioteca de <code>pandas</code> para leer y procesar los datos. No utilizo ninguna otra herramienta.</p><p>Los datos se almacenan en un archivo llamado <em>titanic.csv</em>, por lo que el primer paso es leer los datos y obtener una descripción general.</p><pre><code class="language-python">import pandas as pd

data = pd.read_csv('titanic.csv')

print(data.head())
</code></pre><p>La salida es:</p><pre><code class="language-text">Survived  Pclass                                               Name  \
0         0       3                             Mr. Owen Harris Braund   
1         1       1  Mrs. John Bradley (Florence Briggs Thayer) Cum...   
2         1       3                              Miss. Laina Heikkinen   
3         1       1        Mrs. Jacques Heath (Lily May Peel) Futrelle   
4         0       3                            Mr. William Henry Allen   

      Sex   Age  Siblings/Spouses Aboard  Parents/Children Aboard     Fare  
0    male  22.0                        1                        0   7.2500  
1  female  38.0                        1                        0  71.2833  
2  female  26.0                        0                        0   7.9250  
3  female  35.0                        1                        0  53.1000  
4    male  35.0                        0                        0   8.0500  
</code></pre><p>Observa que tenemos el nombre de cada pasajero. No usaremos esa característica para nuestro clasificador porque no es significativa para nuestro problema. También eliminaremos la característica Fare (tarifa en inglés) porque es continua y nuestras funciones deben ser discretas.</p><blockquote>Hay clasificadores Naive Bayes que admiten caracterísitcas (features) continuas. Por ejemplo, el clasificador Naive Bayes Gausseano.</blockquote><pre><code class="language-python">y = list(map(lambda v: 'yes' if v == 1 else 'no', data['Survived'].values)) # valores objetivo como cadena

# No usaremos el campo 'Nombre'(Name) ni 'Tarifa' (Fare)

X = data[['Pclass', 'Sex', 'Age', 'Siblings/Spouses Aboard', 'Parents/Children Aboard']].values # valores de características
</code></pre><p>Luego, necesitamos separar nuestro conjunto de datos en un conjunto de entrenamiento y un conjunto de validación. El último se utiliza para validar qué tan bien está funcionando nuestro algoritmo.</p><pre><code class="language-python">print(len(y)) # &gt;&gt; 887

# Tomaremos 600 ejemplos para entrenar y el resto para el proceso de validación.
y_train = y[:600]
y_val = y[600:]

X_train = X[:600]
X_val = X[600:]
</code></pre><p>Creamos nuestro NBC con el conjunto de entrenamiento y luego clasificamos cada entrada en el conjunto de validación.</p><p>Medimos la precisión de nuestro algoritmo dividiendo el número de entradas que clasificó correctamente por el número total de entradas en el conjunto de validación.</p><pre><code class="language-python">## Crear la instancia de Naive Bayes Classifier con los datos de entrenamiento

nbc = NaiveBayesClassifier(X_train, y_train)


total_cases = len(y_val) # tamaño del conjunto de validación

# Ejemplos bien clasificados y ejemplos mal clasificados
good = 0
bad = 0

for i in range(total_cases):
    predict = nbc.classify(X_val[i])
#     print(y_val[i] + ' --------------- ' + predict)
    if y_val[i] == predict:
        good += 1
    else:
        bad += 1

print('TOTAL EXAMPLES:', total_cases)
print('RIGHT:', good)
print('WRONG:', bad)
print('ACCURACY:', good/total_cases)
</code></pre><p>La salida:</p><pre><code>TOTAL EXAMPLES: 287
RIGHT: 200
WRONG: 87
ACCURACY: 0.6968641114982579
</code></pre><p>No es genial pero es algo. Podemos obtener una mejora de aproximadamente un 10% en la precisión si eliminamos otras funciones como <em>hermanos / cónyuges a bordo</em> y <em>padres / hijos a bordo.</em></p><p>Puedes ver un cuaderno con el código y el conjunto de datos <a href="https://github.com/josejorgers/naive-bayes-classifier-example">aquí</a>.</p><h2 id="conclusiones">Conclusiones</h2><p>Hoy en día, tenemos redes neuronales y otros algoritmos de ML complejos y costosos por todas partes.</p><p>Los NBC son algoritmos muy sencillos que nos permiten conseguir buenos resultados en algunos problemas de clasificación sin necesidad de muchos recursos. También escalan muy bien, lo que significa que podemos agregar muchas más funciones y el algoritmo seguirá siendo rápido y confiable.</p><p>Incluso en el caso de que los NBC no fueran adecuados para el problema que estábamos tratando de resolver, podrían ser muy útiles como referencia.</p><p>Primero podríamos intentar resolver el problema usando un NBC con unas pocas líneas de código y poco esfuerzo. Luego podríamos intentar lograr mejores resultados con algoritmos más complejos y costosos.</p><p>Este proceso puede ahorrarnos mucho tiempo y nos da una retroalimentación inmediata sobre si los algoritmos complejos realmente valen la pena para nuestra tarea.</p><p>En este artículo, leíste sobre las probabilidades condicionales, la independencia y el teorema de Bayes. Esos son los conceptos matemáticos detrás de los clasificadores Naive Bayes.</p><p>Después de eso, vimos una implementación simple de un NBC y resolvimos el problema de determinar si un pasajero del Titanic sobrevivió al accidente.</p><p>Espero que este artículo te haya resultado útil. Puedes leer sobre temas relacionados con la informática en mi <a href="https://jj.hashnode.dev/">blog personal</a> y siguiéndome en <a href="https://twitter.com/josejorgexl">Twitter</a>.</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/jose/">Jose J. Rodríguez</a> - <a href="https://www.freecodecamp.org/news/how-naive-bayes-classifiers-work/">How Naive Bayes Classifiers Work – with Python Code Examples</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 8 algoritmos de agrupación en clústeres en el aprendizaje automático que todos los científicos de datos deben conocer ]]>
                </title>
                <description>
                    <![CDATA[ ‌‌Hay tres enfoques diferentes para aprendizaje automático, según los datos que tengas. Puedes optar por el aprendizaje supervisado, el aprendizaje semi-supervisado o el aprendizaje no supervisado. En el aprendizaje supervisado, tienes datos etiquetados, por lo que tienes salidas para las que sabes con certeza cuáles son los valores correctos para ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/8-algoritmos-de-agrupacion-en-clusteres-en-el-aprendizaje-automatico-que-todos-los-cientificos-de-datos-deben-conocer/</link>
                <guid isPermaLink="false">60390500bf5f3509ae10fb21</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carlos Manjarrés Betancourt ]]>
                </dc:creator>
                <pubDate>Sat, 24 Apr 2021 05:42:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/analysis-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>‌‌Hay tres enfoques diferentes para aprendizaje automático, según los datos que tengas. Puedes optar por el aprendizaje supervisado, el aprendizaje semi-supervisado o el aprendizaje no supervisado.</p><p>En el aprendizaje supervisado, tienes datos etiquetados, por lo que tienes salidas para las que sabes con certeza cuáles son los valores correctos para sus entradas. Es como saber los precios de los automóviles en función de características como marca, modelo, estilo, transmisión y otros atributos.</p><p>Con el aprendizaje semi-supervisado, tienes un gran conjunto de datos donde algunos de los datos están etiquetados pero la mayoría no.</p><p>Esto cubre una gran cantidad de datos del mundo real porque puede resultar costoso conseguir que un experto etiquete cada uno de los datos. Puedes solucionar este problema utilizando una combinación de aprendizaje supervisado y no supervisado.</p><p>El aprendizaje no supervisado significa que tienes un conjunto de datos sin ninguna etiqueta. No sabes si hay patrones ocultos en los datos, así que dejas que el algoritmo encuentre todo lo que pueda.</p><p>Ahí es donde entran en juego los algoritmos de agrupamiento. Es uno de los métodos que puedes utilizar en un problema de aprendizaje no supervisado.</p><h2 id="-qu-son-los-algoritmos-de-agrupamiento"><strong>¿</strong>Qué <strong>son los algoritmos de agrupamiento?</strong></h2><p>El agrupamiento es una tarea de aprendizaje automático no supervisada. Es posible que también lo hayas escuchado como análisis de agrupación debido a la forma en que funciona este método.</p><p>El uso de un algoritmo de agrupamiento significa que le darás al algoritmo una gran cantidad de datos de entrada sin etiquetas y te permitirá encontrar cualquier agrupación en los datos que se pueda.</p><p>Esas agrupaciones se denominan agrupaciones. Una agrupación es un grupo de datos que son similares entre sí en función de su relación con los datos circundantes. El agrupamiento se utiliza para cosas tales como la ingeniería de características o el descubrimiento de patrones.</p><p>Cuando empiezas con datos de los que no sabes nada, el agrupamiento puede ser un buen punto de partida para obtener información.</p><h2 id="tipos-de-algoritmos-de-agrupamiento"><strong>Tipos de algoritmos de agrupamiento</strong></h2><p>Existen diferentes tipos de algoritmos de agrupamiento que manejan todo tipo de datos únicos.</p><h3 id="basado-en-densidad"><strong>Basado en densidad</strong></h3><p>En el agrupamiento basado en densidad, los datos se agrupan por áreas de altas concentraciones de puntos de datos rodeadas por áreas de bajas concentraciones de puntos de datos. Básicamente, el algoritmo encuentra los lugares que son densos en puntos de datos y los llama grupos.</p><p>Lo bueno de esto es que los grupos pueden tener cualquier forma. No estás limitado a condiciones esperadas.</p><p>Los algoritmos de agrupamiento de este tipo no tienen en cuenta los valores atípicos en los grupos, por lo que se ignoran.</p><h3 id="basado-en-la-distribuci-n"><strong>Basado en la </strong>distribución</h3><p>Con un enfoque de agrupamiento basado en la distribución, se considera que todos los puntos de datos forman parte de un grupo según la probabilidad de que un punto pertenezca a un grupo determinado.‌‌</p><p>Funciona así: hay un punto central y, a medida que aumenta la distancia de un punto de datos desde el centro, la probabilidad de que forme parte de ese grupo disminuye.</p><p>‌‌Si no estás seguro de cuál podría ser la distribución de tus datos, deberías considerar un tipo diferente de algoritmo.</p><h3 id="basado-en-centroides"><strong>Basado en Centroides</strong></h3><p>El agrupamiento basado en centroides es la que probablemente has escuchado más. Es algo sensible a los parámetros iniciales que le das, pero es rápida y eficiente.</p><p>Estos tipos de algoritmos separan puntos de datos en función de múltiples centroides en los datos. Cada punto de datos se asigna a un grupo en función de su distancia al cuadrado del centroide. Este es el tipo de agrupación más utilizado.</p><h3 id="basado-en-jerarqu-as"><strong>Basado en </strong>Jerarquías</h3><p>El agrupamiento basado en jerarquías se utiliza normalmente en datos jerárquicos, como los que obtendrías de la base de datos de una empresa o de taxonomías. Construye un árbol de grupos para que todo esté organizado de arriba hacia abajo.</p><p>Esto es más restrictivo que los otros tipos de agrupamiento, pero es perfecto para tipos específicos de conjuntos de datos.</p><h2 id="cuando-usar-agrupamiento"><strong>Cuando usar </strong>agrupamiento</h2><p>Cuando tienes un conjunto de datos sin etiquetar, es muy probable que utilices algún tipo de algoritmo de aprendizaje sin supervisión.</p><p>Hay muchas técnicas diferentes de aprendizaje no supervisado, como redes neuronales, aprendizaje por refuerzo y agrupamiento. El tipo específico de algoritmo que quieres utilizar dependerá de cómo se vean tus datos.</p><p>Es posible que quieras utilizar agrupamiento cuando intentas detectar anomalías para encontrar valores atípicos en tus datos. El agrupamiento ayuda a encontrar esos grupos y muestra los límites que determinarían si un punto de datos es un valor atípico o no.</p><p>Si no estás seguro de qué características usar para tu modelo de aprendizaje automático, el agrupamiento descubre patrones que puedes usar para descubrir qué se destaca en los datos.</p><p>El agrupamiento es especialmente útil para explorar datos de los que no sabes nada. Puede llevar algún tiempo averiguar qué tipo de algoritmo de agrupamiento funciona mejor, pero cuando lo hagas, obtendrás información invaluable sobre tus datos. Es posible que encuentres conexiones en las que nunca hubieras pensado.</p><p>Algunas aplicaciones del mundo real del agrupamiento incluyen la detección de fraudes en seguros, la categorización de libros en una biblioteca y la segmentación de clientes en mercadeo. También se puede utilizar en problemas más grandes, como análisis de terremotos o planificación urbana.</p><h2 id="los-ocho-mejores-algoritmos-de-agrupamiento"><strong>Los Ocho Mejores Algoritmos de Agrupamiento</strong></h2><p>Ahora que tienes algunos antecedentes sobre cómo funcionan los algoritmos de agrupamiento y los diferentes tipos disponibles, podemos hablar sobre los algoritmos que verás comúnmente en la práctica.</p><p>Implementaremos estos algoritmos en un conjunto de datos de ejemplo de la biblioteca <a href="https://scikit-learn.org/stable/">sklearn en Python</a>.</p><p>Usaremos el conjunto de datos <em>make_classification</em> de la biblioteca sklearn para demostrar cómo los diferentes algoritmos de agrupamiento no son adecuados para todos los problemas de agrupamiento.</p><p>Puedes encontrar <a href="https://github.com/flippedcoder/probable-waddle">el código para todos los siguientes ejemplos aquí</a>.</p><h3 id="algoritmo-de-agrupamiento-k-means"><strong>Algoritmo de agrupamiento <strong>K-means</strong></strong></h3><p>El agrupamiento de K-means es el algoritmo de agrupamiento más utilizado. Es un algoritmo basado en centroides y es el algoritmo de aprendizaje no supervisado más simple.</p><p>Este algoritmo intenta minimizar la varianza de los puntos de datos dentro de un grupo. También es la forma en que la mayoría de las personas se familiarizan con el aprendizaje automático sin supervisión.</p><p>K-means se usa mejor en conjuntos de datos más pequeños porque itera sobre <em>todos</em> los puntos de datos. Eso significa que tomará más tiempo clasificar los puntos de datos si hay una gran cantidad de ellos en el conjunto de datos.</p><p>Dado que así es como k-means agrupa los puntos de datos, no se escala bien.</p><p><strong><strong>Implementa</strong>c<strong>i</strong>ó<strong>n:</strong></strong></p><pre><code class="language-python">from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import KMeans

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
kmeans_model = KMeans(n_clusters=2)

# Entrenar el modelo
kmeans_model.fit(training_data)

# asignar cada punto de datos a un grupo
kmeans_result = kmeans_model.predict(training_data)

# obtener todos los grupos únicos
kmeans_clusters = unique(kmeans_result)

# graficar los grupos KMeans
for kmeans_cluster in kmeans_clusters:
    # get data points that fall in this cluster
    index = where(kmeans_result == kmeans_cluster)
    # make the plot
    pyplot.scatter(training_data[index, 0], training_data[index, 1])
    print(index)

# mostrar el gráfico K-means
pyplot.show()</code></pre><h3 id="algoritmo-de-agrupamiento-dbscan"><strong>Algoritmo de agrupamiento DBSCAN</strong></h3><p>DBSCAN significa agrupamiento espacial basado en densidad de aplicaciones con ruido. Es un algoritmo de agrupamiento basado en densidad, a diferencia de k-means.</p><p>Este es un buen algoritmo para encontrar esquemas en un conjunto de datos. Encuentra grupos de forma arbitraria en función de la densidad de puntos de datos en diferentes regiones. Separa las regiones por áreas de baja densidad para poder detectar valores atípicos entre los grupos de alta densidad.</p><p>Este algoritmo es mejor que el k-means cuando se trata de trabajar con datos que tienen formas extrañas.</p><p>DBSCAN utiliza dos parámetros para determinar cómo se definen los grupos: <em>minPts</em> (el número mínimo de puntos de datos que deben agruparse para que un área se considere de alta densidad) y <em>eps</em> (la distancia utilizada para determinar si un punto de datos está en la misma área que otros puntos de datos).</p><p>La elección de los parámetros iniciales adecuados es fundamental para que este algoritmo funcione.</p><p><strong><strong>Implementa</strong>c<strong>i</strong>ó<strong>n:</strong></strong></p><pre><code class="language-python">from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import DBSCAN

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
dbscan_model = DBSCAN(eps=0.25, min_samples=9)

# entrenar el modelo
dbscan_model.fit(training_data)

# asignar cada punto de datos a un grupo
dbscan_result = dbscan_model.fit_predict(training_data)

# obtener todos los grupos únicos
dbscan_clusters = unique(dbscan_result)

# graficar el DBSCAN de grupos
for dbscan_cluster in dbscan_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(dbscan_result == dbscan_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico DBSCAN
pyplot.show()</code></pre><h3 id="algoritmo-de-mezcla-gaussiana"><strong>Algoritmo de Mezcla Gaussiana</strong></h3><p>Uno de los problemas con k-means es que los datos deben seguir un formato circular. La forma en que k-means calcula la distancia entre puntos de datos tiene que ver con una ruta circular, por lo que los datos no circulares no se agrupan correctamente.</p><p>Este es un problema que corrigen los modelos de mezcla Gaussianos. No necesitas datos con forma circular para que funcione bien.</p><p>El modelo de mezcla Gaussiana utiliza múltiples distribuciones Gaussianas para ajustar datos que tienen formas arbitrarias.</p><p>Hay varios modelos Gaussianos únicos que actúan como capas ocultas en este modelo híbrido. Entonces, el modelo calcula la probabilidad de que un punto de datos pertenezca a una distribución Gaussiana específica y ese es el grupo en el que se ubicará.</p><p><strong><strong>Implementa</strong>c<strong>i</strong>ó<strong>n:</strong></strong></p><pre><code class="language-python">from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.mixture import GaussianMixture

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
gaussian_model = GaussianMixture(n_components=2)

# entrenar el modelo
gaussian_model.fit(training_data)

# asignar cada punto de datos a un grupo
gaussian_result = gaussian_model.predict(training_data)

# obtener todos los grupos únicos
gaussian_clusters = unique(gaussian_result)

# graficar los grupos de Mezcla Gaussiana
for gaussian_cluster in gaussian_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(gaussian_result == gaussian_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico de Mezcla Gaussiana
pyplot.show()</code></pre><h3 id="algoritmo-birch"><strong>Algoritmo <strong>BIRCH</strong></strong></h3><p>El algoritmo de Equilibrio Iterativo de Reducción y Agrupación mediante Jerarquías o Balance Iterative Reducing and Clustering using Hierarchies (BIRCH) por sus siglas en inglés, funciona mejor en &nbsp;grandes conjuntos de datos que el algoritmo k-means.</p><p>Divide los datos en pequeños resúmenes que se agrupan en lugar de los puntos de datos originales. Los resúmenes contienen tanta información sobre la distribución de los puntos de datos como sea posible.</p><p>Este algoritmo se usa comúnmente con otros algoritmos de agrupamiento porque las otras técnicas de agrupamiento se pueden usar en los resúmenes generados por BIRCH.</p><p>La principal desventaja del algoritmo BIRCH es que solo funciona con datos numéricos. No puedes usar BIRCH para valores categóricos a menos que realices algunas transformaciones de datos.</p><p><strong><strong>Implementa</strong>c<strong>i</strong>ó<strong>n:</strong></strong></p><pre><code class="language-python">from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import Birch

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# defnir el modelo
birch_model = Birch(threshold=0.03, n_clusters=2)

# entrenar el modelo
birch_model.fit(training_data)

# asignar cada punto de datos a un grupo
birch_result = birch_model.predict(training_data)

# obtener todos los grupos únicos
birch_clusters = unique(birch_result)

# graficar los grupos BIRCH
for birch_cluster in birch_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(birch_result == birch_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico BIRCH
pyplot.show()</code></pre><h3 id="algoritmo-de-agrupamiento-por-propagaci-n-de-afinidad"><strong>Algoritmo de agrupamiento por Propagación de Afinidad</strong></h3><p><br>Este algoritmo de agrupamiento es completamente diferente de los demás en la forma en que agrupa los datos.</p><p>Cada punto de datos se comunica con todos los demás puntos de datos para que los demás sepan qué tan similares son y eso comienza a revelar los grupos en los datos. No tienes que decirle a este algoritmo cuántos grupos esperar en los parámetros de inicialización.</p><p>A medida que se envían mensajes entre puntos de datos, se encuentran conjuntos de datos llamados <em>ejemplares</em> que representan los grupos.</p><p>Se encuentra un ejemplar después de que los puntos de datos se hayan transmitido mensajes entre sí y formen un consenso sobre qué punto de datos representa mejor un grupo.</p><p>Cuando no estás seguro de cuántos grupos esperar, como en un problema de visión por computadora, este es un gran algoritmo para comenzar.</p><p><strong><strong>Implementa</strong>c<strong>i</strong>ó<strong>n:</strong></strong>‌</p><pre><code class="language-python">from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import AffinityPropagation

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
affinity_model = AffinityPropagation(damping=0.7)

# entrenar el modelo
affinity_model.fit(training_data)

# asignar cada punto de datos a un grupo
affinity_result = affinity_model.predict(training_data)

# obtener todos los grupos únicos
affinity_clusters = unique(affinity_result)

# graficar los grupos
for affinity_cluster in affinity_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(affinity_result == affinity_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico
pyplot.show()</code></pre><h3 id="algoritmo-de-agrupamiento-de-desplazamiento-medio"><strong>Algoritmo de agrupamiento de Desplazamiento Medio</strong></h3><p><br>Este es otro algoritmo que es particularmente útil para manejar imágenes y procesamiento de visión por computadora.</p><p>El desplazamiento medio es similar al algoritmo BIRCH porque también encuentra grupos sin que se establezca un número inicial de grupos.</p><p>Este es un algoritmo de agrupamiento jerárquico, pero la desventaja es que no escala bien cuando se trabaja con grandes conjuntos de datos.</p><p>Funciona iterando sobre todos los puntos de datos y los desplaza hacia la moda. La moda en este contexto es el área de alta densidad de puntos de datos en una región.</p><p>Es por eso que es posible que escuches que se hace referencia a este algoritmo como el algoritmo de búsqueda de moda. Cada punto de datos pasará por este proceso iterativo y los moverá más cerca de donde están otros puntos de datos hasta que todos los puntos de datos hayan sido asignados a un grupo.</p><p><strong><strong>Implementation:</strong></strong></p><pre><code class="language-python">from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import MeanShift

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
mean_model = MeanShift()

# asignar cada punto de datos a un grupo
mean_result = mean_model.fit_predict(training_data)

# obtener todos los grupos únicos
mean_clusters = unique(mean_result)

# graficar los grupos de Deszplazamiento Medio
for mean_cluster in mean_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(mean_result == mean_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico de Deszplazamiento Medio
pyplot.show()</code></pre><h3 id="algoritmo-optics"><strong>Algoritmo <strong>OPTICS</strong></strong></h3><p><br>OPTICS significa Ordenar Puntos para Identificar la Estructura de Agrupamiento ú Ordering Points to Identify the Clustering Structure por sus siglas en inglés. Es un algoritmo basado en densidad similar a DBSCAN, pero es mejor porque puede encontrar agrupaciones significativas en datos que varían en densidad. Lo hace ordenando los puntos de datos de modo que los puntos más cercanos sean vecinos en el ordenamiento.</p><p>Esto facilita la detección de diferentes grupos de densidad. El algoritmo OPTICS solo procesa cada punto de datos una vez, similar a DBSCAN (aunque se ejecuta más lento que DBSCAN). También hay una distancia especial almacenada para cada punto de datos que indica que un punto pertenece a un grupo específico.</p><p><strong><strong>Implementa</strong>ció<strong>n:</strong></strong></p><pre><code class="language-python">from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import OPTICS

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
optics_model = OPTICS(eps=0.75, min_samples=10)

# asignar cada punto de datos a un grupo
optics_result = optics_model.fit_predict(training_data)

# obtener todos los grupos únicos
optics_clusters = unique(optics_result)

# graficar los grupos OPTICS
for optics_cluster in optics_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(optics_result == optics_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico OPTICS
pyplot.show()</code></pre><h3 id="algoritmo-de-agrupamiento-de-jerarqu-a-aglomerativa"><strong>Algoritmo de agrupamiento de Jerarquía Aglomerativa</strong></h3><p><br>Este es el tipo más común de algoritmo de agrupamiento jerárquico. Se utiliza para agrupar objetos en grupos en función de su similitud entre sí.</p><p>Esta es una forma de agrupamiento de abajo hacia arriba, donde cada punto de datos se asigna a su propio grupo. Luego, esos grupos se unen.</p><p>En cada iteración, los grupos similares se fusionan hasta que todos los puntos de datos forman parte de un gran grupo raíz.</p><p>La agrupación aglomerativa es mejor para encontrar agrupaciones pequeñas. El resultado final parece un dendrograma para que puedas visualizar fácilmente los grupos cuando el algoritmo termina.</p><p><strong><strong>Implementa</strong>ció<strong>n:</strong></strong></p><pre><code class="language-python">from numpy import unique
from numpy import where
from matplotlib import pyplot
from sklearn.datasets import make_classification
from sklearn.cluster import AgglomerativeClustering

# inicializar el conjunto de datos con el que trabajaremos
training_data, _ = make_classification(
    n_samples=1000,
    n_features=2,
    n_informative=2,
    n_redundant=0,
    n_clusters_per_class=1,
    random_state=4
)

# definir el modelo
agglomerative_model = AgglomerativeClustering(n_clusters=2)

# asignar cada punto de datos a un grupo
agglomerative_result = agglomerative_model.fit_predict(training_data)

# obtener todos los grupos únicos
agglomerative_clusters = unique(agglomerative_result)

# graficar los grupos
for agglomerative_cluster in agglomerative_clusters:
    # obtener todos los puntos de datos que caen en este grupo
    index = where(agglomerative_result == agglomerative_cluster)
    # hacer el gráfico
    pyplot.scatter(training_data[index, 0], training_data[index, 1])

# mostrar el gráfico de Jerarquía Aglomerativa
pyplot.show()</code></pre><h2 id="otros-tipos-de-algoritmos-de-agrupamiento"><strong>Otros tipos de algoritmos de agrupamiento</strong></h2><p>Hemos cubierto ocho de los principales algoritmos de agrupamiento, pero hay muchos más disponibles. Hay algunos algoritmos de agrupamiento ajustados de manera muy específica que manejan tus datos de manera rápida y precisa. Estos son algunos de los otros que podrían ser de tu interés.</p><p>Hay otro algoritmo jerárquico que es lo opuesto al enfoque aglomerativo. Comienza con una estrategia de agrupación de arriba hacia abajo. Por lo tanto, comenzará con un gran grupo raíz y dividirá los grupos individuales a partir de ahí.</p><p>Esto se conoce como algoritmo de agrupamiento <strong>Jerárquico Divisivo</strong>. Hay investigaciones que muestran que esto crea jerarquías más precisas que el agrupamiento aglomerativo, pero es mucho más complejo.</p><p>El <strong>K-means en Mini Lotes</strong> es similar a K-means, excepto que utiliza pequeños fragmentos aleatorios de datos de un tamaño fijo para que puedan almacenarse en la memoria. Esto lo ayuda a ejecutarse más rápido que el K-means para que converja en una solución en menos tiempo.</p><p>El inconveniente de este algoritmo es que el aumento de velocidad le costará algo de calidad a los grupos.</p><p>El último algoritmo que cubriremos brevemente es el <strong>Agrupamiento Espectral</strong>. Este algoritmo es completamente diferente a los otros que hemos visto.</p><p>Funciona aprovechando la teoría de grafos. Este algoritmo no hace ninguna conjetura inicial sobre los grupos que se encuentran en el conjunto de datos. Trata los puntos de datos como nodos en un gráfico y los grupos se encuentran a base de comunidades de nodos que se conectan por los bordes.</p><h2 id="otros-pensamientos"><strong>Otros pensamientos</strong></h2><p><br>Ten cuidado con los problemas de escalado con los algoritmos de agrupamiento. Tu conjunto de datos podría tener millones de puntos de datos y, dado que los algoritmos de agrupamiento funcionan calculando las similitudes entre todos los pares de puntos de datos, es posible que termines con un algoritmo que no se escala bien.</p><h2 id="conclusi-n"><strong><strong>Conclusi</strong>ó<strong>n</strong></strong></h2><p>Los algoritmos de agrupamiento son una excelente manera de aprender cosas nuevas a partir de datos antiguos. A veces te sorprenderán los grupos resultantes que obtendrás y podrían ayudarte a entender un problema.</p><p>Una de las cosas más interesantes de utilizar el agrupamiento para el aprendizaje no supervisado es que puedes utilizar los resultados en un problema de aprendizaje supervisado.</p><p>¡Los grupos podrían ser tus nuevas características que uses en un conjunto de datos completamente diferente! Puedes utilizar el agrupamiento en casi cualquier problema de aprendizaje automático sin supervisión, pero asegúrate de saber cómo analizar los resultados para garantizar la precisión.</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/"><strong>Milecia McGregor</strong> <strong>- 8 Clustering Algorithms in Machine Learning that All Data Scientists Should Know</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Una descripción general del algoritmo descenso de gradiente ]]>
                </title>
                <description>
                    <![CDATA[ by Nishit Jain El algoritmo sutil, pero poderoso que optimiza parámetros La optimización de parámetros es el objetivo final de todo algoritmo de aprendizaje automático. Quieres obtener el valor óptimo de la pendiente y el intercepto para encontrar la línea que mejor se ajuste en los problemas de regresión lineal. ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/una-descripcion-general-del-algoritmo-descenso-de-gradiente/</link>
                <guid isPermaLink="false">6038fedcbf5f3509ae10fae6</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carlos Manjarrés Betancourt ]]>
                </dc:creator>
                <pubDate>Tue, 20 Apr 2021 06:47:17 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/1_fp0t2D3aV_oHb6a94fp5Zg-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>by Nishit Jain</p><h4 id="el-algoritmo-sutil-pero-poderoso-que-optimiza-par-metros">El algoritmo sutil, pero poderoso que optimiza parámetros</h4><p>La optimización de parámetros es el objetivo final de todo algoritmo de aprendizaje automático. Quieres obtener el valor óptimo de la pendiente y el intercepto para encontrar la línea que mejor se ajuste en los problemas de regresión lineal. También quieres obtener el valor óptimo para los parámetros de una curva sigmoidea en problemas de regresión logística. ¿Y si te dijera que el Descenso de Gradiente lo hace todo?</p><p>Traducido del artículo de Nishit Jain - <a href="https://www.freecodecamp.org/news/an-overview-of-the-gradient-descent-algorithm-8645c9e4de1e/">An overview of the Gradient Descent algorithm</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Curso intensivo de Python NumPy: Como construir arreglos n-dimensionales para aprendizaje automático ]]>
                </title>
                <description>
                    <![CDATA[ NumPy es una biblioteca de Python para realizar cálculos numéricos a gran escala. Es extremadamente útil, especialmente en aprendizaje automático. Veamos lo que Numpy tiene para ofrecer. Introducción a NumPy NumPy  es una biblioteca de Python utilizada para realizar cálculos numéricos con grandes conjuntos de datos. El nombre significa numérico ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/curso-intensivo-de-python-numpy-como-construir-arreglos-n-dimensionales-para-aprendizaje-automatico/</link>
                <guid isPermaLink="false">60046883a4e0700982a9e531</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Luis Alberto Sinisterra Muñoz ]]>
                </dc:creator>
                <pubDate>Sat, 10 Apr 2021 04:46:17 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/numpy-1-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>NumPy es una biblioteca de Python para realizar cálculos numéricos a gran escala. Es extremadamente útil, especialmente en aprendizaje automático. Veamos lo que Numpy tiene para ofrecer.</p><h1 id="introducci-n-a-numpy"><strong>Introducción a<strong> N</strong>u<strong>mPy</strong></strong></h1><p>NumPy &nbsp;es una biblioteca de Python utilizada para realizar cálculos numéricos con grandes conjuntos de datos. El nombre significa numérico y es una biblioteca popular utilizada por los científicos de datos, especialmente para problemas de aprendizaje automático.</p><p>NumPy &nbsp;es útil al preprocesar los datos antes de entrenarlos utilizando un algoritmo de aprendizaje automático.</p><p>Trabajar con arreglos n-dimensionales es más fácil en Numpy en comparacion con las listas de Python. Los arreglos Numpy son también más rápidos que las listas de Python, ya que, a diferencia de, los arreglos de Numpy se almacenan en un lugar continuo en la memoria. Esto permite que el procesador realice cálculos de manera eficiente</p><p>En este artículo, Veremos los conceptos básicos para trabajar con NumPy incluyendo operaciones con arreglos, transformación de matrices, generación de valores aleatorios, etcétera.</p><h1 id="instalaci-n">Instalación</h1><p>Se proporcionan instrucciones claras de instalación en el sitio web oficial de Numpy, Así que &nbsp;no las repetiré en este artículo. <a href="https://numpy.org/install/" rel="noopener nofollow"> Encuentra las instrucciones aquí</a>.</p><h1 id="trabajando-con-numpy"><strong>Trabajando con Numpy</strong></h1><h2 id="importando-numpy"><strong><strong>Import</strong>ando<strong> NumPy</strong></strong></h2><p>Para comenzar a usar Numpy en su script, tienes que importarlo.</p><pre><code>import numpy as np</code></pre><h2 id="convirtiendo-arreglos-en-arreglos-numpy"><strong><strong>Conv</strong>irtiendo<strong> </strong>a<strong>rr</strong>eglos<strong> </strong>en<strong> </strong>arreglos <strong>NumPy </strong></strong></h2><p>Puedes convertir tus listas de Python existentes en arreglos Numpy usando el método &nbsp;np.array(), así:</p><pre><code>arreglo = [1,2,3]
np.array(arreglo)</code></pre><p>Esto también aplica para arreglos multi-dimensionales. NumPy realizará un seguimiento de la forma (dimensiones) del arreglo .</p><pre><code>arreglo_anidado = [[1,2],[3,4],[5,6]]
np.array(arreglo_anidado)</code></pre><h2 id="funci-n-numpy-arrange"><strong>Función <strong>NumPy </strong>a<strong>rrange </strong></strong></h2><p>Al trabajar con datos, a menudo te encontrarás con casos de uso donde necesites generar datos.</p><p>NumPy tiene un método &nbsp;“arrange()” con el que puedes generar un rango de valores entre 2 números. La función arrange toma el inicio, el final y un parámetro de distancia opcional.</p><pre><code>print(np.arrange(0,10)) # Sin parametro de distancia
OUTPUT:[0 1 2 3 4 5 6 7 8 9]

print(np.arrange(0,10,2)) # con parametro de distancia
OUTPUT: [0 2 4 6 8]</code></pre><h2 id="ceros-y-unos"><strong>Ceros y unos </strong></h2><p>Tú también puedes generar un arreglo o matriz de ceros y unos usando Numpy (créeme, lo necesitarás). Así es como funciona.</p><pre><code>print(np.zeros(3))
OUTPUT: [0. 0. 0.]

print(np.ones(3))
OUTPUT: [1. 1. 1.]</code></pre><p>Ambas &nbsp;funciones también admiten n-dimensionales. Puedes agregar la forma como una tupla con filas y columnas.</p><pre><code>print(np.zeros((4,5)))
OUTPUT:
[
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
]

print(np.ones((4,5)))
OUTPUT:
[
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
]</code></pre><h2 id="matriz-de-identidad"><strong>Matriz de identidad</strong></h2><p>También puedes generar una matriz de identidad usando una función incorporada en Numpy llamada “eye”.</p><pre><code>np.eye(5)
OUTPUT:
[[1., 0., 0., 0., 0.]
[0., 1., 0., 0., 0.]
[0., 0., 1., 0., 0.]
[0., 0., 0., 1., 0.]
[0., 0., 0., 0., 1.]]</code></pre><h2 id="funci-n-numpy-linspace"><strong>Función <strong>NumPy </strong>l<strong>inspace </strong></strong></h2><p>NumPy tiene el método linspace que genera puntos uniformemente espaciados entre dos números.</p><pre><code>print(np.linspace(0,10,3))
OUTPUT:[ 0.  5. 10.]</code></pre><p>En el ejemplo de arriba, el primer y segundo parámetro son los puntos inicial y final, mientras que el tercer parámetro es el número de puntos que necesitas entre el inicio y el final.</p><p>Aquí está el mismo rango con 20 puntos.</p><pre><code>print(np.linspace(0,10,20))
OUTPUT:[ 0. 0.52631579  1.05263158  1.57894737  2.10526316  2.63157895   3.15789474  3.68421053  4.21052632  4.73684211  5.26315789  5.78947368   6.31578947  6.84210526  7.36842105  7.89473684  8.42105263  8.94736842   9.47368421 10.]</code></pre><h2 id="generaci-n-de-n-meros-aleatorios">Generación de Números Aleatorios</h2><p>Cuando trabajes en problemas de aprendizaje automático, a menudo necesitarás generar números aleatorios. NumPy también tiene funciones integradas para eso.</p><p> Pero antes de comenzar a generar números aleatorios, veamos dos tipos principales de distribuciones.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/09/distro-1.png" class="kg-image" alt="distro-1" width="600" height="400" loading="lazy"></figure><h3 id="distribuci-n-normal"><strong>Distribución Normal</strong></h3><p>En una &nbsp;<a href="https://www.mathsisfun.com/data/standard-normal-distribution.html">distribución normal estándar</a>, los valores alcanzan su punto máximo.</p><p>La distribución normal es un concepto muy importante en estadística, ya que se ve en muchos fenómenos naturales. También se le llama "curva de campana".</p><h3 id="distribuci-n-uniforme"><strong>Distribución Uniforme</strong></h3><p>Si los valores de la distribución tienen la probabilidad como una constante, se llama <a href="https://www.investopedia.com/terms/u/uniform-distribution.asp">distribución uniforme</a>. </p><p>Por ejemplo, el lanzamiento de una moneda tiene una distribución uniforme, ya que la probabilidad de obtener cara o cruz en un lanzamiento de moneda es la misma.</p><p>Ahora que sabes cómo funcionan las dos distribuciones principales, generemos algunos números aleatorios.</p><ul><li>Para generar números aleatorios en una distribución uniforme, usa la función rand () de <strong><strong><strong><strong>np.random</strong></strong></strong></strong>:</li></ul><pre><code>print(np.random.rand(10)) # arreglo
OUTPUT: [0.46015141 0.89326339 0.22589334 0.29874476 0.5664353  0.39257603  0.77672998 0.35768031 0.95087408 0.34418542]

print(np.random.rand(3,4)) # matriz 3x4
OUTPUT:[[0.63775985 0.91746663 0.41667645 0.28272243]  [0.14919547 0.72895922 0.87147748 0.94037953]  [0.5545835  0.30870297 0.49341904 0.27852723]]</code></pre><ul><li>Para generar números aleatorios en una distribución normal, use la función randn () <strong><strong><strong><strong>np.random</strong></strong></strong></strong>:</li></ul><pre><code>print(np.random.randn(10))
OUTPUT:[-1.02087155 -0.75207769 -0.22696798  0.86739858  0.07367362 -0.41932541   0.86303979  0.13739312  0.13214285  1.23089936]

print(np.random.randn(3,4))
OUTPUT: [[ 1.61013773  1.37400445  0.55494053  0.23133522]  [ 0.31290971 -0.30866402  0.33093618  0.34868954]  [-0.11659865 -1.22311073  0.36676476  0.40819545]]</code></pre><ul><li>Para generar enteros aleatorios entre un valor inferior y superior, use la función randint () de <strong><strong><strong><strong>np.random</strong></strong></strong></strong>:</li></ul><pre><code>print(np.random.randint(1,100,10))
OUTPUT:[64 37 62 27  4 33 23 52 70  7]

print(np.random.randint(1,100,(2,3)))
OUTPUT:[[92 42 38]  [87 69 38]]</code></pre><p>Se utiliza un <a href="https://en.wikipedia.org/wiki/Random_seed">valor inicial</a> (semilla) si desea que sus números aleatorios sean los mismos durante cada cálculo. Así es como se establece un valor inicial en NumPy.</p><ul><li>Para establecer un valor inicial en NumPy, haz lo siguiente:</li></ul><pre><code>np.random.seed(42)
print(np.random.rand(4))
OUTPUT:[0.37454012, 0.95071431, 0.73199394, 0.59865848]</code></pre><p>Siempre que uses un número de semilla, siempre obtendrás el mismo arreglo generado sin ningún cambio.</p><h2 id="remodelaci-n-de-arreglos"><strong>Remodelación de Arreglos</strong></h2><p>Como científico de datos, trabajarás para reorganizar los conjuntos de datos para diferentes tipos de cálculos. En esta sección, veremos cómo trabajar con las formas de arreglos.</p><ul><li>Para obtener la forma de un arreglo, use la propiedad de <strong>shape</strong></li></ul><pre><code>arreglo = np.random.rand(2,2)
print(arreglo)
print(arreglo.shape)
OUTPUT:[
[0.19890857 0.00806693]
[0.48199837 0.55373954]
]
(2, 2)</code></pre><ul><li>Para reorganizar un arreglo, use la función &nbsp;<strong><strong><strong><strong>reshape()</strong></strong></strong></strong>.</li></ul><pre><code>print(arreglo.reshape(1,4))
OUTPUT: [[0.19890857 0.00806693 0.48199837 0.55373954]]
print(arreglo.reshape(4,1))
OUTPUT:[
[0.19890857]
[0.00806693]
[0.48199837]
[0.55373954]
]</code></pre><p>Para reorganizar permanentemente un arreglo, debe asignar el arreglo reorganizado a la variable "arreglo"</p><p>Además, la reorganización solo funciona si la estructura existente tiene sentido. No puede reorganizar una matriz de 2x2 en una matriz de 3x1.</p><h2 id="datos-de-corte"><strong>Datos de Corte</strong></h2><p>Veamos como obtener datos de arreglos. Los arreglos Numpy trabajan de manera similar a las listas en Python durante las oraciones de recuperación de datos. &nbsp;</p><ul><li>Para cortar un arreglo, haz esto:</li></ul><pre><code>miarreglo = np.arange(0,11)
print(miarreglo)
OUTPUT:[ 0  1  2  3  4  5  6  7  8  9 10]

cortado = miarreglo[0:5]
print(cortado)
OUTPUT: [0 1 2 3 4]

cortado[:] = 99
print(cortado)
OUTPUT: [99 99 99 99 99]

print(miarreglo)
OUTPUT:[99 99 99 99 99  5  6  7  8  9 10]</code></pre><p>Si observas el ejemplo anterior, aunque asignamos el segmento de "miarreglo" a la variable "cortado", el cambio del valor de "cortado" afecta al arreglo original. Esto se debe a que el "la parte cortada" solo apuntaba al arreglo original.</p><p>Para hacer una sección independiente de una arreglo, use la función <strong>copy ()</strong>.</p><pre><code> cortado = miarreglo.copy()[0:5]</code></pre><ul><li>Cortar arreglos multidimensionales funciona de manera similar a los arreglos unidimensionales</li></ul><pre><code>mi_arreglo = np.random.randint(1,30,(3,3))
print(mi_arreglo)
OUTPUT: [
[21  1 20]
[22 16 27]
[24 14 22]
]

print(mi_arreglo[0]) # imprime una sola fila
OUTPUT: [21  1 20]

print(mi_arreglo[0][0]) # imprime un solo valor o fila 0, columna 0
OUTPUT: 21

print(mi_arreglo[0,0]) #forma alternativa de imprimir valor de la  fila0,colu0
OUTPUT: 21</code></pre><h2 id="c-lculos-con-arreglos"><strong>Cálculos con Arreglos</strong></h2><p>Ahora veamos los cálculos con arreglos. NumPy es conocido por su velocidad al realizar cálculos complejos en grandes arreglos multidimensionales</p><p>Intentemos con algunas operaciones básicas.</p><pre><code>nuevo_arreglo = np.arange(1,11)
print(nuevo_arreglo)
OUTPUT: [ 1  2  3  4  5  6  7  8  9 10]</code></pre><ul><li>Suma</li></ul><pre><code>print(nuevo_arreglo + 5)
OUTPUT: [ 6  7  8  9 10 11 12 13 14 15]</code></pre><ul><li>Resta</li></ul><pre><code>print(nuevo_arreglo - 5)
OUTPUT: [-4 -3 -2 -1  0  1  2  3  4  5]</code></pre><ul><li>Suma de Arreglos</li></ul><pre><code>print(nuevo_arreglo + nuevo_arreglo)
OUTPUT: [ 2  4  6  8 10 12 14 16 18 20]</code></pre><ul><li>División de Arreglos</li></ul><pre><code>print(nuevo_arreglo / nuevo_arreglo)
OUTPUT:[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]</code></pre><p>Para <a href="https://airbrake.io/blog/python-exception-handling/zerodivisionerror-2">errores por dividir en cero</a>, Numpy convertirá el valor a NaN (no es un número).</p><p>También hay algunos métodos de cálculo integrados disponibles en NumPy para calcular valores como la media, la desviación estándar, la varianza y otros.</p><ul><li>Suma — np.sum()</li><li>Raíz cuadrada — np.sqrt()</li><li>Media — np.mean()</li><li>Varianza — np.var()</li><li>Desviación estándar — np.std()</li></ul><p>Mientras trabajas con arreglos 2d, a menudo necesitarás calcular la suma, la media, la varianza, etc., por filas o columnas. Puedes utilizar el parámetro de eje opcional para especificar si desea elegir una fila o una columna.</p><pre><code>arreglo2d = np.arange(25).reshape(5,5)
print(arreglo2d)
OUTPUT: [
[ 0  1  2  3  4]
[ 5  6  7  8  9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]
]

print(arreglo2d.sum())
OUTPUT: 300

print(arreglo2d.sum(axis=0))  # suma de columnas
OUTPUT: [50 55 60 65 70]

print(arreglo2d.sum(axis=1)) #suma de filas
OUTPUT: [ 10  35  60  85 110]</code></pre><h2 id="operaciones-condicionales"><strong>Operaciones condicionales </strong></h2><p>También puedes hacer un filtrado condicional con NumPy usando la notación de corchetes. Aquí hay un ejemplo:</p><pre><code>arr = np.arange(0,10)
OUTPUT: [0,2,3,4,5,6,7,8,9]

print(arr &gt; 4)
OUTPUT: [False False False False False  True  True  True  True  True]

print(arr[arr &gt; 4])
OUTPUT: [5 6 7 8 9]</code></pre><h1 id="resumen"><strong>Resumen</strong></h1><p>Cuando se trata de trabajar con grandes conjuntos de datos, NumPy es una herramienta poderosa para tener en su kit de herramientas. Es capaz de manejar cálculos numéricos avanzados y operaciones complejas de arreglos de n dimensiones.</p><p>Te recomiendo que aprendas NumPy si planeas comenzar una carrera en el aprendizaje automático.</p><p><a href="https://colab.research.google.com/drive/1Oa8J_sZXACQJEiMqANIHkftMgUrqSpVt#scrollTo=ITrCTnT6RkWP">Aquí hay un cuaderno de colab de google si deseas probar estos ejemplos.</a></p><p><strong><a href="https://tinyletter.com/manishmshiva">Consigue un resumen de mis artículos</a></strong> &nbsp;y vídeos enviados a tu correo electrónico todos los lunes por la mañana. También puedes <a href="https://www.manishmshiva.com/">Conectarte conmigo</a> aquí.</p><p>Traducido del artículo de <strong><a href="https://www.freecodecamp.org/news/author/manishmshiva/"><strong>Manish Shivanandhan</strong></a> - <a href="https://www.freecodecamp.org/news/numpy-crash-course-build-powerful-n-d-arrays-with-numpy/">Python NumPy Crash Course – How to Build N-Dimensional Arrays for Machine Learning</a></strong><em><br></em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de Google BERT para PNL con aprendizaje automático ]]>
                </title>
                <description>
                    <![CDATA[ Hay muchas aplicaciones para el aprendizaje automático, y una de ellas es el procesamiento del lenguaje natural o PNL. PNL maneja cosas como respuestas de texto, descifrar el significado de las palabras dentro de un contexto y mantener conversaciones con nosotros. Ayuda a las computadoras a comprender el lenguaje humano ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-google-bert-para-pnl-con-aprendizaje-automatico/</link>
                <guid isPermaLink="false">600f04dba4e0700982aa0cf7</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Fernando Cardellino ]]>
                </dc:creator>
                <pubDate>Tue, 30 Mar 2021 04:25:18 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/BERT-Tutorial.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Hay muchas aplicaciones para el aprendizaje automático, y una de ellas es el procesamiento del lenguaje natural o PNL.</p><p>PNL maneja cosas como respuestas de texto, descifrar el significado de las palabras dentro de un contexto y mantener conversaciones con nosotros. Ayuda a las computadoras a comprender el lenguaje humano para que podamos comunicarnos de diferentes maneras.</p><p>Desde los bots de chat hasta las solicitudes de empleo y la clasificación de tu correo electrónico en diferentes carpetas, PNL se utiliza en todas partes a nuestro alrededor.</p><p>En esencia, el procesamiento del lenguaje natural es una combinación de informática y lingüística. La lingüística nos brinda las reglas que debemos usar para entrenar nuestros modelos de aprendizaje automático y obtener los resultados que buscamos.</p><p>Hay muchas razones por las que el procesamiento del lenguaje natural se ha convertido en una parte importante del aprendizaje automático. Ayuda a las máquinas a detectar el sentimiento de los comentarios de un cliente, puede ayudar a clasificar los tickets de soporte para cualquier proyecto en el que estés trabajando y puede leer y comprender el texto de manera coherente.</p><p>Y dado que opera con un conjunto de reglas lingüísticas, no tiene los mismos prejuicios que los humanos.</p><p>Dado que PNL es un área de estudio tan grande, hay una serie de herramientas que puedes utilizar para analizar datos para tus propósitos específicos.</p><p>Existe el enfoque basado en reglas en el que se configuran muchas declaraciones si-entonces (if-then) para manejar cómo se interpreta el texto. Por lo general, un lingüista será responsable de esta tarea y lo que producen es muy fácil de entender para la gente.</p><p>Esto puede ser bueno para empezar, pero se vuelve muy complejo a medida que comienzas a trabajar con grandes conjuntos de datos.</p><p>Otro enfoque es utilizar aprendizaje automático donde no es necesario definir reglas. Esto es excelente cuando intentas analizar grandes cantidades de datos de forma rápida y precisa.</p><p>Elegir el algoritmo correcto para que el enfoque de aprendizaje automático funcione es importante en términos de eficiencia y precisión. Existen algoritmos comunes como Naïve Bayes y Support Vector Machines. Luego están los algoritmos más específicos como Google BERT</p><h2 id="-qu-es-bert">¿Qué es BERT?</h2><p>BERT es una biblioteca de código abierto creada en 2018 en Google. Es una técnica nueva para PNL y adopta un enfoque de modelos de entrenamiento completamente diferente al de cualquier otra técnica.</p><p>BERT es un acrónimo de Representaciones de codificador bidireccional de Transformer. Eso significa que, a diferencia de la mayoría de las técnicas que analizan oraciones de izquierda a derecha o de derecha a izquierda, BERT va en ambas direcciones usando el codificador Transformer. Su objetivo es generar un modelo de lenguaje.</p><p>Esto le da una precisión y un rendimiento increíbles en conjuntos de datos más pequeños, lo que resuelve un gran problema en el procesamiento del lenguaje natural.</p><p>Si bien hay una gran cantidad de datos basados en texto disponibles, muy pocos de ellos se han etiquetado para usar en el entrenamiento de un modelo de aprendizaje automático. Dado que la mayoría de los enfoques para los problemas de PNL aprovechan el aprendizaje profundo (deep learning), necesita grandes cantidades de datos para entrenar.</p><p>Realmente se ven las grandes mejoras en un modelo cuando se ha entrenado con millones de datos. Para ayudar a solucionar este problema de no tener suficientes datos etiquetados, los investigadores encontraron formas de entrenar modelos de representación de lenguaje de propósito general a través del entrenamiento previo usando textos de Internet.</p><p>Estos modelos de representación previamente entrenados se pueden ajustar para que funcionen con conjuntos de datos específicos que son más pequeños que los que se usan comúnmente en el aprendizaje profundo. Estos conjuntos de datos más pequeños pueden ser para problemas como el análisis de opiniones o la detección de spam. Esta es la forma en que se abordan la mayoría de los problemas de PNL porque proporciona resultados más precisos que comenzar con un conjunto de datos más pequeño.</p><p>Es por eso que BERT es un gran descubrimiento. Proporciona una forma de pre-entrenar con mayor precisión tus modelos con menos datos. El enfoque bidireccional que utiliza significa que obtiene más contexto para una palabra que si solo estuviera entrenando en una dirección. Con este contexto adicional, puede aprovechar otra técnica llamada LM enmascarada.</p><h2 id="en-qu-se-diferencia-de-otros-algoritmos-de-aprendizaje-autom-tico">En qué se diferencia de otros algoritmos de aprendizaje automático</h2><p>El LM enmascarado enmascara al azar el 15% de las palabras en una oración con un símbolo o token [MASK] y luego trata de predecirlas basándose en las palabras que rodean a la palabra enmascarada. Así es como BERT puede ver las palabras de izquierda a derecha y de derecha a izquierda.</p><p>Esto es completamente diferente de cualquier otro modelo de lenguaje existente porque mira las palabras antes y después de una palabra enmascarada, al mismo tiempo. Gran parte de la precisión que tiene BERT se puede atribuir a esto.</p><p>Para que BERT funcione con tu conjunto de datos, debes agregar un poco de metadatos. Deberá haber <strong>incrustaciones de tokens (token embeddings)</strong> para marcar el principio y el final de las oraciones. Deberá tener <strong>incrustaciones de segmentos (segment embeddings)</strong> para poder distinguir diferentes oraciones. Por último, necesitará <strong>incrustaciones posicionales (positional embeddings)</strong> para indicar la posición de las palabras en una oración.</p><p>Se verá similar a esto.</p><pre><code>[CLS] the [MASK] has blue spots [SEP] it rolls [MASK] the parking lot [SEP]</code></pre><p>Con los metadatos agregados a tus puntos de datos (data points), LM enmascarado está listo para funcionar.</p><p>Una vez que ha terminado de predecir palabras, BERT aprovecha la predicción de la siguiente oración. Esto analiza la relación entre dos oraciones. Hace esto para comprender mejor el contexto de todo el conjunto de datos al tomar un par de oraciones y predecir si la segunda oración es la siguiente en función del texto original.</p><p>Para que la predicción de la siguiente oración funcione en la técnica BERT, la segunda oración se envía a través del modelo basado en Transformer.</p><p>Hay cuatro versiones diferentes de BERT previamente entrenadas según la escala de datos con la que estés trabajando. Puedes aprender más sobre ellos aquí: <a href="https://github.com/google-research/bert#bert">https://github.com/google-research/bert#bert</a></p><p>El inconveniente de este enfoque es que la función de pérdida solo considera las predicciones de palabras enmascaradas y no las predicciones de las demás. Eso significa que la técnica BERT converge más lentamente que las otras técnicas de derecha a izquierda o de izquierda a derecha.</p><p>BERT se puede aplicar a cualquier problema de PNL que se te ocurra, incluida la predicción de intenciones, las aplicaciones de respuesta a preguntas y la clasificación de texto.</p><h2 id="ejemplo-de-c-digo">Ejemplo de Código</h2><h3 id="prepar-ndote">Preparándote</h3><p>Ahora veremos un ejemplo de BERT en acción. Lo primero que deberás hacer es clonar el repositorio de Bert.</p><pre><code>git clone https://github.com/google-research/bert.git</code></pre><p>Ahora necesita descargar los archivos de modelo BERT previamente entrenados desde la <a href="https://github.com/google-research/bert#pre-trained-models">página BERT en GitHub</a>. A lo largo del resto de este tutorial, me referiré al directorio de este repositorio como directorio raíz.</p><p>Estos archivos te brindan los hiperparámetros, pesos y otras cosas que necesitas con la información que Bert aprendió durante el entrenamiento previo. Usaré el modelo <a href="https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip">BERT-Base, Uncased</a>, pero encontrarás varias otras opciones en diferentes idiomas en la página de GitHub.</p><p>Algunas de las razones por las que elegirías el modelo BERT-Base, Uncased es si no tienes acceso a una TPU de Google, en cuyo caso normalmente elegirías un modelo Base.</p><p>Si cree que el texto que estás tratando de analizar distingue entre mayúsculas y minúsculas (esa distinción le da un significado contextual real), entonces optarías por un modelo de tipo Cased.</p><p>Si la distinción entre mayúsculas y minúsculas no es importante o aún no está muy seguro, entonces un modelo de tipo Uncased sería una opción válida.</p><p>Trabajaremos con algunas reseñas de Yelp como nuestro conjunto de datos. Recuerda, BERT espera los datos en un formato determinado utilizando esas <strong>incrustaciones de tokens </strong>y otros. Necesitaremos agregarlos a un archivo .tsv. Este archivo será similar a un .csv, pero tendrá cuatro columnas y ninguna fila de encabezado.</p><p>Así es como se verán las cuatro columnas.</p><ul><li>Columna 0: ID de la fila</li><li>Columna 1: Etiqueta de la fila (debe ser un número entero)</li><li>Columna 2: Una columna de la misma letra para todas las filas (no se usa para nada, pero BERT lo espera)</li><li>Columna 3: El texto que queremos clasificar</li></ul><p>Deberás crear una carpeta llamada datos en el directorio donde clonaste BERT y agregar tres archivos allí: <em>train.tsv</em>, <em>dev.tsv</em>, <em>test.tsv.</em></p><p>En los archivos <em>train.tsv</em> y <em>dev.tsv</em>, tendremos las cuatro columnas de las que hablamos anteriormente. En el archivo <em>test.tsv</em>, solo tendremos el ID de fila y el texto que queremos clasificar como columnas. Estos serán los archivos de datos que usaremos para entrenar y probar nuestro modelo.</p><h3 id="preparando-los-datos">Preparando los datos</h3><p>Primero necesitamos obtener los datos con los que trabajaremos. Puedes descargar las reseñas de Yelp aquí: <a href="https://course.fast.ai/datasets#nlp">https://course.fast.ai/datasets#nlp</a> Estará en la sección NLP y querrás la versión Polarity.</p><p>La razón por la que trabajaremos con esta versión es porque los datos ya tienen una polaridad, lo que significa que ya tienen un sentimiento asociado. Guarda este archivo en el directorio de datos.</p><p>Ahora estamos listos para comenzar a escribir código. Crea un nuevo archivo en el directorio raíz llamado <em>pre_processing.py</em> y agrega el siguiente código.</p><pre><code class="language-python">import pandas as pd
# esto es para extraer los datos de ese archivo .tgz
import tarfile
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

# obtener todos los datos de ese .tgz
yelp_reviews = tarfile.open('data/yelp_review_polarity_csv.tgz')
yelp_reviews.extractall('data')
yelp_reviews.close()

# comprueba cómo se ven los datos antes de empezar
# mira el conjunto de datos de entrenamiento
train_df = pd.read_csv('data/yelp_review_polarity_csv/train.csv', header=None)
print(train_df.head())

# mira el conjunto de datos de prueba
test_df = pd.read_csv('data/yelp_review_polarity_csv/test.csv', header=None)
print(test_df.head())</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/07/image-44.png" class="kg-image" alt="image-44" width="600" height="400" loading="lazy"></figure><p>En este código, hemos importado algunos paquetes de Python y descomprimimos los datos para ver cómo se ven. Notarás que los valores asociados con las reseñas son 1 y 2, siendo 1 una mala reseña y 2 una buena reseña. Necesitamos convertir estos valores a etiquetas más estándar, es decir 0 y 1. Puedes hacerlo con el siguiente código.</p><pre><code class="language-python">train_df[0] = (train_df[0] == 2).astype(int)
test_df[0] = (test_df[0] == 2).astype(int)</code></pre><p>Siempre que realizes cambios a tus datos, es importante comprobar si todo salió bien. Entonces lo haremos con los siguientes comandos.</p><pre><code class="language-python">print(train_df.head())
print(test_df.head())</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/07/image-45.png" class="kg-image" alt="image-45" width="600" height="400" loading="lazy"></figure><p>Cuando veas que tus valores de polaridad han cambiado para ser lo que esperabas. Ahora los datos deberían tener unos y ceros.</p><p>Dado que hemos limpiado los datos iniciales, es hora de preparar las cosas para BERT. Tendremos que hacer que nuestros datos se ajusten a los formatos de columna de los que hablamos anteriormente. Comencemos con los datos de entrenamiento.</p><p>Los datos de entrenamiento tendrán las cuatro columnas: ID de fila, etiqueta de fila, letra única, texto que queremos clasificar.</p><p>BERT espera dos archivos para entrenamiento llamados <em>train</em> y <em>dev</em>. Crearemos esos archivos dividiendo el archivo de entrenamiento inicial en dos archivos después de formatear nuestros datos con los siguientes comandos.</p><pre><code class="language-python">bert_df = pd.DataFrame({
    'id': range(len(train_df)),
    'label': train_df[0],
    'alpha': ['q']*train_df.shape[0],
    'text': train_df[1].replace(r'\n', ' ', regex=True)
})

train_bert_df, dev_bert_df = train_test_split(bert_df, test_size=0.01)</code></pre><p>Con la variable <em>bert_df</em>, hemos formateado los datos para que sean los que espera BERT. Puedes elegir cualquier otra letra para el valor alpha si lo deseas. El método <em>train_test_split</em> que importamos al principio se encarga de dividir los datos de entrenamiento en los dos archivos que necesitamos.</p><p>Observa cómo se formatearon los datos con este comando.</p><pre><code class="language-python">print(train_bert_df.head())</code></pre><p>Ahora necesitamos formatear los datos de prueba. Esto se verá diferente de cómo manejamos los datos de entrenamiento. BERT solo espera dos columnas para los datos de prueba: ID de fila, texto que queremos clasificar. No necesitamos hacer nada más con los datos de prueba una vez que los tengamos en este formato y lo haremos con el siguiente comando.</p><pre><code class="language-python">test_bert_df = pd.DataFrame({
    'id': range(len(test_df)),
    'text': test_df[1].replace(r'\n', ' ', regex=True)
})</code></pre><p>Es similar a lo que hicimos con los datos de entrenamiento, solo que sin dos de las columnas. Echa un vistazo a los datos de prueba recién formateados.</p><pre><code class="language-python">test_bert_df.head()</code></pre><p>Si todo se ve bien, puede guardar estas variables como los archivos .tsv con los que trabajará BERT.</p><pre><code class="language-python">train_bert_df.to_csv('data/train.tsv', sep='\t', index=False, header=False)
dev_bert_df.to_csv('data/dev.tsv', sep='\t', index=False, header=False)
test_bert_df.to_csv('data/test.tsv', sep='\t', index=False, header=False)</code></pre><h3 id="entrenando-el-modelo">Entrenando el modelo</h3><p>Una nota rápida antes de comenzar a entrenar el modelo: BERT puede consumir muchos recursos en las computadoras portátiles. Puede causar errores de memoria porque no hay suficiente RAM o algún otro hardware no es lo suficientemente potente. Podrías intentar hacer que <em>training_batch_size</em> sea más pequeño, pero eso hará que el entrenamiento del modelo sea realmente lento.</p><p>Agrega una carpeta al directorio raíz llamada <em>model_output</em>. Ahí es donde se guardará nuestro modelo una vez finalizado el entrenamiento. Ahora abre una terminal y ve al directorio raíz de este proyecto. Una vez que estés en el directorio correcto, ejecuta el siguiente comando y comenzará a entrenar tu modelo.</p><pre><code class="language-bash">python run_classifier.py --task_name=cola --do_train=true --do_eval=true --data_dir=./data/ --vocab_file=./uncased_L-12_H-768_A-12/vocab.txt --bert_config_file=./uncased_L-12_H-768_A-12/bert_config.json --init_checkpoint=./uncased_L-12_H768_A-12/bert_model.ckpt.index --max_seq_length=128 --train_batch_size=32 --learning_rate=2e-5 --num_train_epochs=3.0 --output_dir=./model_output --do_lower_case=False</code></pre><p>Deberías ver algunos resultados desplazándose a través de tu terminal. Una vez que esto termine de ejecutarse, tendrás un modelo entrenado que está listo para hacer predicciones.</p><h3 id="haciendo-una-predicci-n">Haciendo una predicción</h3><p>Si echas un vistazo al directorio <em>model_output</em>, notarás que hay un montón de archivos <em>model.ckpt.</em> Estos archivos tienen los pesos del modelo entrenado en diferentes puntos durante el entrenamiento, por lo que deseas encontrar el que tenga el número más alto. Ese será el modelo entrenado final que querrás usar.</p><p>Ahora ejecutaremos <em>run_classifier.py</em> nuevamente con opciones ligeramente diferentes. En particular, cambiaremos el valor <em>init_checkpoint</em> al punto de control del modelo más alto y estableceremos un nuevo valor <em>--do_predict</em> en verdadero. Aquí está el comando que necesitas ejecutar en tu terminal.</p><pre><code class="language-bash">python run_classifier.py --task_name=cola --do_predict=true --data_dir=./data --vocab_file=./uncased_L-12_H-768-A-12/bert_config.json --init_checkpoint=./model_output/model.ckpt-&lt;highest checkpoint number&gt; --max_seq_length=128 --output_dir=./model_output</code></pre><p>Una vez que el comando termine de ejecutarse, debería ver un nuevo archivo llamado <em>test_results.tsv</em>. ¡Esto tendrá tus resultados predichos basados en el modelo que entrenaste!</p><p>Acabas de utilizar BERT para analizar algunos datos reales y, con suerte, todo esto tiene sentido.</p><h2 id="otros-pensamientos">Otros pensamientos</h2><p>Sentí que era necesario pasar por el proceso de limpieza de datos aquí en caso de que alguien no lo haya pasado antes. A veces, el aprendizaje automático parece mágico, pero realmente se trata de tomarse el tiempo para que tus datos estén en las condiciones adecuadas para entrenar con un algoritmo.</p><p>BERT todavía es relativamente nuevo desde que se lanzó en 2018, pero hasta ahora ha demostrado ser más preciso que los modelos existentes, incluso si es más lento.</p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/milecia/">Milecia McGregor</a> - <a href="https://www.freecodecamp.org/news/google-bert-nlp-machine-learning-tutorial/">Google BERT NLP Machine Learning Tutorial</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial para un clasificador basado en bosques aleatorios: cómo utilizar algoritmos basados en árboles para el aprendizaje automático ]]>
                </title>
                <description>
                    <![CDATA[ Los algoritmos basados en árboles son métodos populares de aprendizaje automático que se utilizan para resolver problemas de aprendizaje supervisado. Estos algoritmos son flexibles y pueden resolver cualquier tipo de problema (clasificación o regresión). Los algoritmos basados en árboles tienden a usar la media para características (features) continuas o el ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/random-forest-classifier-tutorial-how-to-use-tree-based-algorithms-for-machine-learning/</link>
                <guid isPermaLink="false">600ee747a4e0700982aa0a6c</guid>
                
                    <category>
                        <![CDATA[ Aprendizaje Automatico ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Fernando Cardellino ]]>
                </dc:creator>
                <pubDate>Mon, 22 Mar 2021 04:28:14 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/random_tree.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Los algoritmos basados en árboles son métodos populares de aprendizaje automático que se utilizan para resolver problemas de aprendizaje supervisado. Estos algoritmos son flexibles y pueden resolver cualquier tipo de problema (clasificación o regresión).</p><p>Los algoritmos basados en árboles tienden a usar la <strong>media</strong> para características (features) continuas o el <strong>modo</strong> para características categóricas cuando hacen predicciones sobre muestras de entrenamiento en las regiones a las que pertenecen. También producen predicciones con <strong>alta precisión</strong>, <strong>estabilidad</strong> y <strong>facilidad de interpretación</strong>.</p><h1 id="ejemplos-de-algoritmos-basados-en-rboles">Ejemplos de algoritmos basados en árboles</h1><p>Hay diferentes algoritmos basados en árboles que puedes usar, como por ejemplo</p><ul><li>Árboles de Decisiones (Decision Trees)</li><li>Bosques Aleatorios (Random Forest)</li><li>Aumento de Gradiente (Gradient Boosting)</li><li>Bagging (Agregación Bootstrap &nbsp;"Bootstrap Aggregation")</li></ul><p>Por lo tanto, todo científico de datos debería aprender estos algoritmos y usarlos en sus proyectos de aprendizaje automático.</p><p>En este artículo, aprenderás sobre el algoritmo de bosques aleatorios (random forest). Después de completar este artículo, podrás dominar el uso del algoritmo de bosque aleatorio para resolver y crear modelos predictivos para problemas de clasificación con scikit-learn.</p><h1 id="-qu-es-el-algoritmo-de-bosques-aleatorios">¿Qué es el algoritmo de bosques aleatorios?</h1><p>Bosque aleatorio es uno de los algoritmos de aprendizaje supervisado basados en árboles más populares. También es el más flexible y fácil de usar.</p><p>El algoritmo se puede utilizar para resolver problemas de clasificación y regresión. El bosque aleatorio tiende a combinar cientos de <strong>árboles de decisión</strong> y luego entrena cada árbol de decisión en una muestra diferente de las observaciones.</p><p>Las predicciones finales del bosque aleatorio se realizan promediando las predicciones de cada árbol individual.</p><p>Los beneficios son numerosos. Los árboles de decisión individuales tienden a <strong>sobre ajustarse (overfit)</strong> a los datos de entrenamiento, pero el bosque aleatorio puede mitigar ese problema al <strong>promediar</strong> los resultados de predicción de diferentes árboles. Esto le da al algoritmo de bosques aleatorios una mayor precisión predictiva que un solo árbol de decisión.</p><p>El algoritmo de bosque aleatorio también puede ayudarte a encontrar características que son importantes en tu conjunto de datos. Esto se debe al algoritmo de Boruta, que selecciona características importantes en un conjunto de datos.</p><p>El bosque aleatorio se ha utilizado en una variedad de aplicaciones, por ejemplo, para proporcionar recomendaciones de diferentes productos a los clientes en el comercio electrónico.</p><p>En medicina, el algoritmo puede ser utilizado para identificar la enfermedad del paciente a través del análisis de su historial médico.</p><p>También en el sector bancario, puede ser utilizado para determinar fácilmente si el cliente es fraudulento o legítimo.</p><h1 id="-c-mo-funciona-el-algoritmo-de-bosques-aleatorios">¿Cómo funciona el algoritmo de bosques aleatorios?</h1><p>El algoritmo funciona completando los siguientes pasos: </p><p><strong>Paso 1</strong>: El algoritmo selecciona muestras en forma aleatoria de la base de datos proporcionada.</p><p><strong>Paso 2: </strong>El algoritmo creará un árbol de decisión para cada muestra seleccionada. Luego obtendrá un resultado de predicción de cada árbol creado.</p><p><strong>Paso 3: </strong>A continuación, se realizará la votación para cada resultado previsto. Para un problema de clasificación, usará la <strong>moda</strong>, y para un problema de regresión, usará la <strong>media</strong>.</p><p><strong>Paso 4</strong>: Y finalmente, el algoritmo seleccionará el resultado de predicción más votado como predicción final.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/08/how-random-forest-classifier-work.PNG" class="kg-image" alt="how-random-forest-classifier-work" width="600" height="400" loading="lazy"><figcaption>como funciona</figcaption></figure><h1 id="algoritmo-de-bosques-aleatorios-en-la-pr-ctica">Algoritmo de bosques aleatorios en la práctica</h1><p><br>Ahora que conoces el funcionamiento del algoritmo de bosque aleatorio, creemos un clasificador.</p><p>Construiremos un clasificador utilizando el conjunto de datos de diabetes de los indios Pima. El conjunto de datos de diabetes de los indios Pima implica predecir la aparición de la diabetes en un plazo de 5 años según los detalles médicos proporcionados. Este es un problema de clasificación binaria.</p><p>Nuestro objetivo es analizar y crear un modelo sobre aquel conjunto de datos para predecir si un paciente en particular tiene riesgo de desarrollar diabetes, dados otros factores independientes.</p><p>Comenzaremos importando paquetes importantes que usaremos para cargar el conjunto de datos y crear un clasificador de bosque aleatorio. Usaremos la biblioteca scikit-learn para cargar y usar el algoritmo de bosque aleatorio.</p><pre><code class="language-python"># importar paquetes importantes
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler, MinMaxScaler
import pandas_profiling

from matplotlib import rcParams
import warnings

warnings.filterwarnings("ignore")

# tamaño de la figura en pulgadas
rcParams["figure.figsize"] = 10, 6
np.random.seed(42)</code></pre><h3 id="conjunto-de-datos">Conjunto de datos</h3><p>Luego, carga el conjunto de datos desde el directorio de datos:</p><pre><code class="language-python"># Cargar conjunto de datos
data = pd.read_csv("../data/pima_indians_diabetes.csv")</code></pre><p>Ahora podemos observar la muestra del conjunto de datos.</p><pre><code class="language-python">
# mostrar muestra del conjunto de datos
data.sample(5)</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/5-rows.PNG" class="kg-image" alt="5-rows" width="600" height="400" loading="lazy"></figure><p>Como puedes ver, en nuestro conjunto de datos tenemos deferentes características con valores numéricos.</p><p>Entendamos la lista de características que tenemos en este conjunto de datos.</p><pre><code class="language-python"># mostrar columnas
data.columns</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/columns.PNG" class="kg-image" alt="columns" width="600" height="400" loading="lazy"></figure><p>En este conjunto de datos, hay 8 características &nbsp;de entrada y 1 característica de salida / destino. Se cree que los valores que faltan están codificados con valor cero. El significado de los nombres de las características es el siguiente (desde la primera hasta la última):</p><ul><li>Número de embarazos.</li><li>Concentración de glucosa en plasma a 2 horas en una prueba oral de tolerancia a la glucosa.</li><li>Presión arterial diastólica (mm Hg).</li><li>Espesor del pliegue cutáneo del tríceps (mm).</li><li>Insulina sérica de 2 horas (mu U / ml).</li><li>Índice de masa corporal (peso en kg / (altura en m) ^ 2).</li><li>Función del pedigrí de la diabetes.</li><li>Edad (años).</li><li>Variable de clase (0 o 1).</li></ul><p>Luego, dividimos el conjunto de datos en características independientes y característica &nbsp;de destino. Nuestra característica de destino para este conjunto de datos se llama <strong>class</strong>.</p><pre><code class="language-python"># dividir los datos en características de entrada y de destino

X = data.drop("class", axis=1)
y = data["class"]</code></pre><h3 id="preprocesamiento-del-conjunto-de-datos">Preprocesamiento del Conjunto de Datos</h3><p>Antes de crear un modelo, necesitamos estandarizar nuestras características independientes usando el método <code>standardScaler</code> de scikit-learn.</p><pre><code class="language-python"># estandarizar el conjunto de datos
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)</code></pre><h3 id="dividiendo-el-conjunto-de-datos-en-datos-de-entrenamiento-y-prueba">Dividiendo el conjunto de datos en datos de entrenamiento y prueba</h3><p>Ahora dividimos nuestro conjunto de datos procesados en datos de prueba y entrenamiento. Los datos de prueba serán el 10% de todo el conjunto de datos procesados.</p><pre><code class="language-python"># dividir en conjunto de entrenamiento (train) y 
#conjunto de prueba (test)
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, stratify=y, test_size=0.10, random_state=42
)</code></pre><h3 id="construyendo-el-clasificador-de-bosque-aleatorio">Construyendo el Clasificador de bosque aleatorio</h3><p>Ahora es el momento de crear nuestro clasificador de bosque aleatorio y luego entrenarlo en el conjunto de entrenamiento. También pasaremos el número de árboles (100) del bosque que queremos usar mediante el parámetro llamado <strong>n_estimators</strong>.</p><pre><code class="language-python"># crear el clasificador
classifier = RandomForestClassifier(n_estimators=100)

# Entrenar el modelo usando el conjunto de entranamiento
classifier.fit(X_train, y_train)</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/default-parameters.PNG" class="kg-image" alt="default-parameters" width="600" height="400" loading="lazy"></figure><p>El resultado anterior muestra diferentes valores de parámetros del clasificador de bosque aleatorio utilizado durante el proceso de entrenamiento en los datos de entrenamiento.</p><p>Después del entrenamiento, podemos realizar predicciones sobre los datos de la prueba.</p><pre><code class="language-python"># predicción en el conjunto de prueba
y_pred = classifier.predict(X_test)</code></pre><p>Luego, verificamos la precisión utilizando los valores reales y los predichos de los datos de prueba.</p><pre><code class="language-python"># Calcular la precisión del modelo
print("Precisión:", accuracy_score(y_test, y_pred))</code></pre><p>Precisión: 0.8051948051948052</p><p>Nuestra precisión es de alrededor del 80,5%, lo cual es bueno. Pero siempre podemos hacerlo mejor.</p><h3 id="identificar-caracter-sticas-importantes">Identificar características importantes</h3><p>Como dije antes, también podemos verificar las características importantes usando la variable <strong>feature_importances_</strong> del algoritmo de bosque aleatorio en scikit-learn.</p><pre><code class="language-python"># verificar características importantes
feature_importances_df = pd.DataFrame(
    {"feature": list(X.columns), "importance": classifier.feature_importances_}
).sort_values("importance", ascending=False)

# Mostrar
feature_importances_df</code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/08/feature-importance-list.PNG" class="kg-image" alt="feature-importance-list" width="600" height="400" loading="lazy"><figcaption>Important Features</figcaption></figure><p>La figura anterior muestra la importancia relativa de las características y su contribución al modelo. También podemos visualizar estas características y sus puntuaciones utilizando las bibliotecas seaborn y matplotlib.</p><pre><code class="language-python"># visualizarcaracterísticas importantes

# Crear un diagrama de barras
sns.barplot(x=feature_importances_df.feature, y=feature_importances_df.importance)
# agregar estiquestas

plt.xlabel("Feature Importance Score")
plt.ylabel("Features")
plt.title("Visualizing Important Features")
plt.xticks(
    rotation=45, horizontalalignment="right", fontweight="light", fontsize="x-large"
)
plt.show()</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/visualize-feature-importance.PNG" class="kg-image" alt="visualize-feature-importance" width="600" height="400" loading="lazy"></figure><p>En la figura anterior, puedes ver que la variable <strong>triceps_skinfold_thickness</strong> tiene poca importancia y no contribuye mucho a la predicción.</p><p>Esto significa que podemos eliminar esta variable y entrenar nuestro clasificador &nbsp;nuevamente y luego ver si puede mejorar su rendimiento en los datos de prueba.</p><pre><code class="language-python"># cargar datos con características seleccionadas
X = data.drop(["class", "triceps_skinfold_thickness"], axis=1)
y = data["class"]

# estandarizar el conjunto de datos
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# dividir en conjunto de entrenamiento y de prueba
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, stratify=y, test_size=0.10, random_state=42
)</code></pre><p>Entrenaremos el algoritmo con las características procesadas seleccionadas de nuestro conjunto de datos, realizaremos predicciones y luego calcularemos la precisión del modelo.</p><pre><code class="language-python"># crear clasificador
clf = RandomForestClassifier(n_estimators=100)

# Entrenar el modelo usando el conjunto de entrenamiento
clf.fit(X_train, y_train)

# predicción en el conjunto de prueba
y_pred = clf.predict(X_test)

# Calcular la precisión del modelo,
print("Precisión:", accuracy_score(y_test, y_pred))</code></pre><p>Precisión: 0.8181818181818182</p><p>Ahora, la precisión del modelo ha aumentado del <strong>80,5%</strong> al <strong>81,8%</strong> después de que eliminamos la característica menos importante llamada <em>triceps_skinfold_thickness</em>.</p><p>Esto sugiere que es muy importante verificar las características importantes y ver si puedes eliminar las menos importantes para aumentar el rendimiento de su modelo.</p><h1 id="en-resumen">En resumen</h1><p>Los algoritmos basados en árboles son realmente importantes para que los aprenda todo científico de datos. En este artículo, has aprendido los conceptos básicos de los algoritmos basados en árboles y cómo crear un modelo de clasificación utilizando el algoritmo de bosque aleatorio.</p><p>¡Felicitaciones, has llegado al final de este artículo!</p><p>Si aprendiste algo nuevo o disfrutaste leyendo este artículo, compártelo para que otros puedan verlo. Hasta entonces, ¡nos vemos en el próximo post! También me pueden contactar en Twitter <a href="https://twitter.com/Davis_McDavid">@Davis_McDavid</a></p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/davis/">Davis David</a> - <a href="https://www.freecodecamp.org/news/how-to-use-the-tree-based-algorithm-for-machine-learning/">Random Forest Classifier Tutorial: How to Use Tree-Based Algorithms for Machine Learning</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
