ScikitLearn
Tutorial ScikitLearn: Normalización de datos
Scikit-Learn: Aprende a normalizar datos con `Normalizer`. Entiende las diferencias con el escalado y cómo usar normas L1 y L2 para optimizar tus modelos de aprendizaje automático.
Aprende ScikitLearn GRATIS y certifícate¿Qué es la normalización y en qué se diferencia del escalado?
En el preprocesamiento de datos, la normalización es una técnica utilizada para ajustar las muestras individuales de un conjunto de datos de manera que cada una tenga una norma unitaria. Esto significa que se escala cada muestra (fila) para que la longitud de su vector sea uno, preservando la dirección pero no la magnitud de los datos.
Por otro lado, el escalado se refiere al proceso de ajustar las características o variables (columnas) para que sigan una escala común. Esto suele hacerse para que las características tengan un rango específico, como [0, 1] en el caso de MinMaxScaler
, o una media cero y desviación estándar uno con StandardScaler
.
Es fundamental distinguir entre normalización y escalado porque afectan diferentes aspectos del conjunto de datos. Mientras que la normalización se aplica a las muestras individuales, el escalado transforma las características. Esta diferencia es crucial al seleccionar técnicas de preprocesamiento para algoritmos que son sensibles a la magnitud de los datos.
Por ejemplo, en algoritmos basados en la distancia euclidiana, como los k vecinos más cercanos, el escalado de características es esencial para asegurar que todas contribuyan equitativamente. En cambio, para algoritmos que se basan en la similitud de coseno, la normalización de las muestras es más apropiada porque se enfoca en la dirección de los vectores.
A continuación, se presenta un ejemplo que ilustra estas diferencias utilizando Scikit-Learn:
from sklearn.preprocessing import Normalizer, StandardScaler
import numpy as np
# Datos de ejemplo
X = np.array([[1., 2.],
[3., 4.],
[5., 6.]])
# Aplicando normalización
normalizer = Normalizer()
X_normalizado = normalizer.fit_transform(X)
print("Datos normalizados:")
print(X_normalizado)
# Aplicando escalado estándar
scaler = StandardScaler()
X_escalado = scaler.fit_transform(X)
print("\nDatos escalados:")
print(X_escalado)
En este código, Normalizer
ajusta cada muestra para que su norma sea igual a uno, lo que afecta a las filas de la matriz de datos. Por otro lado, StandardScaler
transforma las características para que tengan una media cero y una desviación estándar unitaria, ajustando las columnas de la matriz.
La elección entre normalización y escalado depende del algoritmo de aprendizaje automático que se vaya a utilizar y de las necesidades específicas del análisis. Comprender esta distinción es esencial para realizar un preprocesamiento adecuado y mejorar el rendimiento del modelo.
Normalizer en Scikit-Learn
El módulo Normalizer
de Scikit-Learn es una herramienta esencial para la normalización de datos en aplicaciones de aprendizaje automático. A diferencia de otros escaladores que se aplican a las características (columnas), Normalizer
actúa sobre las muestras individuales (filas), ajustando cada una para que su norma sea igual a uno.
El uso de Normalizer
es especialmente útil cuando el patrón de interés depende más de la dirección que de la magnitud de los vectores de características. Esto es común en técnicas como el análisis de texto con modelos de bolsa de palabras o en situaciones donde la similitud del coseno es una medida relevante.
A continuación, se muestra cómo utilizar Normalizer
en un conjunto de datos con Scikit-Learn:
from sklearn.preprocessing import Normalizer
import numpy as np
# Datos de ejemplo
X = np.array([[4, 1, 2, 2],
[1, 3, 9, 3],
[5, 7, 5, 1]])
# Crear una instancia de Normalizer
normalizador = Normalizer()
# Ajustar y transformar los datos
X_normalizado = normalizador.fit_transform(X)
print("Datos original:")
print(X)
print("\nDatos normalizados:")
print(X_normalizado)
En este código, primero importamos la clase Normalizer
y creamos una instancia llamada normalizador
. Al aplicar el método fit_transform
sobre los datos X
, obtenemos una versión normalizada de los mismos, almacenada en X_normalizado
.
La salida mostrará que cada muestra ha sido ajustada para que su norma euclidiana sea uno. Esto se logra dividiendo cada elemento de la muestra entre la norma de la misma.
Es posible especificar diferentes tipos de normas mediante el parámetro norm
. Por defecto, se utiliza la norma L2, pero se pueden utilizar otras, como la norma L1 o la norma máxima. Por ejemplo:
# Normalización utilizando la norma L1
normalizador_l1 = Normalizer(norm='l1')
X_normalizado_l1 = normalizador_l1.fit_transform(X)
print("\nDatos normalizados con norma L1:")
print(X_normalizado_l1)
Este código aplica la norma L1, lo que ajusta las muestras para que la suma de los valores absolutos sea uno. La elección de la norma adecuada depende de la naturaleza de los datos y del algoritmo de aprendizaje utilizado.
Es importante destacar que Normalizer
se encuentra en el módulo sklearn.preprocessing
, junto con otras herramientas de preprocesamiento como StandardScaler
y MinMaxScaler
. Sin embargo, mientras que estos escaladores operan sobre las características, Normalizer
se enfoca en las muestras, lo que tiene implicaciones significativas en el comportamiento del modelo.
Además de utilizar Normalizer
de forma aislada, es común integrarlo en un pipeline de preprocesamiento. Esto garantiza que la normalización se aplique de manera consistente durante la validación cruzada y en la producción. Un ejemplo de cómo crear un pipeline con Normalizer
es el siguiente:
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression
# Crear un pipeline que incluye el normalizador y un modelo
pipeline = make_pipeline(Normalizer(), LogisticRegression(), memory = None)
# Datos de ejemplo
X = np.array([[4, 1, 2, 2],
[1, 3, 9, 3],
[5, 7, 5, 1]])
y = np.array([0, 1, 0])
# Entrenar el modelo utilizando el pipeline
pipeline.fit(X, y)
# Realizar predicciones
predicciones = pipeline.predict(X)
print("\nPredicciones del modelo:")
print(predicciones)
En este ejemplo, se crea un pipeline que primero aplica la normalización y luego entrena un modelo de regresión logística. Esto asegura que cualquier dato que pase por el pipeline sea normalizado antes de ser procesado por el modelo.
Al utilizar Normalizer
, es crucial comprender que los valores atípicos en las muestras pueden afectar significativamente el resultado, ya que cada muestra se escala independientemente. Por lo tanto, es recomendable analizar los datos y considerar si la normalización por muestras es adecuada para el problema específico.
En resumen, el uso de Normalizer
en Scikit-Learn proporciona una forma eficiente de normalizar muestras individuales, lo que puede mejorar el rendimiento de ciertos algoritmos de aprendizaje automático que son sensibles a la orientación de los datos más que a su magnitud. Su correcta aplicación es esencial para garantizar la calidad y fiabilidad de los modelos desarrollados.
Normalización por L1 y L2
La normalización es un proceso que ajusta las muestras individuales de datos para que cumplan ciertas propiedades matemáticas. En particular, la normalización por L1 y L2 se refiere a la aplicación de normas matemáticas para escalar los vectores de características. Estas normas son fundamentales en el preprocesamiento de datos y afectan directamente al rendimiento de los algoritmos de aprendizaje automático.
- La norma L1, también conocida como norma de Manhattan, ajusta cada muestra para que la suma de los valores absolutos de sus características sea igual a uno. Esto se logra dividiendo cada elemento de la muestra entre la suma de los valores absolutos de todos los elementos de esa muestra. La norma L1 es especialmente útil cuando se desea promover la esparsidad en los datos, ya que tiende a generar vectores con más ceros.
- Por otro lado, la norma L2, o norma euclidiana, ajusta cada muestra para que la raíz cuadrada de la suma de los cuadrados de sus características sea uno. Esto implica que se divide cada elemento de la muestra entre su norma euclidiana. La norma L2 es adecuada cuando se quiere mantener la magnitud relativa de las características, ya que penaliza más los valores extremos.
En Scikit-Learn, el uso de la normalización por L1 y L2 se puede implementar fácilmente utilizando el transformador Normalizer
del módulo sklearn.preprocessing
junto con el parámetro norm
. A continuación, se muestra cómo aplicar ambas normas a un conjunto de datos de ejemplo:
from sklearn.preprocessing import Normalizer
import numpy as np
# Datos de ejemplo
X = np.array([[0, 1, 2, 3],
[1, 2, 3, 4],
[2, 0, 1, 1]])
# Normalización con la norma L1
normalizador_l1 = Normalizer(norm='l1')
X_normalizado_l1 = normalizador_l1.fit_transform(X)
print("Datos normalizados con la norma L1:")
print(X_normalizado_l1)
En este código, se especifica el parámetro norm='l1'
para aplicar la norma L1. El resultado es que cada muestra se escala de manera que la suma de los valores absolutos sea uno. Este tipo de normalización es útil en problemas donde la suma total tiene un significado relevante, como en distribuciones de probabilidad.
Para aplicar la norma L2, se puede utilizar el mismo transformador cambiando el parámetro norm
a 'l2'
o simplemente omitiéndolo, ya que 'l2'
es el valor por defecto:
# Normalización con la norma L2
normalizador_l2 = Normalizer(norm='l2')
X_normalizado_l2 = normalizador_l2.fit_transform(X)
print("\nDatos normalizados con la norma L2:")
print(X_normalizado_l2)
La norma L2 ajusta las muestras para que la norma euclidiana sea uno. Esto es especialmente relevante en algoritmos que utilizan la distancia euclidiana como métrica de similitud, ya que asegura que todas las muestras estén en la misma escala sin alterar su dirección.
Es importante destacar las diferencias prácticas entre ambas normalizaciones. La norma L1 tiende a generar vectores más esparsos, lo que puede ser beneficioso en modelos donde la esparsidad es deseable. Por ejemplo, en el procesamiento de lenguaje natural, la normalización L1 puede ayudar a destacar las palabras más significativas al reducir la influencia de las menos importantes.
En contraste, la norma L2 mantiene la relación proporcional entre las características. Esto es útil en contextos donde la magnitud relativa de las características es importante. Un ejemplo común es en algoritmos como k-Nearest Neighbors, donde la similitud entre muestras se calcula en función de la distancia euclidiana.
A continuación, se muestra un ejemplo comparativo de ambas normalizaciones:
import pandas as pd
# Crear un DataFrame para visualizar los datos
columnas = ['Característica 1', 'Característica 2', 'Característica 3', 'Característica 4']
# Datos originales
df_original = pd.DataFrame(X, columns=columnas)
print("Datos originales:")
print(df_original)
# Datos normalizados con norma L1
df_l1 = pd.DataFrame(X_normalizado_l1, columns=columnas)
print("\nDatos normalizados con norma L1:")
print(df_l1)
# Datos normalizados con norma L2
df_l2 = pd.DataFrame(X_normalizado_l2, columns=columnas)
print("\nDatos normalizados con norma L2:")
print(df_l2)
Este código utiliza pandas para crear dataframes y visualizar claramente las diferencias entre los datos originales y los normalizados. Al analizar los resultados, se puede observar cómo la normalización afecta a las muestras:
- Con la norma L1, las sumas de los valores absolutos de cada fila son exactamente uno.
- Con la norma L2, la suma de los cuadrados de cada fila es uno.
La elección entre la norma L1 y L2 depende del algoritmo de aprendizaje y de las características específicas de los datos. Es recomendable experimentar con ambas normalizaciones y evaluar su impacto en el rendimiento del modelo.
Además de utilizar el transformador Normalizer
, es posible aplicar la normalización por L1 y L2 en otros componentes de Scikit-Learn. Por ejemplo, en regularización de modelos lineales, las normas L1 y L2 se utilizan para penalizar los coeficientes y evitar el sobreajuste. Sin embargo, en este contexto, las normas se aplican de manera diferente y cumplen otro propósito.
Finalmente, es importante recordar que la normalización por L1 y L2 es un paso crucial en el pipeline de preprocesamiento. Integrar este paso correctamente puede mejorar significativamente la eficacia y eficiencia de los modelos de aprendizaje automático.
Cuándo se debe normalizar
La normalización de datos es un paso crítico en el preprocesamiento que puede afectar significativamente el rendimiento de los algoritmos de aprendizaje automático. Se debe considerar la normalización cuando las muestras tienen diferentes escalas o unidades, y especialmente cuando se utilizan algoritmos que son sensibles a la magnitud de los vectores de características, pero donde la dirección importa más que la magnitud.
La normalización es especialmente importante en algoritmos basados en medidas de similitud o distancia angular, como la similitud de coseno. Por ejemplo, en tareas de clasificación de textos o análisis de documentos, donde la frecuencia de términos puede variar ampliamente entre documentos, normalizar las muestras ayuda a comparar documentos en base a la distribución de términos más que a su cantidad total.
En algoritmos como K Nearest Neighbors (KNN), la normalización puede ser fundamental. Aunque KNN típicamente utiliza distancias euclidianas y, por lo tanto, el escalado de características suele ser suficiente, si se opta por usar la distancia de coseno como métrica, es imprescindible normalizar las muestras para obtener resultados significativos.
Otro caso donde se debe aplicar la normalización es en modelos de redes neuronales que utilizan funciones de activación sensibles a la escala de entrada. Normalizar los datos puede conducir a una convergencia más rápida y a mejorar la estabilidad del entrenamiento. La normalización asegura que los pesos iniciales se encuentren en un rango adecuado, evitando problemas con gradientes demasiado grandes o pequeños.
En problemas de recomendación y análisis de redes sociales, donde se manejan matrices dispersas con recuentos o interacciones, la aplicación de la normalización puede resaltar patrones de comportamiento al ajustar las muestras para que sean comparables en términos relativos y no absolutos.
Es importante diferenciar entre normalización y estandarización. Mientras que la estandarización ajusta las características para que tengan una media cero y una desviación estándar unitaria, la normalización escala las muestras individuales para que tengan una norma unitaria. La elección entre una u otra depende del algoritmo y del problema en cuestión.
A continuación, se muestra un ejemplo práctico donde la normalización mejora el rendimiento de un modelo de clustering:
from sklearn.preprocessing import Normalizer
from sklearn.cluster import KMeans
import numpy as np
# Generar datos de ejemplo con diferente escala
np.random.seed(42)
X = np.random.rand(100, 2) * [1, 100]
# Sin normalización
kmeans = KMeans(n_clusters=3, random_state=42)
labels_no_norm = kmeans.fit_predict(X)
# Con normalización
normalizer = Normalizer()
X_normalizado = normalizer.fit_transform(X)
labels_norm = kmeans.fit_predict(X_normalizado)
En este código, los datos en X
tienen características en diferentes escalas. Sin normalización, el algoritmo KMeans puede verse influenciado más por la característica con mayor magnitud. Al aplicar Normalizer
, ajustamos cada muestra para que tenga norma unitaria, permitiendo que el algoritmo considere ambas características de manera equitativa.
La normalización también es recomendable cuando se utilizan técnicas de reducción de dimensionalidad basadas en descomposiciones matriciales donde la orientación de los datos es relevante. Por ejemplo, en Análisis de Componentes Principales (PCA) aplicado a datos donde la magnitud no es relevante, normalizar las muestras puede ayudar a capturar las direcciones más significativas.
Sin embargo, no siempre es apropiado normalizar. En escenarios donde la magnitud de las características es importante para el modelo, aplicar normalización podría eliminar información relevante. Por lo tanto, es esencial entender el contexto del problema y las características del algoritmo antes de decidir si se debe aplicar normalización.
Se debe considerar la normalización cuando:
- Los algoritmos utilizados son sensibles a la dirección de los vectores y no a su magnitud.
- Las muestras tienen escalas o unidades heterogéneas que pueden afectar el rendimiento del algoritmo.
- Se emplean métricas de similitud basadas en ángulos, como la similitud de coseno.
- Se busca mejorar la convergencia y estabilidad en el entrenamiento de ciertos modelos.
Siempre es recomendable realizar un análisis exploratorio de datos y probar el efecto de la normalización en el rendimiento del modelo, para determinar si es beneficiosa en el caso específico.
Ejercicios de esta lección Normalización de datos
Evalúa tus conocimientos de esta lección Normalización de datos con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Todas las lecciones de ScikitLearn
Accede a todas las lecciones de ScikitLearn y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Aprendizaje Automático
Introducción Y Entorno
Introducción E Instalación
Introducción Y Entorno
Introducción Al Preprocesamiento De Datos
Preprocesamiento De Datos
Identificación Y Tratamiento De Valores Faltantes
Preprocesamiento De Datos
Escalado De Datos
Preprocesamiento De Datos
Normalización De Datos
Preprocesamiento De Datos
Codificación De Variables Categóricas
Preprocesamiento De Datos
Ingeniería De Características
Preprocesamiento De Datos
Selección De Características
Preprocesamiento De Datos
Extracción De Características
Preprocesamiento De Datos
Particionamiento De Datos
Preprocesamiento De Datos
Preprocesamiento De Datos Desbalanceados
Preprocesamiento De Datos
Introducción A La Regresión
Regresión
Regresión Lineal
Regresión
Regresión Knn Kneighborsregressor
Regresión
Regresión Svm Con Svr
Regresión
Regresión Con Árboles Decisiontreeregressor
Regresión
Regresión Con Algoritmos De Conjunto
Regresión
Introducción A La Clasificación
Clasificación
Clasificación Con Regresión Logística
Clasificación
Clasificación Knn Kneighborsclassifier
Clasificación
Clasificación Svm Con Svc
Clasificación
Clasificación Con Árboles Decisiontreeclassifier
Clasificación
Clasificación Con Algoritmos De Conjunto
Clasificación
Reducción De La Dimensionalidad Con Pca
Aprendizaje No Supervisado
Clustering Con Kmeans
Aprendizaje No Supervisado
Clustering Jerárquico
Aprendizaje No Supervisado
Clustering De Densidad Con Dbscan
Aprendizaje No Supervisado
Preprocesamiento De Textos Para Nlp
Nlp
Representación De Texto Y Extracción De Características
Nlp
Clasificación De Texto Con Scikit Learn
Nlp
Análisis De Sentimiento
Nlp
Técnicas Avanzadas De Extracción De Características
Nlp
Introducción Al Análisis De Series Temporales
Series Temporales
Preprocesamiento De Datos De Series Temporales
Series Temporales
Ingeniería De Características Para Series Temporales
Series Temporales
Transformación Y Escalado De Series Temporales
Series Temporales
Validación Y Evaluación De Modelos En Series Temporales
Series Temporales
Validación Y Evaluación De Modelos
Validación De Modelos
Técnicas De Validación Cruzada
Validación De Modelos
Métricas De Regresión
Validación De Modelos
Métricas De Clasificación
Validación De Modelos
Ajuste De Hiperparámetros
Validación De Modelos
Introducción A Pipelines
Pipelines Y Despliegue
Creación De Pipelines Básicos
Pipelines Y Despliegue
Preprocesamiento De Datos Con Pipelines
Pipelines Y Despliegue
Pipelines Y Validación Cruzada
Pipelines Y Despliegue
Pipelines Con Columntransformer
Pipelines Y Despliegue
Exportar E Importar Pipelines
Pipelines Y Despliegue
Objetivos de aprendizaje de esta lección
- Comprender qué es la normalización en el preprocesamiento de datos y su diferencia con el escalado.
- Aprender a utilizar el módulo
Normalizer
de Scikit-Learn para normalizar muestras de datos. - Entender la aplicación de normas L1 y L2 en la normalización y sus implicaciones prácticas.
- Identificar cuándo es apropiado aplicar normalización en el aprendizaje automático.
- Implementar ejemplos prácticos de normalización usando Python y Scikit-Learn.