En este tutorial te explico para qué sirve la discretización de datos, cuándo aplicarla y distintas técnicas para discretizar variables en Python.
Discretizar los datos es el proceso de transformar variables numéricas continuas de tu dataset en variables categóricas.
También podrás encontrarlo referido como binning.
La idea consiste en dividir el intervalo de valores que puede tomar una característica (la característica que queremos discretizar) en varios segmentos contiguos.
Cada segmento (o bin) se corresponderá con una categoría nueva de la variable categórica. Por lo que si la característica toma un valor que se sitúa en un segmento determinado, le asignaremos la categoría que corresponda.
Tras la transformación, nuestra variable numérica pasa a ser una variable categórica 🙂.
Para entenderlo de forma sencilla, vamos a ver un ejemplo:
Imagina que tienes un termómetro que muestra la temperatura en grados centígrados. Es un termómetro muy preciso por lo que muestra la temperatura con muchos decimales (por ejemplo, 22.567 ºC).
La mayorñia de veces, este nivel de detalle no es necesario, y es más útil hablar en términos más generales, como decir simplemente que hace "frío", "templado" o "calor".
En términos técnicos, esto es lo que hacemos al discretizar:
templado
.La discretización de variables supone una pérdida de información pero eso no tiene por qué ser algo negativo.
A continuación vamos a ver varias técnicas de discretización de variables numéricas y las implementaremos con Python usando el dataset Breast cancer Wisconsin (diagnosis) que está incluido en Scikit-learn.
Si quieres entender mejor las características de este dataset también lo utilizamos en este tutorial sobre normalización de variables numéricas. Ahí te explico más cosas sobre el dataset que vamos a usar 🙂.
Aparte de eso sólo vamos a necesitar un Notebook de Google Colab.
⚠️ Este dataset no tiene valores faltantes. Si decides utilizar otro, asegúrate de utilizar alguna técnica de valores faltantes antes o de asignarle a todos la misma categoria (Missing
, por ejemplo).
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.preprocessing import KBinsDiscretizer from sklearn.tree import DecisionTreeRegressor cancer_data = load_breast_cancer() data = pd.DataFrame(cancer_data.data,columns=cancer_data.feature_names) data['target'] = cancer_data.target data.head()
Una manera muy habitual de discretizar los datos es dividir el rango de valores posibles de la característica en cuestión en un número arbitrario de segmentos contiguos e iguales.
El número de bins lo eliges tú.
La nueva característica worst texture binned
es una variable categórica a la que podemos asignar una categoría en función de su intervalo que tenga algún significado y que podamos usar después.
⚠️ En este caso hemos añadido una nueva columna al dataset con la variable discretizada. Recuerda eliminar la variable continua correspondiente con el método .drop()
de Pandas. No queremos características con la misma información en nuestro dataset.
En Scikit-learn configuramos el transformador KBinsDiscretizer()
para discretizar las variables. Especificamos el números de intervalos para cada variable y la estrategia a seguir strategy='uniform'
, lo que significa que los intervalos tendrán el mismo ancho, es decir, la misma diferencia entre el límite inferior y superior de cada intervalo.
Este tipo de discretización selecciona los intervalos en función del número de observaciones de manera que no todos son iguales pero sí contienen el mismo número de observaciones.
Aquí también el número decides tú el número de bins.
💡 Este tipo de discretización va muy bien cuando las distribución de valores de la característica está muy sesgada porque reparte las observaciones entre los distintos bins de manera equitativa.
Para discretizar con intervalos de igual frecuencia utilizando Pandas usamos el método qcut()
. Este método determina los límites de los intervalos para la variable worst texture
que consiguen que haya aproximadamente el mismo número de observaciones en cada uno d elos 10 bins.
La discretización con intervalos de igual frecuencia con Scikit-learn es muy parecida a la anterior.
Otra manera de discretizar una variable numérica es utilizar mediante el algoritmo de árboles de decisión.
Este método se basa en la capacidad de los árboles de decisión para dividir el espacio de datos en segmentos que maximizan (o minimizan) la pureza de los nodos resultantes.
Usar árboles de decisión en la discretización de datos puede ser particularmente útil para identificar puntos de corte en la característica a discretizar que mejor se correlacionan con la variable objetivo.
Para la discretización, tu variable continua será la variable de entrada al árbol de decisión, y la variable que deseas predecir o clasificar será la variable de salida.
Si no tienes una variable de salida específica, puedes utilizar la misma variable continua como objetivo, buscando agrupar valores similares.
Después, entrenas el árbol de decisión utilizando tus datos. El algoritmo del árbol automáticamente buscará las mejores divisiones para segmentar la variable continua de manera que las divisiones resulten en la mayor ganancia de información o la menor impureza según algún criterio.
Una vez que el árbol está entrenado, analizas los nodos hoja y las divisiones que el árbol ha creado. Cada división te da un punto de corte que el árbol encontró útil para separar los datos de manera efectiva.
Utilizando los puntos de corte identificados en el árbol, puedes crear intervalos de discretización. Cada intervalo estará definido por dos puntos de corte consecutivos. Todos los valores entre dos puntos de corte caerán en el mismo intervalo.
Finalmente, asignas cada valor de la variable continua al intervalo correspondiente basado en los puntos de corte establecidos. Cada valor se categoriza en el intervalo que le corresponde según los puntos de corte del árbol.
💡 Este método es especialmente útil cuando la variable continua necesita ser discretizada de manera que mejore la capacidad predictiva o clasificatoria de un modelo, aprovechando la capacidad natural de los árboles de decisión para manejar y explorar relaciones no lineales.
Al utilizar el algoritmo K-means para discretizar una variable continua los intervalos se corresponderán con los clusters que defina el algoritmo.
El número de grupos que determinará el algoritmo K-means (K
) se corresponde con el número de categorías de la variable tras la discretización.
La elección de K
puede basarse en conocimientos previos que tengamos sobre el dataset, métodos de validación de clusters, u otros criterios.
Básicamente, aquí también decides tú el número de bins.
El algoritmo K-means funciona en dos etapas, una de asignación (2) y una de actualización (3):
K
puntos iniciales como centroides. Podemos elegirlos al azar, o utilizando técnicas más sofisticadas que intentan esparcir los centroides de manera uniforme a lo largo de la distribución de datos.K
grupos de datos, donde cada grupo está formado por todos los puntos más cercanos a un centroide dado.La discretización mediante K-means es particularmente útil cuando los datos tienen una estructura de agrupación natural y queremos respetar esa estructura en la discretización.
La discretización con K-means tiene ventajas:
Peeero hay que tener en cuenta que elegir el número de clusters K
es complicado y además, el resultado puede variar dependiendo de los centroides iniciales.
Evidentemente no es necesario ni conveniente discretizar todas las variables continuas de tu dataset.
Sin embargo, la discretización puede ser particularmente útil en ciertos casos. Aquí te detallo algunos ejemplos:
⚠️ Ten en cuenta que después de haber discretizado las variables que hayas elegido y dependiendo del modelo que vayas a utilizar puede ser necesario volverlas a codificar otra vez. Aquí tienes un tutorial para ver cómo hacerlo.