Redes Neurais em IA e Deep Learning - página 68

 

4.6 NumPy Random Number Generators (L04: Scientific Computing in Python)



4.6 NumPy Random Number Generators (L04: Scientific Computing in Python)

In this video, we will provide a brief overview of random number generators in NumPy. While we won't cover all the different methods for generating random numbers in NumPy, our focus will be on understanding random number generators and their practical utility.

Let's begin with a simple example. We'll start by importing NumPy, which is the library we'll be using for random number generation. NumPy has a random module that contains various functions for drawing random numbers. Although the documentation we'll be referencing is a bit dated, it provides a helpful list of different functions and their descriptions.

One commonly used function is random.rand, which generates random samples from a uniform distribution. By specifying the shape of the desired array (e.g., 2x3), this function will produce a two-dimensional array filled with random numbers from a uniform distribution.

NumPy offers other functions as well, such as random.random, which generates random floats in the half-open interval [0, 1). You can also draw random samples from different distributions, like the standard normal distribution, using the random.randn function.

Sometimes, we may want to ensure that our code produces the same random results every time it is executed. This is useful for reproducibility, especially when sharing code or comparing different methods. To achieve this, we can set a random seed at the beginning of our code or notebook. The seed is an arbitrary number that ensures the same sequence of random numbers is generated each time.

By setting a random seed, the generated random numbers will remain constant during multiple runs of the code. However, it's important to note that if we draw another random sample, the results will differ because it's still a random process.

Having consistent results can be particularly useful in machine learning applications, such as shuffling data or testing implementations. For example, when splitting a dataset, setting a random seed ensures that the split is the same every time. This allows for accurate comparison and evaluation of different methods.

To manage randomness more granularly, we can use a random state object in NumPy. The random state object has its own random number generator, enabling fine-grained control over where randomness is applied. By creating multiple random state objects, we can have different sources of randomness in our code. This is especially beneficial when we want certain parts of the code to produce consistent results while other parts generate varying random numbers.

While the old random_state class is still widely used, the NumPy community now recommends using the new random generator. This new generator employs a different method for generating random numbers, but for most simple applications, the choice between the two won't make a noticeable difference. What matters most is setting a random seed for reproducibility.

It's important to remember that random number generators in code are not truly random but pseudo-random. They use algorithms to produce sequences of numbers that mimic randomness. In our context, the focus is on consistency and reproducibility rather than the specific algorithm used for random number generation.

In conclusion, when working with random number generators in NumPy, the choice of the generator itself is not critical. What is essential is setting a random seed to ensure consistent and reproducible results. This becomes particularly valuable when sharing code, submitting assignments, or comparing different methods.

4.6 NumPy Random Number Generators (L04: Scientific Computing in Python)
4.6 NumPy Random Number Generators (L04: Scientific Computing in Python)
  • 2020.09.21
  • www.youtube.com
Random number generators and seeds are at the core of reproducible research. In this video, I show you how to use random number generators in NumPy.Jupyter n...
 

4.7 Reformar matrices NumPy (L04: Computación científica en Python)



4.7 Reformar matrices NumPy (L04: Computación científica en Python)

Finalmente, nos acercamos a la conclusión de la serie NumPy. Con solo tres videos restantes, hemos llegado a un tema importante: remodelar matrices NumPy. La remodelación de matrices es crucial cuando necesitamos transformar nuestros datos en la forma deseada, como convertir una matriz en un vector o viceversa. Mencioné brevemente este concepto en la conferencia introductoria, donde hablé de MNIST. Para ilustrar este proceso, consideremos un ejemplo simplificado.

Imagina que tenemos una matriz con dimensiones de 28 por 28, que representa una imagen. Normalmente, cada elemento de la matriz correspondería a un valor de píxel. Sin embargo, por motivos de simplicidad, supongamos que cada elemento es solo un dígito. Así que tenemos una matriz de 28 por 28 que representa una imagen de dígitos. Sin embargo, si queremos usar esta matriz como un vector de características para un clasificador, debemos remodelarlo en un solo vector largo con 784 elementos (28 * 28). Cada ejemplo de entrenamiento será una imagen y cada imagen tendrá 784 características.

La remodelación de una matriz se puede hacer usando la función de remodelación en NumPy. Por ejemplo, podemos remodelar un vector 1, 2, 3, 4, 5, 6 en una matriz de 2 por 3:

array([[1, 2, 3],
       [4, 5, 6]])
Es importante tener en cuenta que las dimensiones especificadas durante la remodelación deben coincidir con el número total de elementos en la matriz original. Si las dimensiones son incorrectas, se producirá un error. Por ejemplo, tratar de remodelar un vector de 6 elementos en una matriz de 3 por 3 arrojaría un error porque no hay suficientes elementos.

Al remodelar una matriz, se crea una vista de memoria en lugar de una nueva matriz. Esta vista de memoria nos permite manipular la matriz remodelada sin duplicar los datos. Para verificar esto, podemos usar la función np.may_share_memory, aunque es posible que no siempre brinde un resultado 100% preciso.

El uso de -1 como dimensión en la remodelación es una característica conveniente en NumPy. Actúa como marcador de posición, lo que permite que el método determine la dimensión adecuada en función del número total de elementos. Por ejemplo, si tenemos un vector con seis elementos y lo remodelamos usando -1, 2, el -1 será reemplazado por 3 ya que solo hay una forma de ordenar tres filas con dos columnas para obtener seis elementos. Este concepto de marcador de posición funciona con un número arbitrario de dimensiones.

Además, podemos usar la función de remodelación para aplanar una matriz. Al especificar un solo valor como la dimensión (por ejemplo, remodelar (6)), podemos transformar la matriz en un vector unidimensional. En la práctica, usar -1 es más conveniente ya que elimina la necesidad de recordar el tamaño. Por ejemplo, remodelar (-1) logra el mismo resultado que remodelar (6) para una matriz de seis elementos.

Hay varias formas de aplanar una matriz en NumPy. La función remodelar con -1 crea una vista de memoria, mientras que la función aplanar también aplana una matriz pero crea una copia. Otra función, ravel, también se usa para aplanar matrices. Determinar las diferencias entre estas funciones sería un buen cuestionario de autoevaluación.

Finalmente, podemos concatenar arreglos en NumPy, combinándolos a lo largo de ejes específicos. Al concatenar matrices a lo largo del primer eje, es similar a agregar elementos en las listas de Python. Por ejemplo, si tenemos dos matrices con un eje, al concatenarlas a lo largo de ese eje se apilarán una debajo de la otra.

La remodelación de matrices NumPy es esencial para manipular datos en la forma deseada. Comprender los diversos métodos, marcadores de posición y técnicas de concatenación nos permite trabajar de manera efectiva con arreglos y optimizar nuestro código. En el siguiente video, hablaré sobre los operadores de comparación y las máscaras NumPy, que son herramientas poderosas cuando se combinan con la remodelación.

4.7 Reshaping NumPy Arrays (L04: Scientific Computing in Python)
4.7 Reshaping NumPy Arrays (L04: Scientific Computing in Python)
  • 2020.09.21
  • www.youtube.com
Sometimes, our arrays just don't have the right shape. In this video, I will show you how we can manipulate the axes of an array to get it into the required ...
 

4.8 Operadores y máscaras de comparación NumPy (L04: Computación científica en Python)



4.8 Operadores y máscaras de comparación NumPy (L04: Computación científica en Python)

En NumPy, los operadores de comparación y las máscaras de selección ofrecen mucha flexibilidad y puede ser bastante agradable trabajar con ellos. En un video anterior, presentamos máscaras y operadores de comparación, pero ahora exploremos algunos trucos adicionales que puede usar cuando trabaje con ellos.

Comencemos con un ejemplo simple. Supongamos que tenemos una matriz NumPy [1, 2, 3, 4] por simplicidad. Podemos definir una máscara para seleccionar ciertos valores de la matriz. Esta máscara será una matriz booleana, lo que significa que contendrá valores verdaderos o falsos. Podemos crear la máscara especificando una condición, como seleccionar valores que sean mayores que dos. La matriz de máscaras resultante tendrá la misma forma que la matriz original, con valores verdaderos que indican las posiciones donde la condición es verdadera y valores falsos que indican las posiciones donde la condición es falsa.

En Python, existe una relación útil entre los valores booleanos y los números enteros: True equivale a 1 y False equivale a 0. Esta relación nos permite realizar operaciones interesantes. Por ejemplo, podemos usar la sentencia if para verificar si una condición es verdadera simplemente escribiendo if condition:. También podemos usar el operador not para comprobar si una condición es falsa escribiendo if not condition:. Estos enfoques proporcionan un código más legible en comparación con la comparación explícita de la condición con Verdadero o Falso.

Otra característica útil es la capacidad de contar la cantidad de elementos en una matriz que coinciden con una determinada condición. Al aplicar el operador de suma a una máscara, podemos contar el número de valores verdaderos en la máscara. Por ejemplo, si tenemos una máscara que selecciona valores mayores que dos, podemos contar el número de dichos valores llamando a sum(mask). De manera similar, podemos contar la cantidad de valores falsos restando la suma de la cantidad total de elementos en la matriz.

Para contar la cantidad de valores negativos en una matriz, podemos utilizar la función de inversión NumPy, que invierte los valores booleanos en la máscara. Al aplicar invertir a una máscara y luego llamar a la suma, podemos contar la cantidad de valores falsos (que ahora representan los valores negativos).

Binarizar una matriz, es decir, convertirla en una representación binaria, es otra operación común. Podemos lograr esto asignando un valor específico a las posiciones donde una condición es verdadera y otro valor a las posiciones donde la condición es falsa. Sin embargo, escribir toda la operación puede ser tedioso. Afortunadamente, NumPy proporciona la función where, que simplifica este proceso. La función where toma una condición, y para las posiciones donde la condición es verdadera, asigna el primer valor, y para las posiciones donde la condición es falsa, asigna el segundo valor. Usando where, podemos binarizar fácilmente una matriz con solo una línea de código.

Además de los operadores de comparación, NumPy ofrece operadores lógicos como and, or, xor y not. Estos operadores se pueden combinar con máscaras para crear condiciones más complejas. Por ejemplo, podemos seleccionar valores mayores que tres o menores que dos utilizando el operador o. Al combinar varias condiciones mediante operadores lógicos, podemos crear máscaras de selección complejas que se adapten a nuestras necesidades.

Estas máscaras booleanas, operadores lógicos y operadores de comparación en NumPy son increíblemente útiles cuando se trabaja con conjuntos de datos y se implementan reglas de árboles de decisión. Exploraremos más estos conceptos en próximos videos. En el siguiente video, profundizaremos en conceptos básicos de álgebra lineal en NumPy. ¡Manténganse al tanto!

4.8 NumPy Comparison Operators and Masks (L04: Scientific Computing in Python)
4.8 NumPy Comparison Operators and Masks (L04: Scientific Computing in Python)
  • 2020.09.22
  • www.youtube.com
Using comparison operators and selection masks goes hand in hand with fancy indexing in NumPy. This video explains how we can select relevant data convenient...
 

4.9 Conceptos básicos de álgebra lineal NumPy (L04: Computación científica en Python)



4.9 Conceptos básicos de álgebra lineal NumPy (L04: Computación científica en Python)

En este video me gustaría profundizar en algunos conceptos fundamentales del álgebra lineal, específicamente en el contexto de NumPy. Aunque no utilizaremos mucho el álgebra lineal en este curso, es fundamental comprender las operaciones básicas como los productos vectoriales y la multiplicación de matrices. Como mencioné anteriormente, el empleo de la notación de álgebra lineal nos permite escribir código que es más eficiente y conciso.

Comencemos por considerar una matriz unidimensional como un vector fila. Alternativamente, podemos definirlo como un vector que consta de una sola fila con múltiples elementos. Por otro lado, se puede crear un vector de columna remodelando el vector de fila para que tenga una columna y varios elementos. Esencialmente, representa la representación del vector de columna. En particular, el uso de corchetes es innecesario en este contexto.

En lugar de remodelar el vector explícitamente, podemos lograr el mismo resultado agregando un nuevo eje usando la función newaxis de NumPy. Al agregar dos nuevos ejes, incluso podemos crear un tensor 3D. Otro enfoque es usar la palabra clave None, que tiene el mismo propósito que newaxis. Estos tres métodos, a saber, remodelación, nuevo eje y Ninguno, logran el objetivo de agregar un eje adicional cuando sea necesario.

Más adelante, nos encontramos con la notación básica de álgebra lineal para la multiplicación de matrices. En álgebra lineal, la multiplicación de matrices es equivalente a calcular múltiples productos escalares. Por ejemplo, si tenemos los vectores [1, 2, 3] y [1, 2, 3], su producto escalar da como resultado 14. De manera similar, el producto escalar de [4, 5, 6] y [1, 2, 3] da 32. En NumPy, podemos realizar la multiplicación de matrices usando la función matmul. Alternativamente, el operador @ se puede usar por conveniencia. Sin embargo, es importante notar que en álgebra lineal, no podemos multiplicar matrices y vectores directamente. No obstante, podemos considerar un vector columna como una matriz, en concreto una matriz de 3x1. Este enfoque nos permite multiplicar una matriz con un vector, lo que no es posible en álgebra lineal estricta. Por lo tanto, NumPy ofrece más flexibilidad en comparación con el álgebra lineal tradicional.

Además, NumPy proporciona la función de punto para la multiplicación de matrices, que se recomienda ampliamente debido a su implementación eficiente en la mayoría de las máquinas. Esta función nos permite escribir código de manera más conveniente, especialmente cuando se trata de vectores de fila. Sirve como atajo o sobrecarga de operadores para la multiplicación de matrices en NumPy. Vale la pena señalar que la función de puntos puede manejar varias combinaciones de matrices y vectores, realizando productos de puntos o multiplicaciones de matrices basadas en las formas de entrada.

En cuanto al rendimiento, tanto la función matmul como la dot tienen una velocidad similar. La elección entre ellos puede depender de la máquina específica. No obstante, la función de punto generalmente se prefiere en la práctica. Además, la operación de transposición juega un papel similar a la operación de transposición en álgebra lineal, volteando efectivamente la matriz. En lugar de usar la función de transposición explícitamente, podemos utilizar el atributo T por brevedad.

Si bien NumPy incluye un tipo de matriz para matrices bidimensionales, no se usa comúnmente dentro de la comunidad NumPy. Las matrices multidimensionales regulares sirven para este propósito en la mayoría de los casos. El tipo de matriz está limitado a dos dimensiones e introduce una complejidad innecesaria. Es aconsejable evitar su uso a menos que se requiera específicamente.

Por último, mencionamos brevemente SciPy, una biblioteca impresionante que abarca una amplia gama de funciones adicionales más allá de NumPy. Esta biblioteca contiene numerosos algoritmos especializados para computación científica, como operaciones de álgebra lineal, transformadas de Fourier, técnicas de interpolación, algoritmos de optimización, funciones estadísticas y más. Si bien se basa en NumPy, SciPy sirve como una extensión y proporciona herramientas especializadas para diversos cálculos científicos. En este curso, exploraremos algoritmos específicos dentro de SciPy a medida que surja la necesidad. No necesita memorizar todos los detalles; Presentaré y explicaré algoritmos relevantes a medida que los encontremos.

Con esto, concluimos nuestra discusión sobre NumPy y SciPy para computación científica en Python. En el próximo video, continuaremos nuestro viaje de computación científica explorando matplotlib, una poderosa biblioteca de gráficos.

4.9 NumPy Linear Algebra Basics (L04: Scientific Computing in Python)
4.9 NumPy Linear Algebra Basics (L04: Scientific Computing in Python)
  • 2020.09.22
  • www.youtube.com
At its core, NumPy is an array library that implements tensors (including vectors and matrices) for linear algebra. After covering the basics of NumPy, this ...
 

4.10 Matplotlib (L04: Computación científica en Python)



4.10 Matplotlib (L04: Computación científica en Python)

Finalmente, hemos llegado al final de la lección cuatro, que ha sido bastante larga. Sin embargo, espero que los conceptos discutidos sobre NumPy hayan sido valiosos para usted. En el futuro, utilizaremos NumPy ampliamente en nuestras tareas para implementar algoritmos de aprendizaje automático. Por lo tanto, es crucial que domines y te familiarices con NumPy en este momento.

Pasando al último tema de la lección cuatro, exploraremos matplotlib, que es una biblioteca de trazado popular para Python. Aunque hay varias bibliotecas de gráficos disponibles en la actualidad, matplotlib sigue siendo la más utilizada. Personalmente, también es mi biblioteca de gráficos favorita y su nombre está inspirado en Metalab. La sintaxis de matplotlib es bastante similar a MATLAB, que algunas personas aprecian mientras que otras no. A mí, por ejemplo, no me gustaba usar MATLAB durante mi tiempo en la escuela de posgrado, pero encuentro que matplotlib es una gran herramienta.

Incluso si no eres fanático de MATLAB, creo que matplotlib es relativamente fácil de usar. Además, se integra sin problemas con NumPy, lo cual es una ventaja adicional. Entonces, comencemos con matplotlib. Debo mencionar que, personalmente, no memorizo todas las formas especiales de realizar tareas en matplotlib porque es una biblioteca de bajo nivel. Esto significa que ofrece un alto nivel de opciones de personalización, pero no todas son intuitivas. Por lo tanto, a menudo me encuentro buscando cosas. Cuando necesito hacer algo específico, visito la galería matplotlib, que muestra varios ejemplos. Por ejemplo, si quiero crear un diagrama de tallo, simplemente lo busco en la galería, encuentro el ejemplo y lo adapto a mis datos. Este enfoque suele ser suficiente para mis necesidades. Sin embargo, si prefiere tutoriales más detallados, también puede explorar el sitio web matplotlib.org, que ofrece tutoriales explicativos sobre diferentes aspectos de matplotlib.

Para empezar, cuando trabaje con matplotlib en Jupyter Lab o Jupyter Notebooks, puede usar la función en línea para mostrar gráficos dentro del propio cuaderno. Esto significa que los gráficos se mostrarán directamente en el cuaderno, evitando la necesidad de una ventana separada. Si bien existen formas alternativas de lograr esto, personalmente recomiendo usar el enfoque en línea, ya que es más confiable en diferentes computadoras. Para activar el modo en línea, puede usar el siguiente comando mágico: %matplotlib en línea. Alternativamente, puede agregar un punto y coma al final de las declaraciones de su trama, lo que generalmente logra el mismo resultado. Sin embargo, es recomendable usar plt.show() para mostrar los gráficos, ya que el truco del punto y coma puede no funcionar bien en ciertas computadoras.

Ahora profundicemos en la creación de algunas gráficas simples usando matplotlib. Por ejemplo, podemos comenzar trazando una curva sinusoidal. Para hacer esto, podemos usar la función np.linspace para generar 100 valores que van de cero a diez y luego graficar estos valores contra np.sin, que es la función seno. La forma más sencilla de crear un gráfico es mediante la función plt.plot, donde plt es la abreviatura de matplotlib.pyplot. Podemos ajustar los rangos de los ejes del gráfico usando las funciones plt.xlim y plt.ylim para establecer los límites para el eje x y el eje y, respectivamente. Además, podemos agregar etiquetas al eje x y al eje y usando las funciones plt.xlabel y plt.ylabel. Finalmente, para mostrar el diagrama, podemos usar la función plt.show() o agregar un punto y coma al final de las declaraciones del diagrama para suprimir la salida no deseada.

Además de un único gráfico, también podemos crear varios gráficos dentro de la misma figura. Por ejemplo, podemos trazar una curva de seno y una curva de coseno en subtramas separadas. Para lograr esto, podemos crear dos figuras usando la función plt.subplots y luego trazar las respectivas curvas de seno y coseno en cada subparcela. La función plt.subplots devuelve un objeto de figura y una matriz de objetos de ejes, que podemos usar para personalizar cada subparcela individualmente.

Aquí hay un fragmento de código de ejemplo que demuestra la creación de varias subparcelas:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace( 0 , 10 , 100 )
y1 = np.sin(x)
y2 = np.cos(x)

fig, axs = plt.subplots( 2 , 1 )  # Create a figure with 2 subplots arranged vertically

# Plot the sine curve in the first subplot
axs[ 0 ].plot(x, y1)
axs[ 0 ].set_title( 'Sine Curve' )  # Set a title for the subplot
axs[ 0 ].set_xlabel( 'X' )
axs[ 0 ].set_ylabel( 'Y' )

# Plot the cosine curve in the second subplot
axs[ 1 ].plot(x, y2)
axs[ 1 ].set_title( 'Cosine Curve' )
axs[ 1 ].set_xlabel( 'X' )
axs[ 1 ].set_ylabel( 'Y' )

plt.tight_layout()  # Adjust the spacing between subplots for better readability
plt.show()  # Display the figure
En este ejemplo, usamos la función plt.subplots para crear una figura con 2 subtramas dispuestas verticalmente (2, 1). La función devuelve un objeto de figura fig y una matriz de ejes de objetos con dimensiones que coinciden con el diseño de la subparcela especificada. Podemos acceder a cada subtrama indexando la matriz axs.

Dentro de los bloques de código específicos de la subparcela, usamos la función plot para trazar las curvas respectivas y luego personalizamos el título de cada subparcela, la etiqueta del eje x y la etiqueta del eje y usando las funciones set_title, set_xlabel y set_ylabel, respectivamente.

Se llama a la función tight_layout para ajustar el espacio entre las subtramas, lo que garantiza una mejor legibilidad. Finalmente, usamos plt.show() para mostrar la figura que contiene las subtramas.

Puede intentar ejecutar este código en su entorno de Jupyter Notebook o Jupyter Lab para ver la figura resultante con las curvas de seno y coseno que se muestran en subgráficos separados.

Este es solo un ejemplo básico de la creación de subtramas, y hay muchas más opciones de personalización disponibles en matplotlib para hacer que sus tramas sean más informativas y visualmente atractivas. Puede explorar la documentación y la galería de matplotlib para obtener más ejemplos y explicaciones detalladas.

4.10 Matplotlib (L04: Scientific Computing in Python)
4.10 Matplotlib (L04: Scientific Computing in Python)
  • 2020.09.22
  • www.youtube.com
In this video, I am showing you how to use my favorite plotting library to plot data in Python.Jupyter notebook: https://github.com/rasbt/stat451-machine-lea...
 

5.1 Lectura de un conjunto de datos de un archivo de texto tabular (L05: aprendizaje automático con Scikit-Learn)



5.1 Lectura de un conjunto de datos de un archivo de texto tabular (L05: aprendizaje automático con Scikit-Learn)

¡Hola a todos! Espero que todos hayan tenido una gran semana y hayan tenido la oportunidad de trabajar con todo el material de NumPy. Esta semana, nos centraremos en el procesamiento de datos y el aprendizaje automático con scikit-learn, por lo que es esencial tener una buena comprensión de NumPy. Creo que es increíblemente útil practicar la codificación y aplicar los conceptos que aprendemos en ejemplos de la vida real, razón por la cual estaremos haciendo algo de codificación por adelantado en esta lección. Nos beneficiará más adelante en la clase cuando usemos ampliamente estas herramientas. Hablando de eso, no hay mucho más que agregar para esta lección, excepto que he subido la primera gran tarea, que lo pondrá a prueba en los conceptos que cubrimos en lecciones anteriores, incluido el aprendizaje supervisado y ejemplos de código usando NumPy. Es una gran oportunidad para obtener experiencia práctica con el algoritmo vecino más cercano K y explorar NumPy y scikit-learn más.

Ahora, mientras se sumerge en los videos, completa la tarea y realiza el cuestionario de autoevaluación, quiero recordarle que se divierta y disfrute. El otoño, mi estación favorita, acaba de comenzar aquí en Wisconsin, y me encanta el clima más frío y los hermosos colores de las hojas cambiantes. Por cierto, estoy muy emocionada porque ya fui a un huerto de calabazas el fin de semana pasado y compré algunas calabazas que no puedo esperar para tallar para Halloween. Entonces, comencemos con la conferencia para poder volver a mis calabacitas y prepararlas para Halloween.

Muy bien, ahora hemos llegado a la tercera parte de las conferencias de fundamentos computacionales. En esta lección, cubriremos varios temas, comenzando con la lectura de un conjunto de datos de un archivo de texto tabular, como un archivo CSV, que es el formato de archivo más común para las tareas tradicionales de aprendizaje automático. Luego, analizaremos las técnicas básicas de manejo de datos, incluida la configuración de los datos para los algoritmos de aprendizaje automático y los procedimientos de capacitación.

Después de eso, nos sumergiremos en el aprendizaje automático con scikit-learn. Pero antes de hacerlo, quiero recapitular brevemente las clases de Python y la programación orientada a objetos. En ejercicios anteriores, les pedí que se prepararan para Python o que entendieran mejor sus conceptos. Es importante tener una buena comprensión de la programación orientada a objetos porque scikit-learn depende en gran medida de ella. Por lo tanto, es necesario comprender la programación orientada a objetos para comprender cómo funciona scikit-learn.

A continuación, analizaremos la preparación de datos de entrenamiento mediante la API de transformador de aprendizaje de scikit. También cubriremos la definición de canalizaciones de scikit-learn, que nos ayudan a encadenar diferentes operaciones, como la preparación de conjuntos de datos, el escalado, la normalización, la reducción de la dimensionalidad y el propio clasificador. Mediante el uso de canalizaciones, podemos crear flujos de trabajo de capacitación eficientes que conectan varios aspectos del proceso de aprendizaje automático, lo que hace que las cosas sean más convenientes. Esta es una de las fortalezas significativas de scikit-learn.

Para esta conferencia, decidí usar diapositivas nuevamente. Aunque Jupiter Lab es una herramienta fantástica, me resulta más fácil explicar ciertos conceptos anotando ejemplos de código con un bolígrafo o un lápiz. Entonces, en estas diapositivas, he capturado capturas de pantalla de Jupiter Lab y Jupiter Notebook, que anotaré durante la conferencia. Sin embargo, también subí el cuaderno de códigos completo a GitHub, donde puedes encontrar explicaciones adicionales. Considere este documento como un curso opcional o notas de lectura para su referencia.

Recapitulemos rápidamente dónde estamos en este curso. Comenzamos con una introducción al aprendizaje automático, cubrimos los conceptos básicos y exploramos cómo funciona scikit-learn. Luego, profundizamos en Python, aprendiendo sobre NumPy y computación científica. Ahora, estamos entrando en la fase de procesamiento de datos y aprendizaje automático con scikit-learn. En la próxima lección, volveremos a los conceptos básicos de aprendizaje automático, como árboles de decisión, métodos de conjunto y evaluación de modelos. Aunque esta es la última parte de las conferencias de fundamentos computacionales, no significa que sea el final del curso. Después de completar las conferencias de fundamentos computacionales, pasaremos a temas más avanzados en el aprendizaje automático, incluido el aprendizaje profundo y las redes neuronales.

Ahora, profundicemos en el primer tema de esta lección: leer un conjunto de datos de un archivo de texto tabular. Cuando se trabaja con aprendizaje automático, es común tener datos almacenados en formatos tabulares como archivos CSV (valores separados por comas). Estos archivos contienen filas y columnas de datos, cada fila representa una muestra o instancia y cada columna representa una característica o atributo.

Para leer un archivo CSV en Python, podemos usar la biblioteca Pandas. Pandas proporciona potentes herramientas de análisis y manipulación de datos, lo que lo convierte en una opción popular para trabajar con datos tabulares en Python. Echemos un vistazo a un ejemplo:

import pandas as pd

# Read the CSV file into a DataFrame
data = pd.read_csv( 'data.csv' )

# Display the first few rows of the DataFrame
print(data.head())

En este ejemplo, primero importamos la biblioteca pandas y le damos un alias como pd por conveniencia. Luego, usamos la función read_csv() para leer el archivo CSV data.csv en un DataFrame, que es una estructura de datos tabular bidimensional proporcionada por Pandas. El DataFrame se almacena en los datos variables.

Después de leer los datos, podemos usar la función head() para mostrar las primeras filas del DataFrame. Esto nos permite inspeccionar rápidamente los datos y verificar que se leyeron correctamente.

Pandas proporciona una amplia gama de funciones y métodos para manipular y analizar datos. Podemos realizar varias operaciones como filtrar filas, seleccionar columnas, agregar datos y mucho más. Si eres nuevo en Pandas, te animo a explorar su documentación y experimentar con diferentes operaciones por tu cuenta.

Ahora que sabemos cómo leer datos, pasemos al siguiente tema: técnicas básicas de manejo de datos. Cuando se trabaja con datos para el aprendizaje automático, es fundamental preprocesar y preparar los datos de forma adecuada. Esto incluye tareas como el manejo de valores perdidos, la codificación de variables categóricas, el escalado de características numéricas y la división de los datos en conjuntos de entrenamiento y prueba.

Un paso común de preprocesamiento es el manejo de los valores faltantes. Los valores faltantes a menudo se representan como NaN (No es un número) o valores NULL en los datos. Estos valores faltantes pueden causar problemas al entrenar modelos de aprendizaje automático, por lo que debemos manejarlos de manera adecuada. Pandas proporciona varias funciones para manejar los valores faltantes, como isna() para verificar los valores faltantes, fillna() para completar los valores faltantes con un valor específico y dropna() para eliminar filas o columnas con valores faltantes.

La codificación de variables categóricas es otro paso importante. Los modelos de aprendizaje automático generalmente funcionan con datos numéricos, por lo que debemos convertir las variables categóricas en una representación numérica. Una técnica de codificación común es la codificación one-hot, en la que creamos columnas binarias para cada categoría e indicamos la presencia o ausencia de una categoría con un 1 o un 0, respectivamente.

import pandas as pd

# Create a DataFrame with categorical variables
data = pd.DataFrame({ 'color' : [ 'red' , 'blue' , 'green' , 'red' , 'green' ]})

# Perform one-hot encoding
encoded_data = pd.get_dummies(data)

# Display the encoded data
print(encoded_data)
En este ejemplo, creamos un DataFrame con una columna 'color' que contiene variables categóricas. Luego usamos la función get_dummies() de Pandas para realizar una codificación one-hot. Los datos codificados resultantes contienen columnas binarias para cada categoría única en la columna de 'color' original.

Escalar características numéricas es otro paso común de preprocesamiento. Muchos algoritmos de aprendizaje automático son sensibles a la escala de las características. Si las características tienen diferentes escalas, puede afectar el rendimiento del modelo. Para abordar esto, podemos escalar las características a un rango estándar, como 0 a 1 o -1 a 1. Pandas proporciona las clases MinMaxScaler y StandardScaler en el módulo sklearn.preprocessing para realizar escalado de características.

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

# Create a DataFrame with numerical features
data = pd.DataFrame({ 'age' : [ 25 , 30 , 35 , 40 ], 'income' : [ 50000 , 60000 , 70000 , 80000 ]})

# Perform feature scaling using MinMaxScaler
scaler = MinMaxScaler()
scaled_data = scaler.fit_transform(data)

# Convert the scaled data back to a DataFrame
scaled_df = pd.DataFrame(scaled_data, columns=data.columns)

# Display the scaled data
print(scaled_df)
En este ejemplo, creamos un DataFrame con dos características numéricas: 'edad' e 'ingresos'. Luego usamos la clase MinMaxScaler del módulo sklearn.preprocessing para realizar el escalado de características. El método fit_transform() escala los datos y los datos escalados resultantes se almacenan en la variable scaled_data como una matriz NumPy. Finalmente, volvemos a convertir los datos escalados en un DataFrame y los mostramos.

Por último, dividir los datos en conjuntos de entrenamiento y prueba es crucial para evaluar el rendimiento de los modelos de aprendizaje automático. Por lo general, dividimos los datos en dos conjuntos: un conjunto de entrenamiento que se usa para entrenar el modelo y un conjunto de prueba que se usa para evaluar su rendimiento. Pandas proporciona la función train_test_split() en el módulo sklearn.model_selection para dividir los datos en conjuntos de entrenamiento y prueba.

import pandas as pd
from sklearn.model_selection import train_test_split

# Read the CSV file into a DataFrame
data = pd.read_csv( 'data.csv' )

# Split the data into features and labels
X = data.drop( 'label' , axis= 1 )
y = data[ 'label' ]

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
En este ejemplo, primero leemos el archivo CSV 'data.csv' en un DataFrame. Luego, dividimos los datos en funciones X y etiquetas y, donde X contiene todas las columnas excepto la columna 'etiqueta' e y contiene solo la columna 'etiqueta'.

A continuación, usamos la función train_test_split() para dividir los datos en conjuntos de entrenamiento y prueba. Pasamos las características X y las etiquetas y, especificamos el tamaño de prueba deseado (p. ej., 0,2 para un conjunto de prueba del 20 %) y establecemos un estado aleatorio para la reproducibilidad.

Después de dividir los datos, podemos usar el conjunto de entrenamiento (X_train e y_train) para entrenar nuestro modelo de aprendizaje automático y evaluar su rendimiento en el conjunto de prueba (X_test e y_test).

Estas son algunas técnicas básicas de manejo de datos en el aprendizaje automático utilizando la biblioteca Pandas en Python. Recuerde, el preprocesamiento y la preparación de datos son pasos esenciales en la tubería de aprendizaje automático, y hay muchas más técnicas y herramientas disponibles según los requisitos específicos de su proyecto.

5.1 Reading a Dataset from a Tabular Text File (L05: Machine Learning with Scikit-Learn)
5.1 Reading a Dataset from a Tabular Text File (L05: Machine Learning with Scikit-Learn)
  • 2020.09.27
  • www.youtube.com
Machine learning begins with loading your data into a friendly array format. In this video, we will use pandas' read_csv function to get data into our active...
 

5.2 Manejo básico de datos (L05: Machine Learning con Scikit-Learn)



5.2 Manejo básico de datos (L05: Machine Learning con Scikit-Learn)

En el video anterior, discutimos cómo leer un archivo de texto tabular como un conjunto de datos. En concreto, nos centramos en trabajar con un archivo CSV y, más concretamente, el conjunto de datos Iris. Importamos el conjunto de datos de Iris de un archivo CSV a un marco de datos de Pandas.

En este video, profundizaremos en la preparación de los datos en el formato adecuado para el aprendizaje automático mediante scikit-learn. Exploraremos técnicas básicas de manejo de datos utilizando Pandas y NumPy para transformar los datos en un formato adecuado para el aprendizaje automático. Pero antes de continuar, recapitulemos brevemente el concepto de las funciones de Python, ya que será útil cuando discutamos la transformación de valores en un Pandas DataFrame.

Aquí tenemos una función de Python simple llamada "some_func". Toma un único argumento de entrada, "x", y lo convierte en una cadena. Luego concatena el valor convertido con la cadena fija "hola mundo". Si proporcionamos un número entero, como 123, como entrada, se convertirá en una cadena ("123") y se concatenará con "hola mundo", lo que dará como resultado la cadena final. Esta es una descripción general básica de cómo funcionan las funciones de Python, con dos puntos que indican el cuerpo de la función y una declaración de retorno que especifica la salida. Aunque puede haber varias líneas de código dentro de la función, la declaración de retorno marca el final.

Otro concepto que vale la pena mencionar son las funciones lambda. Las funciones Lambda son una forma abreviada de definir funciones pequeñas sin nombrarlas explícitamente. Se usan comúnmente cuando es necesario guardar líneas de código y escribir funciones rápidamente. En el contexto de las transformaciones de datos en las columnas de Pandas, a menudo se utilizan funciones lambda. Si bien las funciones lambda ofrecen una sintaxis más concisa, esencialmente realizan las mismas operaciones que las funciones regulares. Son especialmente útiles cuando se combinan con el método apply en una columna de Pandas DataFrame.

En la lección anterior, leímos el conjunto de datos de Iris en un marco de datos de Pandas desde el archivo CSV. El conjunto de datos de Iris consta de 150 filas, pero solo mostramos las primeras cinco filas por motivos de brevedad. El conjunto de datos incluye una columna de ID, que no es esencial, seguida de las características representadas por la matriz de diseño X. También tenemos las etiquetas de clase, normalmente indicadas como y. Tradicionalmente, scikit-learn y otras bibliotecas no manejaban variables de cadena como etiquetas de clase, por lo que era una práctica común convertirlas en números enteros. Por ejemplo, "Iris setosa" se convertiría en el número entero 0, "Iris versicolor" en 1 e "Iris virginica" en 2. Esta conversión fue necesaria porque muchos algoritmos se diseñaron para trabajar con etiquetas de clase entera en lugar de etiquetas de cadena.

Sin embargo, scikit-learn ahora admite etiquetas de clase de cadena en la mayoría de las funciones, lo que elimina la necesidad de una conversión explícita. Internamente, la conversión se maneja automáticamente. Sin embargo, es posible que algunas herramientas no manejen correctamente los datos de cadena, por lo que aún se recomienda convertir las etiquetas de clase en números enteros. Al hacerlo, garantiza la compatibilidad con varias herramientas y reduce la probabilidad de encontrar errores.

Para ilustrar el proceso de conversión, usaremos la función lambda junto con el método apply. Al aplicar una función lambda a la columna de especies del DataFrame, podemos convertir las etiquetas de clase de cadena en etiquetas de enteros. Sin embargo, vale la pena mencionar que usar un diccionario de mapeo suele ser un mejor enfoque. Proporciona una mejor legibilidad y permite una interpretación más sencilla de las transformaciones de etiquetas de clase. Además, si necesita recuperar las etiquetas de clase originales más tarde, puede definir un diccionario inverso y usarlo para mapear las etiquetas de enteros de nuevo a sus representaciones de cadenas originales.

Para demostrar la conversión, recargamos el conjunto de datos a su estado original. Luego, en lugar de aplicar, utilizamos la función de mapa para convertir las etiquetas de cadena en números enteros usando el diccionario de mapeo. También mostramos el uso del atributo de valores, que accede a la matriz NumPy subyacente. Trabajando con arreglos NumPy.

Trabajar con arreglos NumPy puede ser beneficioso por varias razones. Las matrices NumPy son más eficientes en términos de memoria en comparación con Pandas DataFrames, lo que las hace ideales para grandes conjuntos de datos. Además, muchos algoritmos de aprendizaje automático en scikit-learn esperan que los datos de entrada estén en forma de matrices NumPy.

Para convertir nuestro Pandas DataFrame en matrices NumPy, simplemente podemos acceder al atributo de valores del DataFrame. Veamos un ejemplo:

import pandas as pd
import numpy as np

# Reload the Iris dataset
iris_df = pd.read_csv( 'iris.csv' )

# Convert the features (X) into a NumPy array
X = iris_df.drop([ 'species' ], axis= 1 ).values

# Convert the class labels (y) into a NumPy array
y = iris_df[ 'species' ].values
En este ejemplo, usamos el método drop del DataFrame para eliminar la columna 'especies' y obtener las características como un DataFrame. Luego, al acceder al atributo de valores, convertimos las características en una matriz NumPy y la asignamos a la variable X.

De manera similar, accedemos a la columna 'especies' del DataFrame usando el operador de indexación [] y la convertimos en una matriz NumPy, asignándola a la variable y.

Ahora, la variable X contiene la matriz de características como una matriz NumPy, y la variable y contiene las etiquetas de clase como una matriz NumPy. Podemos usar estas matrices como entradas para varios algoritmos de aprendizaje automático.

Digamos que queremos dividir nuestro conjunto de datos en conjuntos de entrenamiento y prueba para la evaluación del modelo. Scikit-learn proporciona una función de utilidad llamada train_test_split que facilita esta tarea. Aquí hay un ejemplo:

 from sklearn.model_selection import train_test_split

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
En este ejemplo, importamos la función train_test_split del módulo sklearn.model_selection. Pasamos las matrices X e Y como argumentos a la función, junto con el parámetro test_size que especifica la proporción del conjunto de datos que se asignará para la prueba (en este caso, el 20 %). El parámetro random_state asegura la reproducibilidad de la división.

Después de llamar a train_test_split, obtenemos cuatro matrices: X_train e y_train contienen los datos de entrenamiento, mientras que X_test e y_test contienen los datos de prueba.

Ahora puede usar las matrices X_train e y_train para entrenar su modelo de aprendizaje automático y evaluar su rendimiento con las matrices X_test e y_test.

En resumen, al convertir Pandas DataFrame en matrices NumPy, podemos aprovechar las ventajas de NumPy, como la eficiencia de la memoria y la compatibilidad con los algoritmos de aprendizaje automático. Además, scikit-learn proporciona funciones convenientes como train_test_split para dividir los datos en conjuntos de entrenamiento y prueba.

5.2 Basic data handling (L05: Machine Learning with Scikit-Learn)
5.2 Basic data handling (L05: Machine Learning with Scikit-Learn)
  • 2020.09.27
  • www.youtube.com
Before we train a machine learning classifier, we have to make sure that the dataset looks right. This means, we want to make sure that the feature and label...
 

5.3 Programación Orientada a Objetos y Clases de Python (L05: Aprendizaje Automático con Scikit-Learn)



5.3 Programación Orientada a Objetos y Clases de Python (L05: Aprendizaje Automático con Scikit-Learn)

Antes de profundizar en el tema del aprendizaje automático con scikit-learn en la próxima lección, tomemos un momento para analizar la programación orientada a objetos, específicamente las clases de Python. Comprender las clases será muy relevante ya que scikit-learn se basa en gran medida en los conceptos de programación orientada a objetos. Hacia el final de este video, demostraré la implementación de K-vecinos más cercanos usando la API de scikit-learn, que es el enfoque que usa scikit-learn para implementar estimadores como clasificadores.

Entonces, comencemos discutiendo las clases de Python. Para comprender mejor la API de scikit-learn, es importante comprender los conceptos básicos de las clases. En términos simples, se puede pensar en una clase como un modelo para crear objetos. Los objetos son instancias de una clase y se pueden visualizar como diferentes variaciones de la misma forma de cortador de galletas que se usa para hacer galletas. La clase en sí actúa como la plantilla del cortador de galletas, mientras que las cookies representan los objetos creados a partir de la clase.

En Python, definimos una clase usando la palabra clave class, seguida del nombre de la clase. Dentro de la clase, definimos diferentes métodos de clase. Los métodos de clase son similares a las funciones, pero tienen un primer argumento obligatorio llamado self, que se refiere al objeto mismo. Este autoargumento nos permite acceder a los atributos y métodos del objeto. En otras palabras, nos permite interactuar con los datos y el comportamiento del objeto.

En el contexto del ejemplo del vehículo, consideremos una clase de vehículo simple e ingenua. Esta clase representa diferentes tipos de vehículos, como automóviles, motocicletas o camiones. La clase tiene varios métodos para definir su comportamiento. El primer método es el método __init__, también conocido como constructor. Este método se ejecuta automáticamente cuando se crea un nuevo objeto a partir de la clase. Acepta el argumento self y cualquier argumento adicional necesario para inicializar el objeto.

En el método __init__, definimos un atributo llamado caballos de fuerza, al que se le asigna el valor proporcionado como argumento. Este atributo representa la potencia del vehículo. Cuando se crea un nuevo objeto, tendrá un atributo de potencia al que se puede acceder para recuperar el valor de potencia.

Además del método __init__, podemos definir otros métodos que modifican los atributos del objeto. Por ejemplo, el método tune_motor duplica el atributo de potencia del vehículo, simulando una puesta a punto del motor. Al llamar a este método en el objeto del vehículo, su atributo de potencia se modificará en consecuencia.

Además, podemos definir métodos que devuelvan valores basados en los atributos del objeto. En el ejemplo, el método horsepower_to_torque calcula el valor de torsión en función de la potencia del objeto y un valor de RPM proporcionado. Este método demuestra cómo se pueden utilizar los atributos del objeto para realizar cálculos y obtener resultados útiles.

Vale la pena señalar que en Python existen convenciones para indicar la visibilidad de los métodos. Los métodos con un solo prefijo de guión bajo, como _private_method, se consideran privados y no están destinados al uso directo de los usuarios de la clase. Sin embargo, los usuarios aún pueden acceder y llamar a estos métodos, aunque generalmente se desaconseja. Los métodos con un prefijo de doble guión bajo, como __very_private_method, están aún más restringidos y requieren una sintaxis específica para acceder a ellos.

Además, Python admite la herencia de clases, lo que nos permite crear clases secundarias que heredan propiedades y métodos de una clase principal. Este concepto nos permite crear clases especializadas con atributos y comportamientos adicionales mientras aprovechamos la funcionalidad existente definida en la clase principal. Por ejemplo, podríamos crear una clase Car especializada que herede de la clase Vehicle y agregue un atributo number_of_wheels específicamente para autos.

Para ilustrar los conceptos discutidos, se proporciona un ejemplo de un clasificador de K-vecinos más cercanos. Esta implementación sigue las convenciones de la API de scikit-learn y demuestra el uso de una clase de estimador en scikit-learn. Aquí hay una implementación simplificada:

 class KNNClassifier:

    def __init__( self , k):
         self .k = k
         self .X_train = None
         self .y_train = None
    
    def fit( self , X_train, y_train):
         self .X_train = X_train
         self .y_train = y_train
    
    def predict( self , X_test):
        predictions = []
         for x in X_test:
            distances = []
             for i, x_train in enumerate( self .X_train):
                distance = self ._calculate_distance(x, x_train)
                distances.append((distance, self .y_train[i]))
            distances.sort()
            k_nearest = distances[: self .k]
            prediction = self ._majority_vote(k_nearest)
            predictions.append(prediction)
         return predictions
    
    def _calculate_distance( self , x1, x2):
         # Calculate the distance between two data points
         # (e.g., Euclidean distance)
        pass
    
    def _majority_vote( self , neighbors):
         # Determine the majority class among the nearest neighbors
        pass

En este ejemplo, KNNClassifier es una clase que representa un clasificador de K vecinos más cercanos. El constructor toma un parámetro k, que especifica el número de vecinos más cercanos a considerar.

El método de ajuste se utiliza para entrenar el clasificador. Toma dos argumentos: X_train (los datos de entrenamiento) y y_train (las etiquetas correspondientes). El método simplemente almacena los datos de entrenamiento y las etiquetas en los atributos del objeto para su uso posterior.

El método de predicción se utiliza para hacer predicciones sobre nuevos datos. Toma X_test (los datos de prueba) como argumento y devuelve las etiquetas previstas para los datos de prueba. Para cada punto de datos en X_test, el método calcula las distancias a todos los puntos de datos en el conjunto de entrenamiento usando el método _calculate_distance. Luego selecciona los k vecinos más cercanos y determina la clase mayoritaria utilizando el método _majority_vote. La etiqueta predicha se adjunta a la lista de predicciones.

El método _calculate_distance es un método privado (indicado por el guión bajo inicial) que calcula la distancia entre dos puntos de datos. Esta podría ser la distancia euclidiana o cualquier otra métrica de distancia adecuada para el problema.

El método _majority_vote es otro método privado que determina la clase mayoritaria entre un conjunto de vecinos. Esto se puede hacer contando las ocurrencias de cada etiqueta de clase y seleccionando la etiqueta con el conteo más alto.

Este ejemplo demuestra la estructura básica de una clase de estimador en scikit-learn. Por supuesto, scikit-learn proporciona una implementación más sofisticada y optimizada de K-vecinos más cercanos en la clase KNeighborsClassifier, pero esta versión simplificada ilustra los principios subyacentes.

5.3 Object Oriented Programming & Python Classes (L05: Machine Learning with Scikit-Learn)
5.3 Object Oriented Programming & Python Classes (L05: Machine Learning with Scikit-Learn)
  • 2020.09.27
  • www.youtube.com
In my opinion, the scikit-learn machine learning library is one of the best-designed Python libraries out there. It heavily relies on object oriented program...
 

5.4 Introducción a Scikit-learn (L05: Aprendizaje automático con Scikit-Learn)



5.4 Introducción a Scikit-learn (L05: Aprendizaje automático con Scikit-Learn)

En este video relativamente corto, el objetivo es presentar el aprendizaje automático con scikit-learn. Scikit-learn es una biblioteca de aprendizaje automático ampliamente utilizada en Python que proporciona un conjunto integral de herramientas y algoritmos para diversas tareas de aprendizaje automático. Si bien es posible que haya visto scikit-learn antes en el contexto de las conferencias k-vecino más cercano (KNN), este video tiene como objetivo dar un paso atrás y presentar adecuadamente la biblioteca.

Después de este breve video, habrá un video más largo que profundiza en la preparación del conjunto de datos de entrenamiento usando scikit-learn. Esto cubrirá técnicas y herramientas que hacen que la preparación de datos sea más conveniente y eficiente en comparación con los enfoques tradicionales.

En el siguiente video, exploraremos algunos de los conceptos geniales de scikit-learn, como la combinación de técnicas de preprocesamiento, ajuste de clasificador de aprendizaje automático y capacitación, utilizando canalizaciones de scikit-learn. Esto permite un flujo de trabajo más ágil y eficiente.

Ahora, analicemos el aprendizaje automático con scikit-learn con más detalle. Scikit-learn es ampliamente considerada la principal biblioteca de aprendizaje automático para Python debido a su reputación establecida, su gran base de usuarios y su naturaleza fácil de usar. Es una biblioteca bien diseñada que ofrece una API consistente e intuitiva. Scikit-learn también se mantiene activamente y se actualiza regularmente, con numerosos colaboradores que lo convierten en una opción sólida y confiable para las tareas de aprendizaje automático.

Es importante tener en cuenta que scikit-learn se centra principalmente en las técnicas tradicionales de aprendizaje automático y no está diseñado para el aprendizaje profundo. El aprendizaje profundo es un campo separado con sus propias bibliotecas especializadas. Para el aprendizaje profundo, normalmente se usan otras bibliotecas como TensorFlow o PyTorch. Sin embargo, para las tareas tradicionales de aprendizaje automático, scikit-learn suele ser la biblioteca de referencia.

Scikit-learn ha existido por un tiempo, con su lanzamiento inicial que data de 2007. A pesar de su antigüedad, sigue siendo una biblioteca popular y mantenida activamente. Comenzó como un proyecto Google Summer of Code de David Cournapeau y obtuvo contribuciones de muchos otros desarrolladores a lo largo del tiempo. Con más de 1875 colaboradores en GitHub y casi 150 000 usuarios, es evidente que scikit-learn es una biblioteca de gran prestigio con un importante apoyo de la comunidad.

Puede encontrar el sitio web oficial de scikit-learn, que incluye documentación, tutoriales y otros recursos útiles. Si usa scikit-learn en sus proyectos de investigación, es una buena práctica citar la biblioteca como referencia, reconociendo los esfuerzos realizados en su desarrollo.

Para comprender la API Estimator de scikit-learn, profundicemos en sus componentes principales. La API Estimator se usa para tareas de aprendizaje supervisado e incluye regresores para análisis de regresión y clasificadores para tareas de clasificación. Cuando usa scikit-learn, normalmente inicializa un estimador con hiperparámetros específicos, que se establecen en el constructor de la clase.

El proceso de ajuste es crucial para un estimador. Después de la inicialización, debe llamar al método de ajuste, proporcionando los datos de entrenamiento (características) y sus etiquetas correspondientes. El método de ajuste entrena al estimador en los datos dados, lo que le permite hacer predicciones más adelante. Durante el proceso de ajuste, se asignan ciertos atributos al estimador, indicados por un guión bajo al final, lo que indica que se crean durante el ajuste del modelo.

Una vez que se ajusta el modelo, puede usar el método de predicción para hacer predicciones sobre nuevos datos. El método de predicción toma los datos de prueba (con las mismas características que los datos de entrenamiento) como entrada y devuelve las etiquetas predichas.

Además, scikit-learn proporciona un método de puntuación que calcula el rendimiento del modelo. Para los clasificadores, a menudo representa la precisión, mientras que para los regresores, normalmente calcula el coeficiente de determinación (puntuación R^2). Este método sirve como una forma conveniente de evaluar el rendimiento del modelo.

Además de estos componentes principales, scikit-learn también ofrece una amplia gama de técnicas y utilidades de preprocesamiento para mejorar su flujo de trabajo de aprendizaje automático.

Un aspecto importante del aprendizaje automático es el preprocesamiento de datos, que implica transformar datos sin procesar en un formato adecuado para entrenar un modelo. Scikit-learn proporciona varios módulos de preprocesamiento que pueden manejar tareas como el escalado de características, el manejo de valores faltantes, la codificación de variables categóricas y más.

Por ejemplo, la clase StandardScaler se puede usar para estandarizar características restando la media y escalando a la varianza de la unidad. Esto es importante cuando se trabaja con entidades que tienen diferentes escalas, ya que ayuda a que los algoritmos converjan más rápido y produzcan resultados más precisos.

Otra técnica útil de preprocesamiento es el manejo de valores faltantes. La clase SimpleImputer proporciona estrategias para reemplazar los valores faltantes con alternativas adecuadas, como usar la media, la mediana o los valores más frecuentes de las características correspondientes.

Cuando se trata de variables categóricas, scikit-learn ofrece las clases OneHotEncoder y LabelEncoder. LabelEncoder convierte las etiquetas categóricas en valores numéricos, mientras que OneHotEncoder transforma las características categóricas en una representación vectorial binaria, lo que permite que los algoritmos trabajen con datos categóricos de manera eficaz.

Para agilizar su flujo de trabajo de aprendizaje automático, scikit-learn proporciona una poderosa herramienta llamada canalizaciones. Una canalización combina varios pasos de preprocesamiento y un modelo de aprendizaje automático en un solo objeto, lo que facilita la administración y la aplicación uniforme de todo el flujo de trabajo.

Las canalizaciones garantizan que los mismos pasos de preprocesamiento se apliquen de manera uniforme tanto a los conjuntos de datos de entrenamiento como de prueba, lo que evita la fuga de datos y posibles errores. También simplifican el proceso de implementación, ya que puede guardar todo el objeto de canalización y reutilizarlo en nuevos datos sin preocuparse por los pasos de preprocesamiento individuales.

Mediante el uso de la funcionalidad de canalización de scikit-learn, puede encadenar varias técnicas de preprocesamiento, como el escalado, la imputación de valores faltantes y la codificación de variables categóricas, con su modelo de aprendizaje automático deseado. Esto da como resultado un flujo de trabajo más optimizado y eficiente, lo que le permite concentrarse en los aspectos centrales de su proyecto de aprendizaje automático.

Scikit-learn admite una amplia gama de algoritmos de aprendizaje automático, que incluyen regresión lineal, regresión logística, máquinas de vectores de soporte, árboles de decisión, bosques aleatorios, aumento de gradiente y muchos más. Cada algoritmo se implementa como una clase de estimador con métodos coherentes como ajuste, predicción y puntuación.

Para seleccionar el algoritmo apropiado para su tarea, scikit-learn proporciona varias herramientas para la selección y evaluación de modelos. Estos incluyen técnicas para validación cruzada, ajuste de hiperparámetros y métricas de evaluación de modelos. La validación cruzada ayuda a evaluar el rendimiento de su modelo al dividir los datos en múltiples divisiones de prueba de entrenamiento, entrenar y evaluar el modelo en diferentes subconjuntos de datos.

El ajuste de hiperparámetros implica encontrar los valores óptimos para los hiperparámetros de un modelo, que son parámetros que no se aprenden de los datos, sino que se establecen antes del entrenamiento. Scikit-learn proporciona métodos como la búsqueda en cuadrícula y la búsqueda aleatoria para automatizar el proceso de búsqueda de los mejores valores de hiperparámetros.

Las métricas de evaluación del modelo, como la exactitud, la precisión, la recuperación, la puntuación F1 y el área bajo la curva ROC, son cruciales para evaluar el rendimiento de su modelo en diferentes tareas. Scikit-learn ofrece una amplia gama de métricas que se pueden calcular y comparar fácilmente.

Scikit-learn es una biblioteca de aprendizaje automático potente y popular en Python que proporciona una amplia gama de herramientas y algoritmos para diversas tareas de aprendizaje automático. Su API fácil de usar, su extensa documentación y su comunidad activa lo convierten en una excelente opción tanto para principiantes como para profesionales experimentados. Ya sea que necesite preprocesar sus datos, crear canalizaciones, seleccionar modelos o evaluar el rendimiento, scikit-learn tiene las herramientas que necesita para realizar el trabajo de manera eficiente y eficaz.

5.4 Intro to Scikit-learn (L05: Machine Learning with Scikit-Learn)
5.4 Intro to Scikit-learn (L05: Machine Learning with Scikit-Learn)
  • 2020.09.30
  • www.youtube.com
Finally! It's about time to introduce my favorite machine learning library! Jupyter Notebook: https://github.com/rasbt/stat451-machine-learning-fs20/blob/ma...
 

5.5 Scikit-learn Transformer API (L05: Machine Learning with Scikit-Learn)


5.5 Scikit-learn Transformer API (L05: Machine Learning with Scikit-Learn)

In the video, the presenter delves into the process of preparing a training data set using utilities from scikit-learn and introduces the transformer API, which is closely related to the estimator API discussed in a previous video. The estimator API is primarily used for supervised learning models such as classifiers and regression analysis models, while the transformer API is designed for data transformations.

The presenter begins by addressing the issues associated with random sub-sampling, which involves dividing a data set into two subsets, typically a training set and a test set. They explain that randomly dividing the data set can lead to changes in the distribution of class labels, resulting in a misrepresentation of classes in both the training and test sets. To overcome this challenge, the presenter suggests using stratified splitting, which ensures that the class distribution or proportions are maintained in the subsets. They proceed to demonstrate how to achieve stratified splitting using the train_test_split function from scikit-learn's model_selection sub-module.

Moving on, the presenter delves into the concept of data normalization, with a specific focus on two techniques: min-max scaling and standardization. Min-max scaling involves scaling a feature so that all its values fall within the range of 0 to 1. The presenter provides the formula for min-max scaling, which entails subtracting each value in the feature column by the minimum feature value and then dividing it by the difference between the maximum and minimum feature values.

In contrast, standardization involves transforming a feature to have a mean of zero and a standard deviation of one. The presenter explains the formula for standardization, which consists of subtracting each value in the feature column by the mean of the feature and then dividing it by the standard deviation of the feature. They mention that standardization is more commonly used in machine learning and is particularly useful for certain optimization algorithms.

To illustrate the practical application of min-max scaling and standardization, the presenter provides examples using toy feature columns. They emphasize that the choice between using the sample or population standard deviation does not significantly impact machine learning outcomes, as long as the features are centered and have approximately unit variance. Additionally, they highlight the importance of using the parameters (mean and standard deviation) computed from the training set to scale the validation and test sets since the validation and test sets represent unseen data.

The video proceeds to explore various techniques for data transformation and handling in machine learning. It acknowledges that for simple procedures like standardization, it is feasible to perform the transformations manually without relying on separate libraries or advanced techniques. However, for more complex transformations like feature selection, feature dimensionality reduction, and feature extraction, using tools such as the Transformer API can offer greater convenience and efficiency.

Next, the presenter focuses on dealing with categorical data. They introduce a toy dataset comprising three feature columns and one label column, emphasizing that categorical variables can be classified into two types: ordinal and nominal. Ordinal variables possess a specific order or hierarchy, while nominal variables do not. As an illustration, they highlight the "size" column as an ordinal variable, where t-shirt sizes like M, L, and XXL exhibit a clear order. To handle ordinal variables, the video recommends employing a mapping dictionary to transform the values into numeric representations.

On the other hand, the video presents class labels as an example of nominal categorical data. Since there is no inherent order among class labels, the presenter suggests using the label encoder to assign unique integer values to each label. The label encoder is fitted on the class label column to create a mapping dictionary, which is then used to transform the string labels into integer labels.

For nominal feature columns like "color," where no order is implied, utilizing the label encoder may introduce misleading information. In such cases, the video introduces one-hot encoding as a suitable alternative. This technique involves creating a new feature column for each distinct value in the nominal feature column and assigning 0s and 1s to indicate the presence or absence of a particular value. It is mentioned that dropping one of the resulting feature columns can eliminate redundancy without losing essential information.

The video briefly touches upon missing data and proposes some basic approaches to handle it. One strategy involves dropping rows or columns containing missing values if they occur randomly and are not indicative of a systematic issue. This can be accomplished using the dropna() method in the pandas library. Another approach is to impute missing data by filling in the gaps with statistical measures such as the mean or median, employing tools like the SimpleImputer transformer. However, the video cautions that imputation should be carefully considered, as it may introduce unintended biases.

Additionally, the video mentions the possibility of predicting missing values by treating the problem as a supervised learning task. In this scenario, the missing feature column can be considered the target variable, and the rows without missing data can be utilized as training data to fit a regression model.

The video provides a comprehensive overview of data transformation techniques, including the importance of preparing a training data set, the application of stratified splitting, and the normalization of data using min-max scaling and standardization. It further covers handling categorical data, distinguishing between ordinal and nominal variables, and introduces techniques such as mapping dictionaries, label encoders, and one-hot encoding. Additionally, the video briefly addresses missing data and outlines approaches such as dropping or imputing missing values, while also mentioning the possibility of predicting missing values through supervised learning.

5.5 Scikit-learn Transformer API (L05: Machine Learning with Scikit-Learn)
5.5 Scikit-learn Transformer API (L05: Machine Learning with Scikit-Learn)
  • 2020.09.30
  • www.youtube.com
After talking about scikit-learn estimators (like classifiers), this video now introduced the concept of Transformers in scikit-learn. No, we are not talking...
Razón de la queja: