Importación de los paquetes básicos
import matplotlib.pyplot as plt # para crear graficos import pandas as pd # herramientas para analisis de datos y estructuras de datos import pylab as pl # añade numpy+scipy+sympy+pandas+matplotlib+ipython = MatLab import numpy as np # paquete básico para calculos científicos %matplotlib inline # muestra los graficos en la linea de comandos de Python
Descarga del fichero de datos
!wget -O FuelConsumption.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/FuelConsumptionCo2.csv df = pd.read_csv("FuelConsumption.csv") df.head() # mostramos los primeros datos
MODELYEAR | MAKE | MODEL | VEHICLECLASS | ENGINESIZE | CYLINDERS | TRANSMISSION | FUELTYPE | FUELCONSUMPTION_CITY | FUELCONSUMPTION_HWY | FUELCONSUMPTION_COMB | FUELCONSUMPTION_COMB_MPG | CO2EMISSIONS | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2014 | ACURA | ILX | COMPACT | 2.0 | 4 | AS5 | Z | 9.9 | 6.7 | 8.5 | 33 | 196 |
1 | 2014 | ACURA | ILX | COMPACT | 2.4 | 4 | M6 | Z | 11.2 | 7.7 | 9.6 | 29 | 221 |
2 | 2014 | ACURA | ILX HYBRID | COMPACT | 1.5 | 4 | AV7 | Z | 6.0 | 5.8 | 5.9 | 48 | 136 |
3 | 2014 | ACURA | MDX 4WD | SUV – SMALL | 3.5 | 6 | AS6 | Z | 12.7 | 9.1 | 11.1 | 25 | 255 |
4 | 2014 | ACURA | RDX AWD | SUV – SMALL | 3.5 | 6 | AS6 | Z | 12.1 | 8.7 | 10.6 | 27 | 244 |
Listamos los estadísticos principales para cada variable
df.describe()
MODELYEAR | ENGINESIZE | CYLINDERS | FUELCONSUMPTION_CITY | FUELCONSUMPTION_HWY | FUELCONSUMPTION_COMB | FUELCONSUMPTION_COMB_MPG | CO2EMISSIONS | |
---|---|---|---|---|---|---|---|---|
count | 1067.0 | 1067.000000 | 1067.000000 | 1067.000000 | 1067.000000 | 1067.000000 | 1067.000000 | 1067.000000 |
mean | 2014.0 | 3.346298 | 5.794752 | 13.296532 | 9.474602 | 11.580881 | 26.441425 | 256.228679 |
std | 0.0 | 1.415895 | 1.797447 | 4.101253 | 2.794510 | 3.485595 | 7.468702 | 63.372304 |
min | 2014.0 | 1.000000 | 3.000000 | 4.600000 | 4.900000 | 4.700000 | 11.000000 | 108.000000 |
25% | 2014.0 | 2.000000 | 4.000000 | 10.250000 | 7.500000 | 9.000000 | 21.000000 | 207.000000 |
50% | 2014.0 | 3.400000 | 6.000000 | 12.600000 | 8.800000 | 10.900000 | 26.000000 | 251.000000 |
75% | 2014.0 | 4.300000 | 8.000000 | 15.550000 | 10.850000 | 13.350000 | 31.000000 | 294.000000 |
max | 2014.0 | 8.400000 | 12.000000 | 30.200000 | 20.500000 | 25.800000 | 60.000000 | 488.000000 |
Selecciona algunas variables para verlas con más detalle.
cdf = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB','CO2EMISSIONS']] cdf.head(9)
ENGINESIZE | CYLINDERS | FUELCONSUMPTION_COMB | CO2EMISSIONS | |
---|---|---|---|---|
0 | 2.0 | 4 | 8.5 | 196 |
1 | 2.4 | 4 | 9.6 | 221 |
2 | 1.5 | 4 | 5.9 | 136 |
3 | 3.5 | 6 | 11.1 | 255 |
4 | 3.5 | 6 | 10.6 | 244 |
5 | 3.5 | 6 | 10.0 | 230 |
6 | 3.5 | 6 | 10.1 | 232 |
7 | 3.7 | 6 | 11.1 | 255 |
8 | 3.7 | 6 | 11.6 | 267 |
Para verlas mejor, podemos dibujar cada una de esas verialbes
viz = cdf[['CYLINDERS','ENGINESIZE','CO2EMISSIONS','FUELCONSUMPTION_COMB']] viz.hist() plt.show()
Comparamos cada variable con la emisión de carbono, para ver si se pueden relacionar linealmente
plt.scatter(cdf.FUELCONSUMPTION_COMB, cdf.CO2EMISSIONS, color='blue') plt.xlabel("FUELCONSUMPTION_COMB") plt.ylabel("Emission") plt.show()
plt.scatter(cdf.ENGINESIZE, cdf.CO2EMISSIONS, color='blue') plt.xlabel("Engine size") plt.ylabel("Emission") plt.show()
plt.scatter(cdf.CYLINDERS, cdf.CO2EMISSIONS, color='blue') plt.xlabel("Cylinders") plt.ylabel("Emission") plt.show()
Creamos un conjunto de datos de entrenamiento y otro de prueba
Se divide el conjunto de datos en uno de entrenamiento y otro de pruebas, siendo excluyentes. Esto permite una evaluación más exacta, ya que los datos de entrenamiento no son parte de los datos que se usaran para comprobar el modelo.
msk = np.random.rand(len(df)) < 0.8 train = cdf[msk] test = cdf[~msk]
Modelado de datos usando el paquete sklearn
from sklearn import linear_model # importación del paquete sklearn train_x = np.asanyarray(train[['ENGINESIZE']]) # conjunto de datos independientes train_y = np.asanyarray(train[['CO2EMISSIONS']]) # conjunto de datos dependientes regr = linear_model.LinearRegression() # uso del modelo de regresion lineal regr.fit (train_x, train_y) # ejecución de los calculos print ('Pendiente: ', regr.coef_) # muestra la pendiente print ('Ordenada: ',regr.intercept_) # muestra la ordenada en el origen
Pendiente: [[39.071235]]
Ordenada: [126.65808636]
Pintamos el ajuste realizado
plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS, color='blue') plt.plot(train_x, regr.coef_[0][0]*train_x + regr.intercept_[0], '-r') plt.xlabel("Engine size") plt.ylabel("Emission")
Se comparan los valores actuales con los predichos para calcular la exactitud del modelo de regresión
Existen distintas métricas de evaluación de modelos, utilicemos MSE para calcular la exactitud de nuestro modelo basado en el set de prueba:
– Error medio absoluto: Es una media del valor absoluto de los errores. Es la métrica más fácil de comprender ya que simplemente es el promedio de los errores pero en valor absoluto para que errores negativos no compensen los positivos.
– Error Cuadrado Medio (MSE): Es la media de los errores al cuadrado. Es más popular que el error medio absoluto porque hace que los grandes errores tengan más peso.
– R-cuadráticono es un error, es una medida popular que indica la precisión del modelo. Representa como de cerca están los datos de la linea de regresión. Mientras más alto es el R-cuadrático, mejor ajusta el modelo respecto de los datos. El máximo valor posible es 1 y puede tomar valores negativos.
from sklearn.metrics import r2_score # importación del paquete metrics de sklearn test_x = np.asanyarray(test[['ENGINESIZE']]) # conjunto de datos independientes test_y = np.asanyarray(test[['CO2EMISSIONS']]) # conjunto de datos dependientes test_y_ = regr.predict(test_x) # ejecución de los calculos print("Error medio absoluto: %.2f" % np.mean(np.absolute(test_y_ - test_y))) print("Error cuadrado medio (MSE): %.2f" % np.mean((test_y_ - test_y) ** 2)) print("R2-cuadrático: %.2f" % r2_score(test_y_ , test_y) )
Error medio absoluto: 23.04
Error cuadrado medio (MSE): 894.25
R2-score: 0.70