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