6 votos

En la práctica, ¿por qué convertimos las etiquetas de las clases categóricas en números enteros para la clasificación?

Puede que sea una pregunta ingenua, pero me pregunto por qué nosotros (o tal vez sólo yo) convertimos las etiquetas de clases categóricas en números enteros antes de alimentar un clasificador en un paquete de software como la biblioteca scikit-learn ML de Python.

Tomemos el simple conjunto de datos de Iris, ¿por qué convertimos las etiquetas de clase de "Setosa", "Virginica" y "Versicolor" a, por ejemplo, 0, 1 y 2?

Esta pregunta surgió cuando estaba trabajando en colaboración en un proyecto y uno de mis compañeros no utilizó un codificador de etiquetas para convertir las etiquetas de clase de cadenas a enteros. Funcionaba (ella usaba scikit-learn); yo lo "corregí" intuitivamente (inserté un codificador de etiquetas) y ella me preguntó por qué: Bueno, realmente no tenía una buena respuesta a eso, aparte de "la mayoría de los algoritmos de aprendizaje automático funcionan mejor de esta manera" (esto es algo que leí hace algún tiempo en alguna parte).

Ahora que lo pienso: ¿Cuál es la razón de ser de esto? Dado que en las tareas típicas de clasificación las etiquetas de clase son variables nominales, no ordinales, ¿se trata de eficiencia computacional (almacenar y procesar menos "datos")?

4voto

KhaaL Puntos 66

Scikit learn sólo maneja números reales, creo. Así que tienes que hacer algo como una codificación en caliente donde se utilizan n dimensiones numéricas para representar la pertenencia a las categorías. Si sólo pasas cadenas, se convertirán en flotantes de forma impredecible.

Hay razones matemáticas por las que algunos métodos (como svm) necesitan flotadores. Es decir, sólo están definidos en el espacio de los números reales. Representar 3 categorías como valores 1,2,3 en un solo método podría funcionar, pero también podría producir un rendimiento subóptimo en comparación con una codificación en caliente, ya que la división (1,3) frente a (2) es difícil de captar a menos que el método pueda capturar un comportamiento muy no lineal como ese.

Otros métodos, como el bosque aleatorio, pueden funcionar directamente con valores categóricos. Es decir, durante el aprendizaje de la decisión se pueden proponer divisiones potenciales como diferentes combinaciones de categorías. Para estos métodos, a menudo es conveniente utilizar ints para representar las categorías porque una matriz de ints es mucho más agradable para trabajar que una matriz de cadenas a nivel computacional. También se pueden hacer cosas como generar todas las combinaciones posibles de n categorías mirando los valores de los bits de un entero de n bits que se está incrementando, lo que puede ser mucho más rápido y eficiente en cuanto a memoria que buscar divisiones sobre n-floats.

2voto

WinWin Puntos 395

Para la clasificación binaria se suele utilizar 0/1 o -1/1. Debido a la simetría, no importa qué etiqueta corresponde a cada clase. Para la clasificación multiclase, por ejemplo, para la clasificación de 3 clases, no se puede utilizar 0, 1 y 2 porque esta forma de etiquetar implica un orden (aunque no estoy familiarizado con el conjunto de datos de Iris) y no se puede utilizar para datos categóricos. Una forma de codificar las etiquetas categóricas es utilizar (1 0 0), (0 1 0) y (0 0 1). Puede pensar en estas etiquetas como vértices de un triángulo equilátero en 3D. Por lo tanto, no hay ningún orden implícito. Sin embargo, si se utiliza un clasificador binario (como SVM) en lugar de un verdadero clasificador multiclase, no podemos utilizar este etiquetado. En su lugar, se entrenan múltiples clasificadores binarios y sus resultados se combinan de alguna manera entre sí. Por ejemplo, si tiene N categorías, puede entrenar ${N \choose 2}$ clasificadores y para cada par se utilizan etiquetas 0/1 para indicar las dos clases (de N) que se están entrenando entre sí. En el momento de la prueba se vota por mayoría entre todos los ${N \choose 2}$ Los clasificadores pueden utilizarse para hacer una predicción.

Si está utilizando una interfaz, tal vez convierta sus etiquetas 0/1/2 antes de interactuar con el clasificador o los clasificadores, dependiendo de cuál sea ese clasificador.

1voto

Marc Claesen Puntos 9818

Es sólo cuestión de ser práctico. Para la clasificación binaria lo más sencillo es utilizar booleanos, para la multiclase son enteros. La mayoría de las bibliotecas de back-end están escritas en lenguajes de tipado estático (C/C++), y suelen utilizar el tipo más básico que permite realizar el trabajo sin perder información.

0voto

Jack Puntos 18

Algunos algoritmos sólo pueden manejar entradas numéricas, esta podría ser la razón principal aunque el almacenamiento es otra razón.

Por supuesto, algunos algoritmos pueden hacer la conversión de forma implícita.

0voto

krish___na Puntos 11

Hay algunos algoritmos que por defecto se encargan de la codificación básica de las etiquetas.

Pero como desarrollador, debe asegurarse de que los datos que se pasan al modelo, son representación correcta de la realidad presente en los datos.

Por ejemplo, si sus datos tienen la columna "Función del ingeniero", entonces Senior > Junior > Fresher . En este caso, es necesario codificar los valores en LabelEncode para 3 > 2 > 1 respectivamente .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X