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.
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 basados en gradientes:
Cualquier algoritmo que utilice descenso del gradiente como método de optimización se beneficiará del escalado.
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:
Modelos de Máquinas de Soporte Vectorial (SVM):
Modelos de regularización:
Modelos de componentes principales:
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:
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()
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.
Este escalado consigue transformar las características de manera que sus valores se muevan en el rango entre 0 y 1.
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 🙂.
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.
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.
El proceso es sencillo. Sólo tenemos que sustraer la media y dividir por la desviación típica 🙂.
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.
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.
Scikit-learn no tiene un transformador específico para implementar el método de mean normalization pero lo podemos hacer de esta otra manera:
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.