Importación de los paquetes básicos
[sourcecode language=»python» wraplines=»false» collapse=»false»]
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
[/sourcecode]
Descarga del fichero de datos
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»6″]
!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
[/sourcecode]
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
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»9″]
df.describe()
[/sourcecode]
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.
[sourcecode language=»python» wraplines=»false» firstline=»10″]
cdf = df[[‘ENGINESIZE’,’CYLINDERS’,’FUELCONSUMPTION_COMB’,’CO2EMISSIONS’]]
cdf.head(9)
[/sourcecode]
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
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»12″]
viz = cdf[[‘CYLINDERS’,’ENGINESIZE’,’CO2EMISSIONS’,’FUELCONSUMPTION_COMB’]]
viz.hist()
plt.show()
[/sourcecode]
Comparamos cada variable con la emisión de carbono, para ver si se pueden relacionar linealmente
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»15″]
plt.scatter(cdf.FUELCONSUMPTION_COMB, cdf.CO2EMISSIONS, color=’blue’)
plt.xlabel("FUELCONSUMPTION_COMB")
plt.ylabel("Emission")
plt.show()
[/sourcecode]
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»19″]
plt.scatter(cdf.ENGINESIZE, cdf.CO2EMISSIONS, color=’blue’)
plt.xlabel("Engine size")
plt.ylabel("Emission")
plt.show()
[/sourcecode]
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»23″]
plt.scatter(cdf.CYLINDERS, cdf.CO2EMISSIONS, color=’blue’)
plt.xlabel("Cylinders")
plt.ylabel("Emission")
plt.show()
[/sourcecode]
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.
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»27″]
msk = np.random.rand(len(df)) < 0.8
train = cdf[msk]
test = cdf[~msk]
[/sourcecode]
Modelado de datos usando el paquete sklearn
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»30″]
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
[/sourcecode]
Pendiente: [[39.071235]]
Ordenada: [126.65808636]
Pintamos el ajuste realizado
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»37″]
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")
[/sourcecode]
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.
[sourcecode language=»python» wraplines=»false» collapse=»false» firstline=»41″]
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) )
[/sourcecode]
Error medio absoluto: 23.04
Error cuadrado medio (MSE): 894.25
R2-score: 0.70