¿Cómo codificar numéricamente variables categóricas en Python?
En el mundo del análisis de datos y del machine learning, es crucial poder manejar diferentes tipos de datos de manera eficiente. Una pregunta recurrente es cómo transformar variables categóricas en datos numéricos en Python, para lo cual existen distintas estrategias que pueden aplicarse dependiendo del caso específico y las herramientas utilizadas, como pandas o scikit-learn. Aquí exploramos las diferencias entre estos métodos y su implementación práctica.
¿Qué es la codificación dummy y one-hot encoding?
Existen dos métodos principales para transformar variables categóricas en numéricas:
Dummmy encoding: Se trata de una representación compacta, donde, por ejemplo, si tenemos tres categorías (inglés, español y francés), podemos codificar esas tres categorías en un vector de dos números: Inglés (0,0), Español (0,1) y Francés (1,0). La debilidad de este método es que no puede manejar nuevas categorías o valores no esperados.
One-hot encoding: Aquí se crea un vector con tantas componentes como categorías existan. Siguiendo el ejemplo anterior, Inglés se codificaría como (1,0,0), Español como (0,1,0), y Francés como (0,0,1). Este método, aunque usa más números, permite codificar valores no identificados como (0,0,0), lo que le otorga flexibilidad al manejar nuevas categorías.
¿Cómo aplicar one-hot encoding en pandas?
En pandas, la función get_dummies ofrece la funcionalidad necesaria para realizar un one-hot encoding, aunque el nombre de la función pueda generar confusión. Aquí un ejemplo de aplicación:
import pandas as pd
# Supongamos que tenemos un dataframe df con una columna categórica 'engine_type'df = pd.DataFrame({'engine_type':['diesel','electric','gas']})# Aplicamos get_dummies para realizar un one-hot encodingdf_encoded = pd.get_dummies(df['engine_type'])print(df_encoded)
Esto transformará la columna engine_type en tres columnas binarias, una por cada categoría encontrada.
¿Cómo implementar one-hot encoding en scikit-learn?
Scikit-learn también ofrece soluciones robustas para el one-hot encoding mediante su clase OneHotEncoder.
from sklearn.preprocessing import OneHotEncoder
# Inicializamos el codificadorencoder = OneHotEncoder(handle_unknown='ignore')# Ajustamos el encoder a nuestros datosencoder.fit(df[['engine_type']])# Transformamos los datosencoded_data = encoder.transform([['gas'],['diesel'],['unknown']]).toarray()print(encoded_data)
Al configurarlo con handle_unknown='ignore', el encoder asignará un vector de ceros a cualquier categoría no conocida, multiplicando así la flexibilidad del método.
¿Es posible tratar variables numéricas como categóricas?
Definitivamente, y puede ser útil dependiendo del análisis a realizar. Un ejemplo es tratar los años de producción de un auto como categorías:
# Suponemos que gear_produced es una columna con añosencoder.fit(df[['gear_produced']])# Transformamos años conocidos y desconocidosencoded_years = encoder.transform([[2009],[2016],[1900]]).toarray()print(encoded_years)
Al hacer esto, cada año se convierte en una categoría distinta, lo que si bien aumenta la dimensionalidad del dataset, ofrece una nueva perspectiva para su análisis.
Con estas técnicas en mano, tienes la capacidad de adaptar y manipular datos categóricos de una forma que potencie tus análisis y modelos. Sigue explorando y aplicando estas técnicas para avanzar en tu dominio del análisis de datos en Python.
La decodificación de variables categóricas a numéricas implica que cada elemento del nuevo vector se interpreta como una nueva variable. Por tanto, aumenta la dimensión del dataset y el tiempo de procesamiento.
Procesamiento para variables categóricas con Python
¿Podemos tratar a las variables numéricas como categóricas? Claro que sí. Todo depende del contexto y del proyecto.
En el mundo de ciencia de datos, es muy común usar el modo 'one-hot', puesto que 'dummy' ni siquiera existe en las librerías de Python.
La desventaja del one-hot es que cada elemento de los vectores que resultan es como si fueran nuevas variables. Esto aumenta demasiado
la dimensionalidad de nuestro dataset y se vea afectado en el rendimiento.
Muy buen aporte. Gracias
catergoria
Dummy
One-hot
ingles
[0,0]
[1,0,0]
español
[0,1]
[0,1,0]
frances
[1,0]
[0,0,1]
Aquí pueden aprender un poquito mas de one hot
graciasss
gracias!
Si uno cuenta con una variable categórica con muchos datos distintos (por ejemplo países del mundo) una alternativa en vez de convertirlas a one-hot es asignarles un valor descriptivo del problema en el que uno esté trabajando, como por ejemplo el PIB de esos países.
Puedes explicar un poco más la idea ?
cambiar la etiqueta de cada pais por su propio PIB ?
Hola César,
efectivamente.
En vez de añadir cada nombre de país que te obligaría a tener una matriz muy grande de one-hot encoding, puedes utilizar por ejemplo el PIB de cada país. Esto, por supuesto, si el PIB (podría ser cualquier otro) te sirve para el problema que estás desarrollando.
Información resumida de esta clase
#EstudiantesDePlatzi
Lo que buscamos es convertir estas variables categóricas en variables numéricas para poder trabajar nuestros modelos
También podemos tratar variables numéricas como categóricas
Con le encoding one hot la longitud del vector es igual a la cantidad de categorías que tengan mis datos, esto me ayuda para cuando tengo valores nulos
En Python hago esto con la función get_dummies de la librería panda
Puedo realizar la misma operación usando la librería sklearn.preprocessing
Cuando hago este mismo ejercicio ahora con variables numéricas se incrementan bastante los datos y se debe hacer una reducción de los mismos
Después de tener las variables categóricas de manera numérica, ¿Cómo las uso o para qué me sirven?
Hola, te comparto esta frase de uno de los cursos de Kaggle:
"The world is filled with categorical data. You will be a much more effective data scientist if you know how to use this common data type!"
Basicamente los valores categoricos son bastante comunes en los real world datasets, si simplemente tiras estos valores de tu data y no los usas para tu modelo te estarìas peridendo de una potencialmente valiosa informacion, los necesitas de manera numerica porque al final los modelos no son mas que matematicas aplicadas en codigo, por lo tanto solo entienden numeros, no strings y si intentas entrenar un modelo con valores categoricos sin haberlos preprocesado anteriormente te darà error. Espero haber solucionado tu duda :)
Esta también es mi duda. Si te entendí bien Sebastian, el tener las variables en este formato me permite usarlas de alguna manera para que puedan ser parte del cálculo de algún modelo? O sea que lo único que estamos haciendo es transformar estas variables categóricas en vectores? Saludos ;)
Cual es la diferencia de hacer esos métodos con Pandas o Scikit Learn?
El resultado es el mismo. Prefiero trabajar con Pandas porque el manejo de datos lo hace con dataframes en vez de matrices, lo que lo hace más visual. La desventaja es que no es recomendado usar dataframes para manipular grandes volúmenes de datos, ya que no es muy eficiente.
Aca tienen un hilo en quora de las desventajas del One hot
Light weight. Yeah, buddy !
Esta super interesante.
¿por que es bueno procesar como dummy o one-hot variables categóricas ?
Paso 1: importación de la biblioteca. desde sklearn import preprocesamiento import pandas como pd. ...
Paso 2: creación de DataFrame. Creamos un Diccionario y lo pasamos a través de pd.DataFrame para crear un marco de datos con diferentes características. ...
Paso 3 - Procesamiento de variables categóricas.
Alguna vez use el one hot para transformar localidades de Bogotá y efectivamente hice la transformación pero el problema fue cuando realicé una regresión lineal entre la variable transformada con la cantidad de hurtos, no hizo sentido, así que me pregunta es también ¿debía escalar mi variable de robos?
Si agregamos dos categorías nuevas al encoder, ambas son transformadas en 0,0,0.
Con esto concluyo que todas las nuevas categorías que se agreguen serán procesadas de la misma manera (0,0,0).
Mi pregunta es: Que todas las nuevas categorías sean igualmente procesadas. Esto no causaría problemas con el análisis?
Cuando se considere que una categoría afecte realmente al análisis. Lo más conveniente es agregarla al dataset para ser interpretada?
Yo lo pienso de esta manera: mas allá de como serán tratadas nuevas categorías por Scikit-Learn y su encoder, el hecho de tener que sumar una nueva categoría es porque así lo requieren les nuevos posibles datos del dataset, y no porque queremos ir sumando categorías porque si.
Con esto quiero decir que, siempre que tengamos que "sumar una categoría" sea porque esta apareció realmente en el dataset, y no porque se me ocurrió sumar categorías.
Con esto nos aseguramos que cada "nueva categoría" efectivamente va a tener significado en el encoder (o sea, en algún lado aparecerá un "1").
creo que deberia ser manual el proceso, porque al agregar una nueva categoria se tendria que expandir en 1 la longitud del vector actual, entonces se modificaria todo nuevamente.
Aún no se como sea, pero me imagino que si debe ser manual, a menos que exista algun tipo de algoritmo de detección
Cuando usa el método .transform, ¿lo hace para probar que esas categorías estén en el vector? Estoy confundido porque no sé si, por el contrario, está reasignando esas categorías. :(
Se usa el método transform para que el encoder transforme las categorías dadas en el array a nuevas categorías numéricas, para que así puedan ser interpretadas.
Dado el ejemplo de la clase:
'gasoline' --> 0,0,1
'diesel' --> 1,0,0
'electric' --> 0,1,0
'nueva_categoria' --> 0,0,0
Que tal Jose, estas seguro que es para que puedan ser interpretadas, por que lo entiendo un poco mas como Diego, ya que en el ejemplo de los años al usar transform no les asigno el [1, 0, 0, ... a esos años si no que trajo verdaderamente la asignación en forma de array.
Gracias por la aclaración
Francisco felicitaciones, tiempos, conceptos, ejemplos y practica consistente.
Procesamiento para variables categóricas con Python
La codificación categórica es una técnica para codificar datos categóricos. Tenga en cuenta que los datos categóricos son los conjuntos de variables que contienen variables de etiqueta en lugar de valores numéricos. Muchos algoritmos de aprendizaje automático son incapaces de procesar variables categóricas. Por lo tanto, es importante codificar los datos en una forma adecuada para poder preprocesar estas variables. Como necesita ajustar y evaluar su modelo, debe codificar los datos categóricos y convertir todas las variables de entrada y salida en numéricas. De este modo, el modelo podrá comprender y extraer la información generando la salida deseada. Los datos categóricos varían en función del número de valores posibles.
Codificación de números enteros
En este primer paso, asignará el valor entero para cada valor de categoría. Por ejemplo, el azul es 1, el verde es 2 y el amarillo es 3. Puede invertir fácilmente este tipo de codificación. También puede referirse a la codificación de enteros como codificación de etiquetas. Para muchas variables, este paso es suficiente para procesar el modelo. Existe una relación natural ordenada entre los diferentes valores enteros. Se puede conectar la relación a través de un algoritmo de aprendizaje automático. Por ejemplo, si considera las variables ordinales como el lugar, las categorías ya están ordenadas. Por lo tanto, no es necesario encontrar la relación entre las variables. Así, la codificación de etiquetas sería suficiente.
Para las variables categóricas ordinales también se puede usar la función OrdinalEncoder de sklearn, aunque la codificación one hot, la mayoría de veces, también es valida en este tipo de variables
cual de los tipos de mapeos me ayuda a obtener una representación compacta?
Una consulta. quiero hacer un ACP de la información que tengo en csv, porque el ejemplo se hace con la base de datos "Iris" que se importa al deep note. tengo problemas de eso