- 1. Introducción
- 2. Ejemplos prácticos de funciones de transformación con sklearn.preprocessing
- 2.1. Datos numéricos
- 2.1.1. StandardScaler
- 2.1.2. MinMaxScaler
- 2.1.3. RobustScaler
- 2.2. Datos categóricos
- 2.2.1. OneHotEnconder
- 2.2.2. OrdinalEncoder
- 2.3. Texto
- 2.3.1. CountVectorizer
- 2.4. Imágenes
- 2.5. Feature Engineering
- 2.1. Datos numéricos
1. Introducción
Documentación: pdf/Preprocesamiento%20de%20datos.pdf
Vídeo:
La primera fase del ML es el preprocesamiento de los datos.
¿Cómo funciona un algoritmo ML?

Es habitual que los datos de entrada estén representados en un dataset con un DataFrame de Pandas.
La información se la introduciremos al algoritmo de ML (se produce un ajuste o fit) y este será capaz de generar predicciones para nuevos datos de entrada.
Tipos de datos:

Preprocesamiento de datos:

Fases involucradas en el preprocesamiento de datos (Fuente): Limpieza (limpieza datos ausentes, ruido y/o valores atípicos), transformación (normalización, estándarización, …) y reducción.

Nuestro dataset está formado por características (features) que son valores X, y la variable objetivo (etiqueta) comunmente llamada Y.

Tipos de variable, variable discreta y variable continua.
- Discreta: acepta valores permitidos dentro de un conjunto (clasificación).
- Continua: una variable continua toma valores a lo largo de un continuo, esto es, en todo un intervalo de valores.
2. Ejemplos prácticos de funciones de transformación con sklearn.preprocessing


2.1. Datos numéricos
2.1.1. StandardScaler
La clase sklearn.preprocessing.StandardScaler estándariza los datos eliminando la media y escalando los datos de forma que su varianza sea igual a 1. Este tipo de escalado suele denominarse frecuentemente “normalización” de los datos.


Código completo: src/01.py.
# python3 -m pip install scikit-learn
from sklearn.preprocessing import StandardScaler
import numpy as np
# Datos de ejemplo
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# Crear una instancia del StandardScaler
scaler = StandardScaler()
# Ajustar el escalador a los datos y transformarlos
data_estandarizada = scaler.fit_transform(data)
# Imprimir los datos estandarizados
print("Datos estandarizados:")
print(data_estandarizada)
Salida:
Datos estandarizados:
[[-1.22474487 -1.22474487 -1.22474487]
[ 0. 0. 0. ]
[ 1.22474487 1.22474487 1.22474487]]
En este ejemplo, tenemos una matriz de datos con 3 características y 3 muestras para cada una. Creamos una instancia de StandardScaler y luego ajustamos el escalador a los datos llamando al método fit_transform(). Esto calcula la media y la desviación estándar de cada característica y luego estandariza los datos restando la media y dividiendo por la desviación estándar.
Después de estandarizar los datos, imprimimos los resultados. Verás que las características ahora tienen una media de cero y una desviación estándar de uno. Esto es el resultado de la estandarización realizada por StandardScaler.
Recuerda que StandardScaler se utiliza para estandarizar características numéricas continuas. Si tienes características categóricas o características binarias, debes considerar otras técnicas de preprocesamiento de datos.
Puedes encontrar otro ejemplo completo aquí: src/02.py.
2.1.2. MinMaxScaler
El escalador sklearn.preprocessing.MinMaxScaler transforma las características escalándolas a un rango dado, por defecto (0,1), aunque puede ser personalizado. Este tipo de escalado suele denominarse frecuentemente “escalado” de los datos.


Ejemplo: src/03.py
2.1.3. RobustScaler
El escalador sklearn.preprocessing.RobustScaler aplica un escalado a las características de forma que sea más robusto a los valores atípicos o outliers.


2.2. Datos categóricos
2.2.1. OneHotEnconder


Ejemplo usado en la presentación de arriba src/06.py.
Otro ejemplo más src/05.py:
from sklearn.preprocessing import OneHotEncoder
import numpy as np
# Creamos una matriz de características categóricas
datos_categoricos = np.array([['Rojo'], ['Verde'], ['Azul'], ['Verde']])
# Creamos una instancia del OneHotEncoder
encoder = OneHotEncoder()
# Ajustamos y transformamos los datos
datos_codificados = encoder.fit_transform(datos_categoricos).toarray()
# Imprimimos los datos codificados
print(datos_codificados)
Salida:
[[0. 1. 0.]
[0. 0. 1.]
[1. 0. 0.]
[0. 0. 1.]]
En este ejemplo, tenemos una matriz datos_categoricos con una única columna que contiene las categorías ‘Rojo’, ‘Verde’, ‘Azul’ y ‘Verde’. Luego, creamos una instancia del OneHotEncoder y lo ajustamos a los datos categóricos utilizando el método fit_transform. Finalmente, convertimos los datos codificados en un array utilizando toarray().
El resultado son los datos codificados, donde cada categoría se representa como un vector binario. Por ejemplo, ‘Rojo’ se codifica como [0, 1, 0], ‘Verde’ se codifica como [0, 0, 1] y ‘Azul’ se codifica como [1, 0, 0].
Recuerda que el OneHotEncoder solo funciona con datos categóricos. Si tienes características numéricas continuas, puedes necesitar utilizar otras técnicas de codificación o escalado antes de aplicar el OneHotEncoder.
2.2.2. OrdinalEncoder


Ejemplo src/07.py:
from sklearn.preprocessing import OrdinalEncoder
import numpy as np
# Creamos una matriz de características categóricas
datos_categoricos = np.array([['Rojo'], ['Verde'], ['Azul'], ['Verde']])
# Creamos una instancia del OrdinalEncoder
encoder = OrdinalEncoder()
# Ajustamos y transformamos los datos
datos_codificados = encoder.fit_transform(datos_categoricos)
# Imprimimos los datos codificados
print(datos_codificados)
En este ejemplo, tenemos una matriz datos_categoricos con una única columna que contiene las categorías ‘Rojo’, ‘Verde’, ‘Azul’ y ‘Verde’. Luego, creamos una instancia del OrdinalEncoder y lo ajustamos a los datos categóricos utilizando el método fit_transform.
El resultado son los datos codificados, donde cada categoría se representa como un número ordinal. En este caso, ‘Rojo’ se codifica como 2, ‘Verde’ se codifica como 1 y ‘Azul’ se codifica como 0 (se codifican en orden alabético).
El OrdinalEncoder es útil cuando las categorías tienen un orden inherente, como en el caso de rangos o niveles, y deseas codificarlas según ese orden. Sin embargo, es importante tener en cuenta que el uso del OrdinalEncoder puede introducir un orden numérico artificial que podría afectar negativamente el rendimiento de algunos modelos de aprendizaje automático.
2.3. Texto
2.3.1. CountVectorizer


Ejemplo src/08.py:
from sklearn.feature_extraction.text import CountVectorizer
# Creamos una lista de documentos de texto
documentos = [
"El gato está sobre la mesa",
"El perro está debajo de la mesa",
"El ratón está junto a la mesa"
]
# Creamos una instancia de CountVectorizer
vectorizador = CountVectorizer()
# Ajustamos y transformamos los documentos
documentos_codificados = vectorizador.fit_transform(documentos)
# Obtener el vocabulario (palabras únicas)
vocabulario = vectorizador.get_feature_names_out()
# Imprimimos el vocabulario
print(vocabulario)
# Imprimimos la representación vectorial de los documentos
print(documentos_codificados.toarray())
Este código generará la siguiente salida:
['de' 'debajo' 'el' 'está' 'gato' 'junto' 'la' 'mesa' 'perro' 'ratón'
'sobre']
[[0 0 1 1 1 0 1 1 0 0 1]
[1 1 1 1 0 0 1 1 1 0 0]
[0 0 1 1 0 1 1 1 0 1 0]]
2.4. Imágenes


2.5. Feature Engineering
