VYUUUUYUEUYUYU YDS
UY
MUU UUUY
»
u
JOU
VRVVVUY
Generar buenos modelos
de entrenamiento:
preprocesamiento de datos
La calidad de los datos y la cantidad de informacién util que contienen son factores
clave que determinan lo bien que pueden aprender un algoritmo de aprendizaje
automatico. Por lo tanto, es absolutamente imprescindible que nos aseguremos
de examinar y preprocesar un conjunto de datos antes de lanzarlo a un algoritmo
de aprendizaje. En este capitulo, trataremos las técnicas fundamentales para el
preprocesamiento de datos, que nos ayudaran a generar buenos modelos de
aprendizaje automatico.
Los temas que trataremos en este capitulo son los siguientes
+ Eliminar e imputar valores ausentes de un conjunto de datos.
* Dar forma a datos categéricos para los algoritmos de aprendizaje automatico.
Seleccionar caracteristicas importantes para la construccion del modelo.
Tratar con datos ausentes
| mundo real que nuestras muestras carezcan de uno
No es extrafio en aplicaciones del
jucido un error en el proceso
‘9 mas valores por varias razones. Puede haberse prod
que ciertas medidas no sean
hayan dejado en blanco en una encuesta, por ejemplo.
faltan como espacios en blanco en nuestras
de recopilacién de datos, aplicables o que, simplemente,
determinados campos se
Normalmente vemos los valores que
tablas de datos o como cadenas de texto por defecto como Nan, que significa not a
number, 0 NULL (un indicador de datos desconocidos en bases de datos relacionales).
129 - -‘antes de proceder con otros andlisis.
técnicas practicas para tratar los valores
datos 0 imputando los valores
tras y caracterfsticas.
lores ausentes en datos tabulares
blar de las distintas técnicas para tratar los valores ausentes, vamos a
‘marco de datos de ejemplo a partir de un archivo Valores Separados
CSV, del inglés Comma-separated Values) para entender mejor el problema:
port pandas as pd
-om io import StringIO
>>> csv_data = \
1192, B,C,D
1.0,2.0,3.0,4.0
-0,6.0,,8.0
4 10.0,11.0,12.0,'''
S35 # Si est4s utilizando Python 2.7, debes
>>> # corivertir la cadena a unicode:
>>> # csv_data = unicode (csv_data)
>>> df = pd.read_csv(StringI0(csv_data))
>>> df
A B . D
01.0 2.0 3.0 4.0
15.0 6.0 NaN 8.0
210.0 11.0 12.0 NaN
my
ww
=
aw
~
ee
~
~
>
~
~
+
=
~~
—
Mediante este c6digo, leemos unos datos en formato CSV en un DataFrame
= de pandas mediante la funcién read_csv y observamosique las dos celdas
‘desaparecidas han sido sustituidas por Nav. Hemos utilizado la funcion stxing10 en
el cdigo de ejemplo anterior solo con propésitos ilustrativos. Esto nos permite leer
Ja cadena asignada a csv_data en un DataFrame de pandas como si fuera un archivo
CSV normal en nuestro disco duro.
Para un DataFrame mas amplio, puede ser tedioso buscar valores manualmente.
En este caso, podemos utilizar el método isnul1 para devolver un DataFrame con
valores booleanos que indican si una celda contiene un valor numérico (False) 0 si
falta algan dato (true). Después, con el método sun, podemos devolver el numero
de valores ausentes por columna del siguiente modo:
130
IBHPHRHHHHH EHR eH HeeVOEVVUEV EVV OYEYUVYYUUUUUUUUUUUUUUUCOOOCEE
o ,
pe oth
itulo 4
>>> Af. isnul2() .sum() é
x6
Boo
ae 2,
at
dtype: intea
Aunque scikit-learn fue desarrollado para trabajar con matrices
de NumPy, a veces puede ser més contveniente preprocesar datos
mediante un DataFrame de pandas. Siempre podemos acceder a la
matriz subyacente de NumPy de un DataFrame a través del atributo
RC values antes de incorporarlo a un estimador de scikit-learn:
>>> df, values,
array({{ 1.
, ad Bd 0
Tees nan, 8.1,
(10., 12., mnanj])
Eliminar muestras o caracteristicas con
valores ausentes
Una de las formas mas sencillas de tratar con datos perdidos es, simplemente, eliminar
Por completo las correspondientes caracteristicas (columnas) 0 muestras (filas) del conjunto
de datos; las filas con valores ausentes se pueden descartar facilmente con el método dropna
>>> df .dropna (axis=0)
fees cD
Dete0 2.0 3.0 4.0
De forma parecida, podemos descartar columnas que tengan como minimo un NaN
en alguna fila ajustando el argumento axis a1
>>> df.dropna (axis=1)
OPE
D2 0
1 5.0 6.0
2 10.0 11.0
El método dropna soporta muchos parametros adicionales que pueden ser utiles:
las columna n NaN
# solo se descartan filas donde toda
# devuelve toda la matriz puesto que no
os valores
# tenemos una fila donde todos an NaN
—10-——— secsBabs Ke 298
“filas donde NaN aparece en determinadas columnas
Ja climinacién de los datos eliminados pueda parecer un enfoque adecuado,
-algin inconveniente. Por ejemplo, podemos acabar
‘demasiadas muestras, lo que evitara obtener un andlisis confiable; 0,
os demasiadas columnas, corremos el riesgo de perder informacion
‘necesita nuestro clasificador para discriminar entre clases. En la siguiente
‘echaremos un vistazo.a una de las alternativas mas utilizadas para tratar con
es perdidos: las técnicas de interpolaci6n.
_ Imputar valores ausentes
A menudo, la eliminacién de muestras 0 de columnas enteras de caracteristicas no
puede llevar a cabo porque perderiamos demasiados datos valiosos. En este caso,
‘utilizar distintas técnicas de interpolacin para estimar los valores ausentes
p de otras muestras de entrenamiento en nuestro conjunto de datos. Una de
; técnicas de interpolacién mas conocidas es la imputaci6n por medias, donde
ente sustituimos el valor ausente con el valor medio de toda la columna de
| Una manera adecuada de conseguirlo es mediante la clase Imputer de
‘como se muestra en el codigo siguiente:
from sklearn.preprocessing import Imputer
= Imputer (missing values='NaN', strategy-'mean', axis=0)
, imr = imr. fit (df.values)
d_data = imr.transform(df.values)
'BABRBRAHHHHHRHRHBEHEEEEEeeE)
~)
~)
~
~
)
m)
al
all
al
)
a
a
_)
-s)
”
aa)
m7)
=
ny)
)
=)
a
3
3
=)
2
2
2
=)
-)
Capitulo 4
array({{ 1., re 3x 4.1,
C 5., Geni BoB y 8.1,
UAB, 412.6: p12.» 6.1])
En este caso, hemos sustituido cada valor Nan con la media correspondiente, que ha
sido calculada por separado para cada columna de caracteristicas. Si cambiaramos
el ajuste axis-0 a axis=1, calculariamos las medidas de la fila. Otras opciones para
el pardmetro strategy son median o most_frequent, donde este tltimo sustituye
los valores ausentes por los valores mas frecuentes. Esto resulta atil para imputar
valores de caracteristicas categéricas; por ejemplo, una columna de caracteristicas
que almacena una codificacién de nombres de colores, como rojo, verde y azul.
Encontraremos ejemplos de este tipo de datos mas adelante en este capitulo
Entender la API de estimador de scikit-learn
En la secci6n anterior, hemos utilizado la clase Imput er de scikit-learn para imputar
valores ausentes en nuestro conjunto de datos. La clase Imputer pertenece a las
denominadas clases transformadoras de scikit-learn, que se utilizan para la
transformaci6n de datos. Los dos métodos esenciales de estos estimadores son fit y
transform. El método fit se utiliza para aprender los parametros a partir de los datos
de entrenamiento, mientras que el método transform utiliza estos parametros para
transformar los datos. Cualquier matriz de datos que debe ser transformada necesita
tener el mismo numero de caracteristicas que la matriz de datos utilizada para
ajustar el modelosLa siguiente figura muestra como se utiliza un transformador,
ajustado en los datos de entrenamiento, para transformar tanto un conjunto de datos
de entrenamiento como un nuevo conjunto de datos de prueba:
Datos de
prueba
|
est. fit(X_train)
est .transform(x train) est.transform(x_test) 3)
Datos de
entrenamiento
transformados
Datos de prueba
transformados
133
|Generar buenos modelos de entrenamiento: preprocesamiento de datos
[Los clasificadores que utilizamos en el Capitulo 3, Un recorrido por los clasifiendores de
aprendizaje automatico con scikit-learn pertenecen a los denominados estimadores de
scikit-learn, con una API que es conceptualmente muy similar
lores tienen un método predict aunque tambien pueden tener un método
transform, como veremos mis adelante en este capitulo. Como puedes observar,
también hemos utilizado el método fit para aprender los parametros de un modelo
cuando entrenamos dichos estimadores para clasificacion. Sin embargo, en tareas de
izaje supervisado, proporcionamos adicionalmente las etiquetas de clase para
ajustar el modelo, que después se puede utilizar para hacer predicciones sobre nuevas
muestras de datos mediante el método predict, como se muestra en la siguiente figura:
Datos de || Etiquetas de
intrenamiento] entrenamiento|
1
@ [BerROCtrain, y train)
Datos de
prueba
@ [qrrretictctest)
Etiquetas
predichas
Trabajar con datos categoricos
Por el momento, hemos trabajado solo con valores numéricos. Sin embargo, no es
extrafio que los conjuntos de datos del mundo real contengan una o més columnas
de caracteristicas categéricas. En esta seccién, utilizaremos una serie de ejem ae
simples pero efectivos para comprobar como podemos tratar este tipo de d a a
librerias computacionales numéricas. aor
Caracteristicas nominales y ordinales
Cuando hablamos de datos categéricos, debemos distinguir entre caracteristicas
nominales y ordinales. Las caracteristicas ordinales se pueden entender como
134
a la clase transformadora.
A €\ &\ E\
\€\é€\ ev. ele
ae
we