Discretización de variables en Python

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.

¿Qué significa discretizar los datos?

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 🙂.

Ejemplo de discretización de datos

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:

  1. Seleccionamos los segmentos: Dividimos todo el rango de valores posibles de la variable continua en segmentos o "bins". Por ejemplo, podríamos dividir la temperatura en tres segmentos:
    • Menos de 10 grados es frío.
    • Entre 10 y 25 grados es templado.
    • Más de 25 grados es calor.
  2. Asignamos las categorías: A cada segmento le hemos asignado una categoría. Por lo que si tenemos una temperatura de 22.567 ºC, el nuevo valor de la característica sería templado.

Ventajas de discretizar variables

La discretización de variables supone una pérdida de información pero eso no tiene por qué ser algo negativo.

  1. Convertir variables continuas en categorías más simples (como el ejemplo de la temperatura que veíamos antes 🌡) facilita la comprensión de los resultados del modelo haciéndolo más interpretable.
  2. Además, al agrupar los datos en categorías reduce la sensibilidad a los outliers, lo que mejora el rendimiento de algunos modelos de Machine Learning. Los outliers o anomalías, quedan asignados en una categoría con el resto de valores de la distribución de la característica por lo que su efecto no se nota.
  3. Por otro lado, algunos algoritmos de Machine Learning funcionan mejor con características categóricas. Por ejemplo, los modelos basados en árboles de decisión.

Técnicas para discretizar variables en Python

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()

Discretización con intervalos del mismo tamaño

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ú.

Discretización con intervalos del mismo tamaño con Pandas

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

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.

Discretización con intervalos del mismo tamaño con Scikit-learn

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.

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Discretización con intervalos de igual frecuencia

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.

Discretización con intervalos de igual frecuencia con Pandas

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.

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Discretización con intervalos de igual frecuencia con Scikit-learn

La discretización con intervalos de igual frecuencia con Scikit-learn es muy parecida a la anterior.

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Discretización mediante árboles de decisión

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.

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Discretización con K-means

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):

  1. Se seleccionan 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.
  2. Cada observación se asigna al centroide más cercano según una medida de distancia (generalmente la distancia euclidiana). Esto forma K grupos de datos, donde cada grupo está formado por todos los puntos más cercanos a un centroide dado.
  3. Una vez todos los datos están asignados a un cluster, se recalcula la posición de cada centroide tomando el promedio (o mediana, dependiendo de la variante del algoritmo) de todos los puntos asignados a ese cluster.
  4. Se repiten los pasos 2 y 3 iterativamente hasta que los centroides ya no cambian (o cambian muy poco).

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:

  • Los clusters formados son tales que las observaciones dentro de cada grupo son lo más similares posible entre sí, y lo más diferentes posible de las observaciones en otros clusters.
  • Además, este método puede revelar estructuras y patrones en los datos que otros métodos de discretización podrían no detectar.

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.

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

¿Cuándo discretizar variables?

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:

  1. Datos de tiempo: Convertir marcas de tiempo exactas en partes del día (mañana, tarde, noche), días de la semana, o temporadas. Esto puede ser particularmente útil en análisis de tendencias o patrones cíclicos.
  2. Datos espaciales: Similar a los datos de tiempo, los datos espaciales que describen ubicaciones precisas pueden ser discretizados en áreas más grandes, como barrios, ciudades o regiones. Esto es útil para análisis a nivel de grupo o cuando los datos exactos de ubicación son innecesarios o podrían comprometer la privacidad.
  3. Datos de intensidad, escalas o rangos: Datos que miden magnitudes, como luminosidad, sonido o fuerza de señal, también pueden ser discretizados en niveles como bajo, medio, alto.

⚠️ 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.

Accede a todo el contenido premium

Ya no necesitas pagar cientos de euros por un Bootcamp para convertirte en ninja de los datos. Por solo 17€/mes (o menos 🤯), obtén acceso al podcast premium, a todos los tutoriales y a los resúmenes de los libros más top sobre Machine Learning y Ciencia de datos y aprende a tu ritmo.
¡Empieza ahora!
Copyright © 2024  · Datos 🥷 · Todos los derechos reservados