Preprocessament de dades amb sklearn

1. Cicle de vida

2. Tipologia

3. Àmbit d'aplicació

4. Llenguatge de programació

Descripció

La llibreria scikit-learn, també anomenada sklearn, és un conjunt de rutines escrites en Python per a fer anàlisi predictiva, que inclouen classificadors, algorismes de clusterització, etc. Està basada en NumPy, SciPy i matplotlib, de forma que és fàcil reaprofitar el codi que usi aquestes llibreries.

A més, incorpora diverses funcions per a preprocessar les dades:

  • Normalització: ajustar les variables numèriques perquè tinguin mitjana 0 i variància 1, o bé que estiguin en un rang com ara [0,1]. També permet normalitzar vectors perquè tinguin norma 1.
  • Transformacions no lineals: basades en quantils i exponents, per a transformar variables amb distribucions molt esbiaixades, per exemple. Entre d’altres inclou la transformada de Yeo-Johnson i la de Box-Cox.
  • Discretització: es tracta de convertir una variable numèrica en un conjunt de valors possibles, d’acord a algun criteri. Un cas extrem és quan una variable és convertida a només dos valors possibles, el que es coneix com a binarització.
  • Valors perduts: quan per alguns registres falten dades d’alguna variable (p. ex., un usuari no respon alguna pregunta d’una enquesta), és possible imputar un valor en funció d’algun criteri automatitzable, per Exemple, substituir-lo per la mediana.
  • Creació d’interaccions entre variables mitjançant l’ús de polinomis.

Enllaç al recurs

https://scikit-learn.org/

Exemple d’ús

Suposem que estem analitzant les edicions que es fan a la Wikipedia per part d’usuaris registrats, de forma que podem saber quantes edicions fa un editor. En el cas de la Wikipedia en castellà, hi ha més de 500.000 usuaris registrats que han fet almenys una edició en els darrers 5 anys. La distribució del nombre d’edicions està molt esbiaixada, com es pot veure si mirem els descriptors estadístics:

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

>>> # llegim les dades
>>> f=open("nedits")
>>> data=np.loadtxt(f)

>>> # calculem els descriptors estadístics bàsics
>>> 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 apliquem una transformació basada en exponents, podem treballar amb una variable en un rang més adequat i que permeti comparacions amb d’altres, per exemple, en un algorisme de clusterització, on la distància depèn fortament de la distribució de les variables usades. El resultat després d’aplicar la transformació és:

# transformem les dades amb una transformació 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]))

Enllaços relacionats

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

Transformacions basades en exponents: https://en.wikipedia.org/wiki/Power_transform

Dades absents: https://en.wikipedia.org/wiki/Missing_data