UNIDAD 5 - Parte 1
El escalado (también llamado normalización) es un paso de preprocesamiento esencial en el trabajo con modelos de machine learning que se realiza con el objetivo de ajustar las escalas de los atributos (variables) de tal manera que varíen todas en el mismo rango.
Los algoritmos de machine learning predictivo tienden a darle más importancia a aquellos atributos que varían en un rango más amplio, anque no sean los más informativos o decisivos a la hora de poner en marcha su capacidad predictiva.
Escalar los datos previo al entrenamiento del modelo puede ayudarnos a evitar este problema, conduciendo así a mejoras significativas en la precisión de sus predicciones en relación a utilizar datos no escalados.
Las técnicas más comunes de escalado incluyen dos componentes: un término traslacional (T) y un factor de escalado (S):
\[x'_i = \frac{x_i - T}{S}\] El término traslacional opera moviendo los datos a lo largo del eje \(X\), mientras que el factor de escalado hace que los datos estén más concentrados o más dispersos horizontalmente.
Vamos a analizar el efecto de las técnicas de escalado más comunes sobre tres conjuntos de datos de dos variables cuantitativas continuas \(X_1\) y \(X_2\):
Los mismos reflejan diferentes distribuciones para las variables (normal, uniforme), así como presencia/ausencia de outliers.
Podemos simular estos conjuntos en Python utilizando el siguiente código, basado en el uso de las librerías random
, numpy
y pandas
:
random.seed(2023)
datos = pd.DataFrame({'x1_ej1' : np.random.normal(10, 4, 1000), 'x2_ej1' : np.random.normal(-10, 4, 1000), 'x1_ej2' : np.random.normal(10, 4, 1000), 'x2_ej2' : np.concatenate([np.random.normal(50, 4, 975), np.random.normal(100, 4, 25)]), 'x1_ej3' : np.random.normal(10, 4, 1000), 'x2_ej3' : np.random.uniform(-3, 5, 1000)})
A cada valor de la variable se le resta la media (\(\bar{x}\)) y se divide el resultado por la desviación estándar (\(s_x\)), resultando en una distribución con media cero y variancia unitaria:
\[x'_i = \frac{x_i - \bar{x}}{s_x}\]
Una ventaja de esta técnica es que transforma tanto valores positivos como negativos a distribuciones similares.
Sin embargo, en presencia de outliers, la distribución de los valores no atípicos resulta demasiado concentrada en relación a la de una variable sin outliers. En este caso, los resultados del escalado pueden no ser apropiados.
El Escalado Pareto y el Variable Stability (Vast) scaling son variaciones a esta técnica que alteran el factor de escalado, haciendo que la distribución resultante sea más dispersa. De esta manera, reducen la importancia de los outliers, pero no son completamente “inmunes” a ellos.
Escalado Pareto: \(x'_i = \frac{x_i - \bar{x}}{\sqrt{n}}\)
Variable Stability (Vast) scaling: \(x'_i = \frac{x_i - \bar{x}}{s_x}\frac{\bar{x}}{s_x}\)
Este enfoque altera la escala de la variable y desplaza sus valores a lo largo del eje \(X\), con el resultado de que el atributo transformado se encuentra dentro del rango [0,1].
\[x'_i = \frac{x_i - x_{min}}{x_{max} - x_{min}}\]
En esta técnica, el factor de escalado es el rango, y el término traslacional es el valor mínimo de la variable. De esta forma, los datos transformados pasan a ubicarse en el rango [0,1].
Para aquellos atributos que no presentan outliers la técnica tiene un efecto similar al del Z-Score, aunque en este último caso la distribución resultante se encuentra en un rango menos acotado.
Sin embargo, cuando los datos presentan outliers, la técnica falla en ecualizar tanto las medias como las variancias de las distribuciones, lo que la hace inadecuada en una pipeline de machine learning.
El escalador min-max puede ser definido a través de una expresión matemática más general, de manera de permitir la definición del rango resultante como [a,b], en lugar de [0,1]:
\[x'_i = a + \frac{(x_i - x_{min}) (b - a)}{x_{max} - x_{min}}\]
Esta técnica modifica la escala de un atributo dividiendo cada observación por el máximo en valor absoluto:
\[x'_i = \frac{x_i}{max(|{x}|)}\]
Como se observa, esta técnica es sensible a los outliers, dando como resultado distribuciones mucho más compactas que en ausencia de valores atípicos.
Por otra parte, dado que no incluye un término traslacional, no es capaz de ecualizar las medias de los atributos.
Las tres técnicas de escalado que mencionamos hasta el momento son muy sensibles a la presencia de outliers porque todas dependen de medidas resumen que suelen estar muy afectadas por la existencia de valores atípicos en los datos con los que trabajamos.
¿Y si hacemos algunas modificaciones sobre alguna de ellas para lograr un escalado más robusto en estas situaciones?
Esta técnica busca mitigar los efectos indeseados de los outliers utilizando como término traslacional a la mediana (\(Q_2\)) y escalando los datos de acuerdo al rango intercuartil (RI):
\[x_i' = \frac{x_i - Q_2(x)}{Q_3(x) - Q_1(x)}\]
Esta técnica es efectiva para ecualizar las variancias entre los conjuntos de datos para diferentes atributos o variables, aún cuando haya uno que presenta outliers.
En la práctica, podemos implementar estas técnicas de escalado de diversas maneras:
“A mano”, es decir, creando una función que aplique la operación matemática correspondiente a cada una de las columnas del DataFrame empleando métodos de Pandas
.
O utilizando elementos de la biblioteca Scikit-learn
.
El flujo de trabajo utilizando el enfoque de Scikit-learn
implica:
Importar el scaler desde el módulo sklearn.preprocessing
, según el caso: StandardScaler
, MinMaxScaler
, MaxAbsScaler
o RobustScaler
.
Crear el objeto correspondiente (por ejemplo, StandardScaler()
), el cual almacena las instrucciones para escalar los datos según el método elegido.
Aplicar el escalado a los datos utilizando fit_transform()
.
Como vimos, hay varias alternativas de escalado que pueden ser aplicadas a un dataset, y la selección de la estrategia a utilizar es una decisión metodológica importante en el curso de un análisis de datos.
Hay estudios que muestran que elegir una técnica no muy adecuada para los datos con los que contamos puede ser más perjudicial sobre la performance predictiva del modelo que no haber escalado los datos.
La transformación logarítmica es una herramienta poderosa para el trabajo con variables cuantitativas con valores mayores a cero que tienen distribuciones sesgadas (heavy-tailed).
Comprime la cola superior de la distribución, haciéndola más corta, y expande la región en la que se encuentra el resto de los datos.
La transformación logarítmica puede aplicarse en diversas situaciones, por ejemplo:
Mejorar visualizaciones: al comprimir el rango en el que se encuentran los datos, ayuda a mejorar visualizaciones de variables cuyas observaciones se encuentran distribuidas en un rango de varios órdenes de magnitud.
Disminuir el sesgo: en ciertos casos, la transformación logarítmica ayuda a lograr una distribución más simétrica de los datos (importante en el análisis estadístico/modelado).
Linealizar relaciones entre variables.
Se cuenta con información acerca de alrededor de 40000 artículos y se quiere generar un modelo para predecir popularidad en términos del número de veces que se comparte en redes sociales.
Se propone utilizar como variable predictora el número de palabras en el artículo.
La distribución luce mucho más simétrica luego de la transformación logarítmica (dejando de lado el grupo de artículos “sin palabras” 🧐).