Escalado y estandarización de variables con Python

En este tutorial te explico todo lo que necesitas saber para escalar y estandarizar tus variables numéricas en Python.

El escalado y estandarización de variables numéricas en machine learning se utiliza para cambiar los valores de las características numéricas en el conjunto de datos a una escala común, sin distorsionar las diferencias en los rangos de valores ni perder información.

Esto es especialmente útil cuando tus datos tienen variables que varían en escalas, o cuando usas algoritmos que asumen que todos los datos están centrados alrededor de 0 y tienen una varianza en la misma escala.

Aquí te explico de manera sencilla para qué sirven y las técnicas más efectivas para implementarlo en Python.

¿Para qué sirve escalar y estandarizar las características?

Algunos algoritmos de machine learning, especialmente aquellos que utilizan gradientes (te sonará el algoritmo de descenso de gradiente 😉) para encontrar el mínimo de una función, convergen más rápidamente si todas las características están en la misma escala.

Además, gracias a escalar las características conseguimos evitar que si una característica tiene un rango de valores mucho mayor que otra, domine cómo el algoritmo aprende, lo que podría llevar a un modelo inexacto.

Normalizando, te aseguras de que cada característica tenga la misma oportunidad de influir en el resultado final.

Por último, algunos modelos, como los que usan medidas de distancia (por ejemplo, K-NN o K-means clustering), asumen que todas las características están centradas alrededor de 0 y en la misma escala. Si no se normalizan las variables, estos modelos no funcionarán correctamente.

🔑  Modelos de Machine Learning sensibles a la escala de las características

Modelos basados en gradientes:

Cualquier algoritmo que utilice descenso del gradiente como método de optimización se beneficiará del escalado.

  • Regresión lineal y logística cuando se implementan con descenso del gradiente
  • Redes neuronales.

El escalado ayuda a que el descenso del gradiente converja más rápidamente, porque asegura que todas las características contribuyen proporcionalmente a la función de error.

Modelos basados en distancias:

  • K-NN: Este modelo clasifica nuevas instancias basadas en una medida de similitud (como la distancia euclidiana) con instancias conocidas. Si las características no están escaladas uniformemente, las características con rangos más grandes dominarán la medida de distancia, lo que puede llevar a un rendimiento pobre.
  • K-Means: Similar al K-NN, este algoritmo de clustering usa medidas de distancia para asignar puntos a clústeres. El escalado asegura que cada característica tenga igual importancia, evitando que las características con mayor varianza dominen.

Modelos de Máquinas de Soporte Vectorial (SVM):

  • SVM: Estos modelos construyen un hiperplano en un espacio multidimensional que mejor separa las clases. El escalado es importante en estos modelos porque las características con rangos mayores pueden influir desproporcionadamente en la determinación del hiperplano, especialmente porque SVM intenta maximizar el margen entre las clases cercanas al hiperplano.

Modelos de regularización:

  • Regresión Ridge y Lasso: Estos modelos son extensiones de la regresión lineal que incluyen términos de penalización para los coeficientes. La estandarización es importante aquí porque la penalización está influenciada por la escala de los coeficientes, que a su vez depende de la escala de las características.

Modelos de componentes principales:

  • Análisis de Componentes Principales (PCA): Aunque PCA no es un modelo de predicción en sí mismo, es una técnica común de reducción de dimensionalidad utilizada en preprocesamiento para muchos modelos de machine learning. 

Beneficios del escalado y estandarización de variables

Como ves, la utilidad y objetivo de esta transformación de datos depende del modelo de Machine Learning que vayamos a entrenar después con estas características.

Los beneficios que obtendremos al aplicar este tipo de transformación sobre las variables numéricas son los siguientes:

  • El escalado puede mejorar significativamente el rendimiento de los modelos que son sensibles a la magnitud de las características.
  • En algoritmos de optimización, como el descenso del gradiente, el escalado puede resultar en una convergencia más rápida hacia el mínimo global.
  • El escalado asegura que cada característica contribuya equitativamente al modelo.

En este tutorial vamos a utilizar el dataset Breast cancer Wisconsin (diagnosis) que está incluido en Scikit-learn.

Si quieres saber más sobre este dataset y sus características te explico más cosas aquí.

Sólo vamos a necesitar un Notebook de Google Colab.

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, RobustScaler, MinMaxScaler, MaxAbsScaler

cancer_data = load_breast_cancer()
data = pd.DataFrame(cancer_data.data,columns=cancer_data.feature_names)

data['target'] = cancer_data.target
data.head()

Escalado de características

El escalado ajusta el rango de las características para llevarlas a una escala común, sin cambiar la forma de la distribución de los datos. La finalidad es asegurar que ninguna característica domine sobre otras debido a la diferencia en las escalas.

Escalado min-max

Este escalado consigue transformar las características de manera que sus valores se muevan en el rango entre 0 y 1.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Primero ceramos una instancia del MinMaxScaler() con los parámetros por defecto. Este transformador ajusta los datos de manera que cada característica se escala linealmente entre los valores mínimo y máximo observados en los datos de entrenamiento.

Después, utilizando el método fit() y proporcionando el conjunto de entrenamiento como argumento, el transformador calcula los valores máximos y mínimos de cada característica. Estos valores se almacenan en los atributos data_max_, data_min_, y data_range_ del transformador.

Finalmente, usando el método transform(), el transformador aplica la transformación a los conjuntos de entrenamiento y prueba. El resultado es un array de Numpy, ahora normalizados entre 0 y 1, así que lo convertimos en un Dataframe de Pandas 🙂.

Escalado por máximo (max scaling)

Este método de escalado divide todos los valores por el valor máximo de la característica. Por tanto, el nuevo rango de valores de la característica tras esta transformación está entre -1 y 1.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Estandarización de características numéricas

La estandarización no solo escala los datos, sino que también los centra. Transforma las características para que tengan una media de cero y una desviación estándar de uno.

Normalización estándar con scikit-learn

El proceso es sencillo. Sólo tenemos que sustraer la media y dividir por la desviación típica 🙂.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Después, usamos StandardScaler() de Scikit-learn para estandarizar las características. Este transformador ajusta los datos de tal manera que cada característica tendrá una media de cero y una desviación estándar de uno.

Aplicamos el método fit() del transfromador que hemos creado al conjunto de entrenamiento para que aprenda la media y la desviación estándar de cada característica.

Los valores aprendidos se almacenan en los atributos mean_ y scale_ del transformador scaler.

Finalmente, utilizamos el método transform() del StandardScaler para aplicar la estandarización a las características del conjunto de entrenamiento y de prueba, basándonos en las medias y desviaciones estándar aprendidas. Esto asegura que la transformación se basa únicamente en los datos del conjunto de entrenamiento, manteniendo así la validez del proceso de prueba.

Normalización por la media (mean normalization)

Con esta transformación conseguimos centrar la distribución de la característica alrededor de cero y que sus valores estén en el rango entre -1 y 1.

Mean normalization con Pandas

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Mean normalization con scikit-learn

Scikit-learn no tiene un transformador específico para implementar el método de mean normalization pero lo podemos hacer de esta otra manera:

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

¿Qué técnica de escalado elegir para tus datos?

La elección del método de escalado y estandarización debe guiarse por el conocimiento del modelo específico de machine learning que quieres aplicar y las características de los datos con los que estás trabajando.

Realizar análisis exploratorios de datos puede ayudarte a entender mejor la distribución y la escala de tus datos, lo cual es vital para elegir la técnica de preprocesamiento más efectiva.

De hecho, lo óptimo sería experimentar con diferentes métodos de escalado para ver cuál mejora más el rendimiento de tus modelos en tareas específicas (aunque no siempre tenemos tiempo para esto...).

Si lo que quieres es cambiar la distribución de tus variables numéricas puedes echarle un vistazo a este tutorial.

A continuación te resumo una pequeña guía para saber por dónde empezar.

Este contenido está únicamente disponible para suscriptores. Puedes identificarte en este enlace o apuntarte a la plataforma.

Boletín Ninja

Suscríbete a la newsletter y recibe la guía ninja del Big Data y la Inteligencia Artificial.

Guía ninja del Big Data
Copyright © 2024  · Datos 🥷 · Todos los derechos reservados
💼 Aviso legal y cookies