Qué es Una codificación en Caliente y Cómo Hacerla

Si te gusta el aprendizaje automático, inevitablemente te encontrarás con esta cosa llamada «Una codificación en caliente». Sin embargo, es una de esas cosas que son difíciles de comprender como principiante en el aprendizaje automático, ya que necesita saber algunas cosas sobre el aprendizaje automático para entenderlo. Para ayudar, pensé que intentaría proporcionar una explicación para principiantes.

Lo primero que haces cuando haces cualquier tipo de programa de aprendizaje automático suele ser el preprocesamiento. Con eso, me refiero a preparar datos para ser analizados por su programa. Después de todo, no puedes simplemente lanzar una hoja de cálculo o algunas imágenes a tu programa y esperar que sepa qué hacer. Aún no estamos en ese nivel de IA.

Una gran parte del preprocesamiento es algo que codifica. Esto significa representar cada pieza de datos de una manera que la computadora pueda entender, de ahí el nombre encode, que literalmente significa «convertir en código». Hay muchas formas diferentes de codificación, como la Codificación de etiquetas o, como habrás adivinado, Una codificación en caliente. La codificación de etiquetas es intuitiva y fácil de entender, así que lo explicaré primero. Con suerte, a partir de ahí podrá comprender completamente una codificación en caliente.

Supongamos que estamos trabajando con datos categóricos, como gatos y perros. Mirando el nombre de la codificación de etiquetas, es posible que pueda adivinar que codifica etiquetas, donde la etiqueta es solo una categoría (es decir, gato o perro), y codificar solo significa darles un número para representar esa categoría (1 para gato y 2 para perro). Al asignar un número a cada categoría, la computadora ahora sabe cómo representarlos, ya que la computadora sabe cómo trabajar con números. Y ahora ya hemos terminado de explicar la codificación de etiquetas. Pero hay un problema que hace que a menudo no funcione para datos categóricos.

El problema es que con la codificación de etiquetas, las categorías ahora tienen relaciones ordenadas naturales. La computadora hace esto porque está programada para tratar números más altos como números más altos; naturalmente, dará a los números más altos pesos más altos. Podemos ver el problema con esto en un ejemplo:

  • Imagínese si tuviera 3 categorías de alimentos: manzanas, pollo y brócoli. Usando la codificación de etiquetas, asignaría a cada uno de ellos un número para categorizarlos: manzanas = 1, pollo = 2 y brócoli = 3. Pero ahora, si su modelo internamente necesita calcular el promedio entre categorías, podría hacer 1 + 3 = 4/2 = 2. Esto significa que, de acuerdo con su modelo, el promedio de manzanas y pollo juntos es brócoli.

Obviamente, esa línea de pensamiento de su modelo va a llevar a que obtenga correlaciones completamente incorrectas, por lo que necesitamos introducir la codificación one-hot.

En lugar de etiquetar las cosas como un número que comienza desde 1 y luego aumenta para cada categoría, optaremos por un estilo de categorización más binario. Es posible que hayas estado pensando que si supieras lo que es un one-hot (se relaciona con la codificación binaria, pero no te preocupes por ello). Permítanme proporcionar una diferencia visualizada entre etiqueta y codificación one-hot. Vea si usted puede trabajar la diferencia:

¿Cuál es la diferencia? Bueno, nuestras categorías eran anteriormente filas, pero ahora son columnas. Sin embargo, nuestra variable numérica, las calorías, se ha mantenido igual. Un 1 en una columna en particular le indicará al ordenador la categoría correcta para los datos de esa fila. En otras palabras, hemos creado una columna binaria adicional para cada categoría.

No está claro de inmediato por qué esto es mejor (aparte del problema que mencioné anteriormente), y eso es porque no hay una razón clara. Como muchas cosas en el aprendizaje automático, no lo usaremos en todas las situaciones; no es mejor que la codificación de etiquetas. Simplemente soluciona un problema que encontrará con la codificación de etiquetas cuando trabaje con datos categóricos

Una codificación en caliente en el Código (¿Lo entiende? Es un juego de palabras)

Siempre es útil ver cómo se hace esto en código, así que hagamos un ejemplo. Normalmente, creo firmemente que deberíamos hacer algo sin bibliotecas para aprenderlo, pero solo para este tedioso proceso previo, realmente no lo necesitamos. Las bibliotecas pueden hacer esto tan simple. Vamos a usar numpy, sklearn y pandas, ya que te encontrarás usando esas 3 bibliotecas en muchos de tus proyectos

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
import pandas as pd

Ahora que tenemos las herramientas, comencemos. Trabajaremos con un conjunto de datos inventado. Ingrese el conjunto de datos con los pandas .read_csv característica:

dataset = pd.read_csv('made_up_thing.csv')

Esperemos que eso se explique por sí mismo. El siguiente es un poco más complicado. Lo que pasa con las hojas de cálculo es que puede que te importe o no algunas de las columnas. En aras de la simplicidad, digamos que nos importa todo, excepto la última columna. Vamos a usar la función de los pandas .iloc, que obtiene los datos en cualquier columna(s) que se le indique:

X = dataset.iloc.values

.en realidad, iloc acepta, así que ingresamos . El : es porque queremos todas las filas de esas columnas, y : es la forma en que lo haces. Añadimos el .valores para, bueno, obtener los valores en los segmentos que hemos seleccionado. En otras palabras, la primera parte selecciona los valores, la segunda obtiene los valores.

Ahora vamos a hacer la codificación real. Sklearn lo hace increíblemente fácil, pero hay una trampa. Es posible que haya notado que importamos tanto el codificador de etiquetas como el codificador en caliente. El codificador en caliente de Sklearn en realidad no sabe cómo convertir categorías a números, solo sabe cómo convertir números a binarios. Primero tenemos que usar el codificador de etiquetas.

Primero, configuraremos un labelencoder como lo haría con cualquier objeto normal:

le = LabelEncoder()

Ahora tenemos que usar el de Sklearn .fit_transform función. Digamos que necesitamos codificar solo la primera columna. Nosotros haríamos:

X = le.fit_transform(X)

Esta función es solo una combinación de la .en forma y .transformar comandos. .fit toma X (en este caso la primera columna de X debido a nuestra X) y convierte todo en datos numéricos. .transform luego aplica esa conversión.

Todo lo que queda es usar el codificador en caliente. Afortunadamente, es casi lo mismo que lo que acabamos de hacer:

ohe = OneHotEncoder(categorical_features = )
X = ohe.fit_transform(X).toarray()

Categorical_feartures es un parámetro que especifica qué columna queremos codificar en caliente, y como queremos codificar la primera columna, ponemos . Finalmente, ajustamos la transformación en binario y la convertimos en una matriz para que podamos trabajar con ella fácilmente en el futuro.

Y eso es todo! Es bastante simple. Una nota final, sin embargo, si necesita hacer más que solo la primera columna, haga lo que acabamos de hacer, pero en lugar de 0, coloque la columna que desee. Para muchas columnas, puede ponerlo en un bucle for:

le = LabelEncoder()#for 10 columns
for i in range(10):
X = le.fit_transform(X)

¡Buena suerte en tus aventuras de aprendizaje automático!