Cómo convertir variables categóricas a numéricas sin romper tu modelo
Por el Equipo docente del Instituto Data Science · Actualizado en octubre de 2026
Qué pasa cuando codificás mal una variable categórica, qué estrategia conviene según el tipo de dato y por qué comparar modelos solo por su tasa de aciertos puede llevarte a una mala decisión.
Resumen: muchos algoritmos solo aceptan números, así que las variables categóricas hay que convertirlas. Si la variable tiene un orden natural, se le asignan números que lo respeten. Si no lo tiene, conviene One Hot Encoding o, cuando hay muchas categorías, target encoding calculado sin filtrar información del objetivo. Numerar las categorías por orden alfabético es tentador pero puede destruir poder predictivo, y la tasa de aciertos no siempre lo muestra: conviene evaluar con la métrica del negocio.
Por qué hay que convertir las variables categóricas
Muchas variables con alto poder predictivo llegan como texto o categorías: nivel de estudios, nivel socioeconómico, localidad, marca de tarjeta, modalidad de línea telefónica.
Algunos algoritmos las manejan directamente. Otros, como los vecinos más cercanos o las redes neuronales, necesitan entradas numéricas. Además, depende de la implementación: la documentación de scikit-learn aclara que su versión de los árboles de decisión no admite variables categóricas por ahora, así que hay que codificarlas antes de entrenar.
La pregunta práctica es cómo pasar de categorías a números sin perder el poder predictivo de la variable.
Variables ordenables y no ordenables
Antes de elegir un método hay que distinguir dos tipos.
Ordenables
El dato genera una escala: nivel socioeconómico (de A1 a E) o nivel de estudios (primario, secundario, terciario, universitario). Tiene sentido asignar números que preserven el orden: lo cercano queda cerca y lo lejano, lejos.
No ordenables
No existe un orden natural: localidad, marca de tarjeta, origen de una lista. Forzar una escala numérica es donde empiezan los problemas, porque el modelo interpreta el número como una distancia.
La documentación de scikit-learn lo advierte sobre la codificación con enteros: muchos estimadores esperan una entrada continua e interpretarían las categorías como ordenadas, algo que a menudo no es deseable.
Tres estrategias para convertir variables categóricas
Cada una tiene ventajas y un costo.
| Estrategia | Cómo funciona | Ventaja | Limitación |
|---|---|---|---|
| One Hot Encoding | Crea una columna binaria por cada categoría (1 si pertenece, 0 si no). | Simple y robusta; no inventa un orden. | Con miles de categorías, el dataset crece mucho y el modelo se vuelve difícil de entrenar y propenso al sobreajuste. |
| Número por orden alfabético | Ordena las categorías y asigna 1, 2, 3… | Rápida; no agrega columnas. | La distancia entre números no refleja ninguna relación real: que “Adrogué” sea 1 y “Avellaneda” sea 2 no las hace parecidas. |
| Target encoding | Reemplaza cada categoría por un valor que resume su aporte histórico al objetivo (por ejemplo, su probabilidad de venta). | No agrega columnas y la distancia sí tiene significado para el modelo. | Depende de la variable objetivo: mal calculado, filtra información y da resultados optimistas. |
Una precisión: la numeración por orden alfabético sí es válida cuando el orden es real (niveles de estudio, por ejemplo). El problema es aplicarla a categorías sin orden.
Sobre el target encoding, la documentación de scikit-learn indica que está pensado para categorías nominales con muchas categorías (por ejemplo, códigos postales) y que usa el promedio del objetivo condicionado a la categoría, con un suavizado que acerca las categorías poco frecuentes al promedio global.
Cómo se hace en Python
scikit-learn trae un codificador para cada estrategia.
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder, TargetEncoder
# 1) Variable sin orden y pocas categorías: One Hot Encoding
ohe = OneHotEncoder(handle_unknown="infrequent_if_exist", min_frequency=20)
X_marca = ohe.fit_transform(df[["marca_tarjeta"]])
# 2) Variable con orden real: OrdinalEncoder indicando el orden
orden = [["primario", "secundario", "terciario", "universitario"]]
ord_enc = OrdinalEncoder(categories=orden)
X_estudios = ord_enc.fit_transform(df[["nivel_estudios"]])
# 3) Variable con muchas categorías: target encoding
te = TargetEncoder(smooth="auto")
X_loc_train = te.fit_transform(X_train[["localidad"]], y_train) # no uses fit + transform
X_loc_test = te.transform(X_test[["localidad"]])
Ojo con el target encoding: la documentación de scikit-learn indica que fit_transform usa internamente validación cruzada para evitar que la información del objetivo se filtre en la representación de entrenamiento, y que para entrenar hay que usar fit_transform(X_train, y_train). Calcular las probabilidades con todo el dataset y después dividir en entrenamiento y prueba contamina la evaluación.
Los nombres de columnas y los valores de min_frequency son ilustrativos: ajustalos a tus datos.
El experimento: tres árboles sobre un mismo dataset
Para comparar las estrategias, el equipo docente usó datos reales de un call center que vendía electrónica con llamadas en frío.
El problema
Cada contacto tenía un costo fijo y cada venta generaba una ganancia neta. La pregunta de negocio: ¿a quién conviene llamar para maximizar la ganancia?
Las variables
Año de contacto, marca de tarjeta, modalidad de línea (fija, CPP o MPP), localidad, origen de la lista y resultado de la llamada.
Por qué árboles
Reportan la importancia de las variables y, en la herramienta usada, aceptaban tanto datos numéricos como categóricos. Eso permitió comparar las tres estrategias con el mismo algoritmo.
Los tres árboles
- Árbol 1: la localidad como variable categórica nativa.
- Árbol 2: la localidad reemplazada por un número según el orden alfabético.
- Árbol 3: la localidad reemplazada por su probabilidad histórica de venta (target encoding).
Dos tratamientos previos
- Categorías raras: si una localidad aparecía en la prueba pero no en el entrenamiento, el modelo no podía predecir. Se filtraron las categorías con pocas muestras.
- Clases desbalanceadas: las ventas son poco frecuentes. Se aplicó down sampling sobre la clase mayoritaria para que el modelo aprendiera de las ventas reales y no se limitara a predecir lo más común.
Qué pasó con la importancia de las variables: en el árbol 1 la localidad fue la variable más importante; en el 2, con el número alfabético, perdió mucha relevancia; y en el 3, con la probabilidad histórica, la recuperó. Hasta ahí todo coincidía con la intuición previa.
Cuando la métrica miente
Al comparar los tres modelos por tasa de aciertos sobre el conjunto de prueba, los resultados fueron prácticamente iguales.
La intuición decía que el árbol 2 debía ser claramente peor, pero la tasa de aciertos indicaba que daba lo mismo. La diferencia apareció al medir con una métrica económica: la ganancia neta de la operación, descontando el costo de cada contacto y sumando la ganancia de cada venta. En esa métrica el árbol 2 (número alfabético) rendía menos que los otros dos. Según el equipo docente, la diferencia fue material para la operación, del orden de millones; en este artículo no publicamos la tabla de ganancias, así que tomá la magnitud como ilustrativa de un caso y no como una regla.
Por qué la tasa de aciertos puede engañar
Porque trata todos los errores como equivalentes, y casi nunca lo son:
Falso positivo
Llamar a alguien que no compra: cuesta el contacto.
Falso negativo
No llamar a alguien que hubiera comprado: cuesta la ganancia que se pierde.
Si ajustás los hiperparámetros con la tasa de aciertos, optimizás un objetivo que no es el del negocio. Cuando después comparás con la métrica económica, ningún modelo está bien afinado.
- Definí desde el principio una métrica del negocio: pesos, conversiones, ahorro de tiempo, vidas salvadas.
- Usala para elegir las variables, ajustar los hiperparámetros y comparar modelos.
- Usala también para elegir el umbral de decisión del clasificador.
scikit-learn incluye una herramienta para esto último: TunedThresholdClassifierCV ajusta el umbral de decisión con validación cruzada para maximizar una métrica dada, y su documentación recomienda elegir una métrica significativa para el caso de uso en lugar de quedarse con la predeterminada.
Buenas prácticas
Un resumen de lo que conviene revisar antes de entrenar.
- Identificá si la variable tiene un orden real.
- Contá cuántas categorías tiene y cuántas son raras.
- Decidí qué hacer con las categorías que no aparezcan en el entrenamiento.
- No numeres por orden alfabético categorías sin orden.
- Con pocas categorías, One Hot Encoding. Con muchas, agrupá las raras o usá target encoding con validación cruzada.
- Ajustá el codificador solo con los datos de entrenamiento.
- Compará modelos con la métrica del negocio, no solo con accuracy, F1 o AUC.
- Si las clases están desbalanceadas, balanceá con muestreo o con pesos. La documentación de scikit-learn sugiere equilibrar el peso de cada clase.
- Ajustá el umbral de decisión con datos distintos de los de entrenamiento.
El caso comentado es una sola operación. No demuestra que numerar por orden alfabético siempre falle, pero deja esa práctica bajo sospecha y muestra que la elección de la métrica es tan importante como la elección del algoritmo.
Para ver dónde encaja este paso en un proyecto, mirá el ciclo de vida de un proyecto de ciencia de datos.
Preguntas frecuentes
¿Cuándo uso One Hot Encoding?
Cuando la variable no tiene orden y tiene pocas categorías. Con muchas categorías conviene agruparlas o usar target encoding. Ver Tres estrategias.
¿Es siempre un error numerar las categorías por orden alfabético?
Es un error cuando las categorías no tienen un orden real, porque el modelo interpreta los números como distancias. Si el orden es real, como en los niveles de estudio, sí corresponde. Ver Ordenables y no ordenables.
¿Qué es el target encoding?
Es reemplazar cada categoría por un valor que resume su relación con la variable objetivo, por ejemplo su probabilidad histórica de venta. Hay que calcularlo sin filtrar información entre entrenamiento y prueba. Ver Cómo se hace en Python.
¿Por qué la tasa de aciertos no alcanza para comparar modelos?
Porque trata todos los errores por igual, y en un problema real equivocarse en un sentido cuesta distinto que en otro. Ver Cuando la métrica miente.
¿Hace falta balancear las clases?
Si el evento que buscás es raro, como una venta, conviene hacerlo para que el modelo no aprenda solo la clase más común. Ver El experimento.
¿Las redes neuronales y los árboles necesitan lo mismo?
No. Las redes neuronales requieren entradas numéricas. Los árboles dependen de la implementación: algunas aceptan categorías directamente y la de scikit-learn, según su documentación, todavía no. Ver Por qué hay que convertirlas.
Cómo seguir después de este artículo
- Volvé a la guía: la guía de Machine Learning reúne el resto de los temas.
- Mirá el proceso completo: el ciclo de vida de un proyecto.
- Conocé la herramienta: Python para ciencia de datos.
- Explorá casos reales: los proyectos del Laboratorio de Datos.
Este artículo es informativo y no reemplaza un plan de estudios. Si buscás formación estructurada, el instituto ofrece cursos de ciencia de datos online, diplomaturas en ciencia de datos y cursos on demand.
Fuentes: scikit-learn: Preprocessing data (OneHotEncoder, OrdinalEncoder, TargetEncoder); scikit-learn: Tuning the decision threshold; scikit-learn: Decision Trees. Consultadas en octubre de 2026. El experimento del call center es un caso del equipo docente y no está publicado en una revista científica.