Preprocesamiento de datos con sklearn

1. Ciclo de vida

2. Tipología

3. Ámbito de aplicación

4. Lenguaje de programación

Descripción

La librería scikit-learn, también llamada sklearn, es un conjunto de rutinas escritas en Python para hacer análisis predictivo, que incluyen clasificadores, algoritmos de clusterización, etc. Está basada en NumPy, SciPy y matplotlib, de forma que es fácil reaprovechar el código que use estas librerías.

Además, incorpora varias funciones para preprocesar los datos:

  • Normalización: ajustar las variables numéricas para que tengan media 0 y varianza 1, o bien que estén en un rango como por ejemplo [0,1]. También permite normalizar vectores para que tengan norma 1.
  • Transformaciones no lineales: basadas en cuantiles y exponentes, para transformar variables con distribuciones muy sesgadas, por ejemplo. Entre otros incluye la transformada de Yeo-Johnson y la de Box-Cox.
  • Discretización: se trata de convertir una variable numérica en un conjunto de valores posibles, según algún criterio. Un caso extremo es cuando una variable es convertida a solo dos valores posibles, lo que se conoce como binarización.
  • Valores perdidos: cuando por algunos registros faltan datos de alguna variable (p. ej., un usuario no responde a alguna pregunta de una encuesta), es posible imputar un valor en función de algún criterio automatizable, por ejemplo, sustituirlo por la mediana.
  • Creación de interacciones entre variables mediante el uso de polinomios.

Enlace al recurso

https://scikit-learn.org/

Ejemplo de uso

Supongamos que estamos analizando las ediciones que se hacen en la Wikipedia por parte de usuarios registrados, de forma que podemos saber cuántas ediciones hace un editor. En el caso de la Wikipedia en castellano, hay más de 500.000 usuarios registrados que han hecho al menos una edición en los últimos 5 años. La distribución del número de ediciones está muy sesgada, como se puede ver si miramos los descriptores estadísticos:

>>> import scipy as sp
>>> import numpy as np
>>> from sklearn import preprocessing

>>> # leemos los datos
>>> f=open("nedits")
>>> data=np.loadtxt(f)

>>> # calculamos los descriptores estadísticos básicos
>>> sp.stats.describe(data)

DescribeResult(nobs=526189,
               minmax=(1.0, 389352.0),
               mean=43.44426052235983,
               variance=1639017.754385199,
               skewness=123.76279393682691,
               kurtosis=25609.581550487568)

Si aplicamos una transformación basada en exponentes, podemos trabajar con una variable en un rango más adecuado y que permita comparaciones con otros, por ejemplo, en un algoritmo de clusterización, donde la distancia depende fuertemente de la distribución de las variables usadas. El resultado después de aplicar la transformación es:

# transformamos los datos con una transformación Yeo-Johnson
>>> pt = preprocessing.PowerTransformer(method='yeo-johnson',
                                        standardize=False)
>>> ndata=pt.fit_transform(data.reshape(-1,1))
>>> sp.stats.describe(ndata)

DescribeResult(nobs=526189,
               minmax=(array([0.51604581]), array([1.11391334])),
               mean=array([0.71029457]),
               variance=array([0.03805203]),
               skewness=array([0.4683004]),
               kurtosis=array([-1.12965691]))

Enlaces relacionados

Normalización: https://en.wikipedia.org/wiki/Normalization_(statistics)

Transformaciones basadas en exponentes: https://en.wikipedia.org/wiki/Power_transform

Datos ausentes: https://en.wikipedia.org/wiki/Missing_data