Codificaci贸n One-Hot en Python con Pandas y Scikit-Learn

    Introducci贸n

    En inform谩tica, los datos se pueden representar de muchas formas diferentes y, naturalmente, cada una de ellas tiene sus ventajas y desventajas en determinados campos.

    Dado que las computadoras no pueden procesar datos categ贸ricos, ya que estas categor铆as no tienen significado para ellos, esta informaci贸n debe prepararse si queremos que una computadora pueda procesarla.

    Esta acci贸n se denomina preprocesamiento. Una gran parte del preprocesamiento es la codificaci贸n, que representa cada uno de los datos de una manera que una computadora pueda entender (el nombre significa literalmente “convertir a c贸digo de computadora”).

    En muchas ramas de la inform谩tica, especialmente en el Machine Learning y el dise帽o de circuitos digitales, la codificaci贸n One-Hot Encoding se utiliza ampliamente.

    En este art铆culo, explicaremos qu茅 es la codificaci贸n one-hot y la implementaremos en Python usando algunas opciones populares, Pandas y Scikit-Learn. Tambi茅n compararemos su efectividad con otros tipos de representaci贸n en computadoras, sus puntos fuertes y debilidades, as铆 como sus aplicaciones.

    驴Qu茅 es la codificaci贸n One-Hot?

    La codificaci贸n one-hot es un tipo de representaci贸n vectorial en la que todos los elementos de un vector son 0, excepto uno, que tiene 1 como valor, donde 1 representa una boolean especificando una categor铆a del elemento.

    Tambi茅n existe una implementaci贸n similar llamada One-Cold Encoding, donde todos los elementos de un vector son 1, excepto uno, que tiene 0 como valor.

    Por ejemplo, [0, 0, 0, 1, 0] y [1 ,0, 0, 0, 0] podr铆an ser algunos ejemplos de vectores one-hot. Una t茅cnica similar a esta, tambi茅n utilizada para representar datos, ser铆a variables ficticias en estad铆stica.

    Esto es muy diferente de otros esquemas de codificaci贸n, que permiten que varios bits tengan 1 como valor. A continuaci贸n se muestra una tabla que compara la representaci贸n de los n煤meros del 0 al 7 en binario, c贸digo Gray y one-hot:

    Decimal Binary Gray code One-Hot

    00000000000000
    10010010000001
    20100110000010
    30110100000100
    41001100001000
    51011110010000
    61101010100000
    71111001000000

    Pr谩cticamente, para cada vector one-hot, hacemos n preguntas, donde n es el n煤mero de categor铆as que tenemos:

    驴Es este el n煤mero 1? 驴Es este el n煤mero 2? … 驴Es este el n煤mero 7?

    Cada “0” es “falso” y una vez que damos a un “1” en un vector, la respuesta a la pregunta es “verdadera”.

    La codificaci贸n one-hot transforma las caracter铆sticas categ贸ricas en un formato que funciona mejor con los algoritmos de clasificaci贸n y regresi贸n. Es muy 煤til en m茅todos donde se necesitan m煤ltiples tipos de representaci贸n de datos.

    Por ejemplo, algunos vectores pueden ser 贸ptimos para la regresi贸n (funciones aproximadas basadas en valores de retorno anteriores), y algunos pueden ser 贸ptimos para la clasificaci贸n (categorizaci贸n en conjuntos / clases fijos, generalmente binarios):

    ID de etiqueta

    fresa1
    manzana2
    Sand铆a3
    Lim贸n4
    melocot贸n5
    naranja6

    Aqu铆 tenemos seis entradas de muestra de datos categ贸ricos. El tipo de codificaci贸n que se usa aqu铆 se llama “codificaci贸n de etiqueta” y es muy simple: simplemente asignamos una ID para un valor categ贸rico.

    Nuestra computadora ahora sabe c贸mo representar estas categor铆as, porque sabe c贸mo trabajar con n煤meros. Sin embargo, este m茅todo de codificaci贸n no es muy eficaz, ya que tiende naturalmente a dar mayor peso a los n煤meros m谩s altos.

    No tendr铆a sentido decir que nuestra categor铆a de “Fresas” es mayor o menor que “Manzanas”, o que agregar la categor铆a “Lim贸n” a “Melocot贸n” nos dar铆a una categor铆a “Naranja”, ya que estos valores no son ordinal.

    Si represent谩ramos estas categor铆as en una codificaci贸n one-hot, en realidad reemplazar铆amos las filas con columnas. Hacemos esto creando uno boolean columna para cada una de nuestras categor铆as dadas, donde solo una de estas columnas podr铆a tomar el valor 1 para cada muestra:

    Fresa Manzana Sand铆a Lim贸n Melocot贸n Naranja ID

    1000001
    0100002
    0010003
    0001004
    0000105
    0000016

    Podemos ver en las tablas anteriores que se necesitan m谩s d铆gitos en la representaci贸n one-hot en comparaci贸n con el c贸digo binario o Gray. Para n d铆gitos, la codificaci贸n one-hot solo puede representar n valores, mientras que la codificaci贸n binaria o Gray puede representar 2n valores usando n d铆gitos.

    Implementaci贸n

    Pandas

    Echemos un vistazo a un ejemplo simple de c贸mo podemos convertir valores de una columna categ贸rica en nuestro conjunto de datos en sus contrapartes num茅ricas, a trav茅s del esquema de codificaci贸n one-hot.

    Crearemos un conjunto de datos realmente simple: una lista de pa铆ses y sus ID:

    import pandas as pd
    
    ids = [11, 22, 33, 44, 55, 66, 77]
    countries = ['Spain', 'France', 'Spain', 'Germany', 'France']
    
    df = pd.DataFrame(list(zip(ids, countries)),
                      columns=['Ids', 'Countries'])
    

    En el script anterior, creamos un marco de datos de Pandas, llamado df usando dos listas, es decir ids y countries. Si llamas al head() en el marco de datos, deber铆a ver el siguiente resultado:

    df.head()
    

    los Countries La columna contiene valores categ贸ricos. Podemos convertir los valores en el Countries columna en vectores codificados one-hot usando el get_dummies() funci贸n:

    y = pd.get_dummies(df.Countries, prefix='Country')
    print(y.head())
    

    Pasamos Country como el valor de la prefix atributo del get_dummies() m茅todo, por lo tanto, puede ver la cadena Country prefijado antes del encabezado de cada una de las columnas codificadas one-hot en la salida.

    Ejecutar este c贸digo produce:

       Country_France  Country_Germany  Country_Spain
    0               0                0              1
    1               1                0              0
    2               0                0              1
    3               0                1              0
    4               1                0              0
    

    Scikit-Learn

    Una alternativa ser铆a utilizar otra biblioteca popular: Scikit-Learn. Ofrece tanto la OneHotEncoder clase y el LabelBinarizer clase para este prop贸sito.

    Primero, comencemos importando el LabelBinarizer:

    from sklearn.preprocessing import LabelBinarizer
    

    Y luego, usando el mismo marco de datos que antes, instanciamos el LabelBinarizer y encajarlo:

    y = LabelBinarizer().fit_transform(df.Countries)
    

    Impresi贸n y rendir铆a:

    [[0 0 1]
     [1 0 0]
     [0 0 1]
     [0 1 0]
     [1 0 0]]
    

    Sin embargo, esto no es tan bonito como el enfoque de Pandas.

    Del mismo modo, podemos utilizar el OneHotEncoder class, que admite datos de varias columnas, a diferencia de la clase anterior:

    from sklearn.preprocessing import OneHotEncoder
    

    Y luego, completemos una lista y col贸quela en el codificador:

    x = [[11, "Spain"], [22, "France"], [33, "Spain"], [44, "Germany"], [55, "France"]]
    y = OneHotEncoder().fit_transform(x).toarray()
    print(y)
    

    Ejecutar esto producir谩:

    [[1. 0. 0. 0. 0. 0. 0. 1.]
     [0. 1. 0. 0. 0. 1. 0. 0.]
     [0. 0. 1. 0. 0. 0. 0. 1.]
     [0. 0. 0. 1. 0. 0. 1. 0.]
     [0. 0. 0. 0. 1. 1. 0. 0.]]
    

    Aplicaciones de la codificaci贸n One-Hot

    La codificaci贸n one-hot ha visto la mayor parte de su aplicaci贸n en los campos del Machine Learning y el dise帽o de circuitos digitales.

    Machine Learning

    Como se indic贸 anteriormente, las computadoras no son muy buenas con datos categ贸ricos. Si bien entendemos bien los datos categ贸ricos, se debe a un tipo de conocimiento previo que las computadoras no tienen.

    La mayor铆a de las t茅cnicas y modelos de Machine Learning funcionan con un conjunto de datos muy delimitado (normalmente binario). Las redes neuronales consumen datos y producen resultados en el rango de 0..1 y rara vez iremos m谩s all谩 de ese alcance.

    En resumen, la gran mayor铆a de los algoritmos de Machine Learning reciben datos de muestra (“datos de entrenamiento”) de los que se extraen caracter铆sticas. Con base en estas caracter铆sticas, se crea un modelo matem谩tico, que luego se utiliza para realizar predicciones o decisiones sin estar programado expl铆citamente para realizar estas tareas.

    Un gran ejemplo ser铆a la Clasificaci贸n, donde la entrada puede ser t茅cnicamente ilimitada, pero la salida normalmente se limita a unas pocas clases. En el caso de la clasificaci贸n binaria (digamos que estamos ense帽ando una red neuronal para clasificar perros y gatos), tendr铆amos un mapeo de 0 para gatos, y 1 para perros.

    La mayor铆a de las veces, los datos de entrenamiento sobre los que deseamos realizar predicciones son categ贸ricos, como el ejemplo con frutas mencionado anteriormente. Una vez m谩s, aunque esto tiene mucho sentido para nosotros, las palabras en s铆 mismas no tienen ning煤n significado para el algoritmo, ya que no las entiende.

    El uso de codificaci贸n one-hot para la representaci贸n de datos en estos algoritmos no es t茅cnicamente necesario, pero es bastante 煤til si queremos una implementaci贸n eficiente.

    Dise帽o de circuitos digitales

    Muchos circuitos digitales b谩sicos utilizan la notaci贸n one-hot para representar sus valores de E / S.

    Por ejemplo, puede usarse para indicar el estado de una m谩quina de estados finitos. Si se usa alg煤n otro tipo de representaci贸n, como Gray o Binary, se necesita un decodificador para determinar el estado, ya que no son tan naturalmente compatibles. Por el contrario, una m谩quina de estado finito de un solo calor no necesita el decodificador, porque si el en茅simo bit es alto, la m谩quina est谩, l贸gicamente, en el en茅simo estado.

    Un buen ejemplo de una m谩quina de estados finitos es un contador de anillo, un tipo de contador compuesto por flip-flops conectados a un registro de desplazamiento, en el que la salida de un flip-flop se conecta a la entrada del otro.

    El primer flip-flop de este contador representa el primer estado, el segundo representa el segundo estado, y as铆 sucesivamente. Al principio, todos los flip-flops de la m谩quina est谩n configurados en ‘0’, excepto el primero, que est谩 configurado en ‘1’.

    El siguiente borde del reloj que llega a los flip flops avanza el bit “caliente” al segundo flip flop. El bit ‘caliente’ avanza as铆 hasta el 煤ltimo estado, despu茅s de lo cual la m谩quina vuelve al primer estado.

    Otro ejemplo del uso de codificaci贸n one-hot en el dise帽o de circuitos digitales ser铆a un decodificador de direcciones, que toma una entrada de c贸digo binario o Gray y luego la convierte en one-hot para la salida, as铆 como un codificador de prioridad (que se muestra en la imagen debajo).

    Es exactamente lo contrario y toma la entrada one-hot y la convierte a Binary o Gray:

    Ventajas y desventajas de la codificaci贸n One-hot

    Como cualquier otro tipo de codificaci贸n, one-hot tiene muchos aspectos positivos y problem谩ticos.

    Ventajas

    Una gran ventaja de la codificaci贸n one-hot es que determinar el estado de una m谩quina tiene un costo bajo y constante, porque todo lo que necesita hacer es acceder a un flip-flop. Cambiar el estado de la m谩quina es casi tan r谩pido, ya que solo necesita acceder a dos flip-flops.

    Otra gran ventaja de la codificaci贸n one-hot es su f谩cil implementaci贸n. Los circuitos digitales hechos en esta notaci贸n son muy f谩ciles de dise帽ar y modificar. Los estados ilegales en la m谩quina de estados finitos tambi茅n son f谩ciles de detectar.

    Una implementaci贸n one-hot es conocida por ser la m谩s r谩pida, ya que permite que una m谩quina de estado se ejecute a una velocidad de reloj m谩s r谩pida que cualquier otra codificaci贸n de esa m谩quina de estado.

    Desventajas

    Una de las principales desventajas que tiene la codificaci贸n one-hot es el hecho mencionado anteriormente de que no puede representar muchos valores (por norte estados, necesitar铆amos norte d铆gitos – o flip-flops). Por eso, si quisi茅ramos implementar un contador de anillo de 15 estados de un solo estado, por ejemplo, necesitar铆amos 15 flip-flops, mientras que la implementaci贸n binaria solo necesitar铆a tres flip-flops.

    Esto lo hace especialmente impr谩ctico para dispositivos PAL, y tambi茅n puede ser muy costoso, pero aprovecha las abundantes flip-flops de una FPGA.

    Otro problema con este tipo de codificaci贸n es que muchos de los estados en una m谩quina de estados finitos ser铆an ilegales, por cada norte estados v谩lidos, hay (2n – n) ilegales. Lo bueno es que estos estados ilegales son, como se dijo anteriormente, realmente f谩ciles de detectar (una puerta XOR ser铆a suficiente), por lo que no es muy dif铆cil cuidarlos.

    Conclusi贸n

    Dado que la codificaci贸n one-hot es muy simple, es f谩cil de entender y usar en la pr谩ctica. No es de extra帽ar que sea tan popular en el mundo de la inform谩tica.

    Debido al hecho de que las desventajas no son tan malas, se ha visto una amplia aplicaci贸n. Al final del d铆a, sus ventajas superan claramente a las desventajas, por lo que este tipo de implementaci贸n definitivamente se mantendr谩 durante mucho tiempo en el futuro.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *