Datos categóricos en Python

Cuando sus datos tienen categorías representadas por cadenas, será difícil usarlos para entrenar modelos de aprendizaje automático que a menudo solo aceptan datos numéricos.

En lugar de ignorar los datos categóricos y excluir la información de nuestro modelo, puede transformar los datos para que puedan usarse en sus modelos.

Mire la tabla a continuación, es el mismo conjunto de datos que usamos en el capítulo de regresión múltiple.

Ejemplo

import pandas as pd

cars = pd.read_csv('data.csv')
print(cars.to_string())

Resultado

             Car       Model  Volume  Weight  CO2
  0       Toyoty        Aygo    1000     790   99
  1   Mitsubishi  Space Star    1200    1160   95
  2        Skoda      Citigo    1000     929   95
  3         Fiat         500     900     865   90
  4         Mini      Cooper    1500    1140  105
  5           VW         Up!    1000     929  105
  6        Skoda       Fabia    1400    1109   90
  7     Mercedes     A-Class    1500    1365   92
  8         Ford      Fiesta    1500    1112   98
  9         Audi          A1    1600    1150   99
  10     Hyundai         I20    1100     980   99
  11      Suzuki       Swift    1300     990  101
  12        Ford      Fiesta    1000    1112   99
  13       Honda       Civic    1600    1252   94
  14      Hundai         I30    1600    1326   97
  15        Opel       Astra    1600    1330   97
  16         BMW           1    1600    1365   99
  17       Mazda           3    2200    1280  104
  18       Skoda       Rapid    1600    1119  104
  19        Ford       Focus    2000    1328  105
  20        Ford      Mondeo    1600    1584   94
  21        Opel    Insignia    2000    1428   99
  22    Mercedes     C-Class    2100    1365   99
  23       Skoda     Octavia    1600    1415   99
  24       Volvo         S60    2000    1415   99
  25    Mercedes         CLA    1500    1465  102
  26        Audi          A4    2000    1490  104
  27        Audi          A6    2000    1725  114
  28       Volvo         V70    1600    1523  109
  29         BMW           5    2000    1705  114
  30    Mercedes     E-Class    2100    1605  115
  31       Volvo        XC70    2000    1746  117
  32        Ford       B-Max    1600    1235  104
  33         BMW         216    1600    1390  108
  34        Opel      Zafira    1600    1405  109
  35    Mercedes         SLK    2500    1395  120

En el capítulo de regresión múltiple, intentamos predecir el CO2 emitido en función del volumen del motor y el peso del automóvil, pero excluimos información sobre la marca y el modelo del automóvil.

La información sobre la marca del coche o el modelo del coche puede ayudarnos a hacer una mejor predicción del CO2 emitido.

Codificación activa

No podemos hacer uso de la columna Coche o Modelo en nuestros datos ya que no son numéricos. No se puede determinar una relación lineal entre una variable categórica, Coche o Modelo, y una variable numérica, CO2.

Para solucionar este problema, debemos tener una representación numérica de la variable categórica. Una forma de hacer esto es tener una columna que represente a cada grupo en la categoría.

Para cada columna, los valores serán 1 o 0, donde 1 representa la inclusión del grupo y 0 representa la exclusión. Esta transformación se denomina codificación en caliente.

No tiene que hacer esto manualmente, el módulo Python Pandas tiene una función llamada get_dummies() que realiza una codificación en caliente.

import pandas as pd

cars = pd.read_csv('data.csv')
ohe_cars = pd.get_dummies(cars[['Car']])
print(cars.to_string())

Ejemplo

Codifica en caliente la columna del automóvil:

      Car_Audi  Car_BMW  Car_Fiat  Car_Ford  Car_Honda  Car_Hundai  Car_Hyundai  Car_Mazda  Car_Mercedes  Car_Mini  Car_Mitsubishi  Car_Opel  Car_Skoda  Car_Suzuki  Car_Toyoty  Car_VW  Car_Volvo
  0          0        0         0         0          0           0            0          0             0         0               0         0          0           0           1       0          0
  1          0        0         0         0          0           0            0          0             0         0               1         0          0           0           0       0          0
  2          0        0         0         0          0           0            0          0             0         0               0         0          1           0           0       0          0
  3          0        0         1         0          0           0            0          0             0         0               0         0          0           0           0       0          0
  4          0        0         0         0          0           0            0          0             0         1               0         0          0           0           0       0          0
  5          0        0         0         0          0           0            0          0             0         0               0         0          0           0           0       1          0
  6          0        0         0         0          0           0            0          0             0         0               0         0          1           0           0       0          0
  7          0        0         0         0          0           0            0          0             1         0               0         0          0           0           0       0          0
  8          0        0         0         1          0           0            0          0             0         0               0         0          0           0           0       0          0
  9          1        0         0         0          0           0            0          0             0         0               0         0          0           0           0       0          0
  10         0        0         0         0          0           0            1          0             0         0               0         0          0           0           0       0          0
  11         0        0         0         0          0           0            0          0             0         0               0         0          0           1           0       0          0
  12         0        0         0         1          0           0            0          0             0         0               0         0          0           0           0       0          0
  13         0        0         0         0          1           0            0          0             0         0               0         0          0           0           0       0          0
  14         0        0         0         0          0           1            0          0             0         0               0         0          0           0           0       0          0
  15         0        0         0         0          0           0            0          0             0         0               0         1          0           0           0       0          0
  16         0        1         0         0          0           0            0          0             0         0               0         0          0           0           0       0          0
  17         0        0         0         0          0           0            0          1             0         0               0         0          0           0           0       0          0
  18         0        0         0         0          0           0            0          0             0         0               0         0          1           0           0       0          0
  19         0        0         0         1          0           0            0          0             0         0               0         0          0           0           0       0          0
  20         0        0         0         1          0           0            0          0             0         0               0         0          0           0           0       0          0
  21         0        0         0         0          0           0            0          0             0         0               0         1          0           0           0       0          0
  22         0        0         0         0          0           0            0          0             1         0               0         0          0           0           0       0          0
  23         0        0         0         0          0           0            0          0             0         0               0         0          1           0           0       0          0
  24         0        0         0         0          0           0            0          0             0         0               0         0          0           0           0       0          1
  25         0        0         0         0          0           0            0          0             1         0               0         0          0           0           0       0          0
  26         1        0         0         0          0           0            0          0             0         0               0         0          0           0           0       0          0
  27         1        0         0         0          0           0            0          0             0         0               0         0          0           0           0       0          0
  28         0        0         0         0          0           0            0          0             0         0               0         0          0           0           0       0          1
  29         0        1         0         0          0           0            0          0             0         0               0         0          0           0           0       0          0
  30         0        0         0         0          0           0            0          0             1         0               0         0          0           0           0       0          0
  31         0        0         0         0          0           0            0          0             0         0               0         0          0           0           0       0          1
  32         0        0         0         1          0           0            0          0             0         0               0         0          0           0           0       0          0
  33         0        1         0         0          0           0            0          0             0         0               0         0          0           0           0       0          0
  34         0        0         0         0          0           0            0          0             0         0               0         1          0           0           0       0          0
  35         0        0         0         0          0           0            0          0             1         0               0         0          0           0           0       0          0

Resultado

import pandas

Predecir CO2

Podemos usar esta información adicional junto con el volumen y el peso para predecir el CO2

Para combinar la información, podemos usar la función concat() de pandas.

Primero necesitaremos importar un par de módulos.

Comenzaremos con la importación de Pandas.

cars = pandas.read_csv("data.csv")

El módulo pandas nos permite leer archivos csv y manipular objetos DataFrame:

ohe_cars = pandas.get_dummies(cars[['Car']])

También nos permite crear las variables dummies:

X = pandas.concat([cars[['Volume', 'Weight']], ohe_cars], axis=1)
y = cars['CO2']

Luego debemos seleccionar las variables independientes (X) y sumar las variables ficticias por columnas.

También almacene la variable dependiente en y.

from sklearn import linear_model

También necesitamos importar un método de sklearn para crear un modelo lineal

Más información sobre la regresión lineal.

Ahora podemos ajustar los datos a una regresión lineal:

regr = linear_model.LinearRegression()
regr.fit(X,y)

Finalmente, podemos predecir las emisiones de CO2 en función del peso, el volumen y el fabricante del automóvil.

##predict the CO2 emission of a Volvo where the weight is 2300kg, and the volume is 1300cm3:
predictedCO2 = regr.predict([[2300,1300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])

Ejemplo

import pandas
from sklearn import linear_model

cars = pandas.read_csv("data.csv")
ohe_cars = pandas.get_dummies(cars[['Car']])

X = pandas.concat([cars[['Volume', 'Weight']], ohe_cars], axis=1)
y = cars['CO2']

regr = linear_model.LinearRegression()
regr.fit(X,y)

##predict the CO2 emission of a Volvo where the weight is 2300kg, and the volume is 1300cm3:
predictedCO2 = regr.predict([[2300,1300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])

print(predictedCO2)

Resultado

[122.45153299]

Ahora tenemos un coeficiente para el volumen, el peso y cada marca de automóvil en el conjunto de datos.

Dummifying

No es necesario crear una columna para cada grupo en su categoría. La información se puede retener usando 1 columna menos que el número de grupos que tiene.

Por ejemplo, tiene una columna que representa colores y en esa columna tiene dos colores, rojo y azul.

Ejemplo

import pandas as pd

colors = pd.DataFrame({'color': ['blue', 'red']})

print(colors)

Resultado

    color
  0  blue
  1   red

Puede crear 1 columna llamada roja donde 1 representa rojo y 0 representa no rojo, lo que significa que es azul.

Para hacer esto, podemos usar la misma función que usamos para una codificación activa, get_dummies, y luego soltar una de las columnas. Hay un argumento, drop_first, que nos permite excluir la primera columna de la tabla resultante.

Ejemplo

import pandas as pd

colors = pd.DataFrame({'color': ['blue', 'red']})
dummies = pd.get_dummies(colors, drop_first=True)

print(dummies)

Resultado

     color_red
  0          0
  1          1

¿Qué pasa si tienes más de 2 grupos? ¿Cómo se pueden representar los múltiples grupos con 1 columna menos?

Digamos que tenemos tres colores esta vez, rojo, azul y verde. Cuando get_dummies mientras soltamos la primera columna, obtenemos la siguiente tabla.

Ejemplo

import pandas as pd

colors = pd.DataFrame({'color': ['blue', 'red', 'green']})
dummies = pd.get_dummies(colors, drop_first=True)
dummies['color'] = colors['color']

print(dummies)

Resultado

     color_green  color_red  color
  0            0          0   blue
  1            0          1    red
  2            1          0  green