La regresión lineal es un algoritmo de aprendizaje supervisado que se utiliza en Machine Learning y por lo tanto en Inteligencia Artificial. Es uno de los algoritmos más sencillos de entender pues se basa en "dibujar una recta" que nos indica la tendencia de un conjunto de datos. De este modo, a través de esta tendencia, es posible la predicción de comportamientos a través de las características de entrada de un determinado modelo.
Comencemos con la instalación de un conjunto de herramientas Python que nos permitirán aplicar Machine Learning: scikit-learn, para ello en un sistema ubuntu (lo siento pero en esta primera versión de la propuesta trabajaré en sistemas Linux) usaremos pip para instalarlo:
pip install scikit-learn
A continuación vamos a entrenar un modelo que responde a una muestra tal que:
Como puedes imaginar y=x1+2*x2+3*x3. Lo que queremos es que nuestro modelo de regresión lineal averigüe esos pesos de modo que sea capaz de predecir la salida "y" de acuerdo a unos valores de "x1, x2, x3" pero sin saber esa fórmula. Eso es Machine Learning y para ello vamos a darles 100 muestras en las que 100 valores de x1, x2, x3 darán 100 valores de y. Pero como resulta engorroso hacerlo manualmente, usaremos programación:
from random import randint
Rango_de_X = 1000
Numero_de_Muestras = 100
ArrayX = list()
ArrayY = list()
for i in range(Numero_de_Muestras):
a = randint(0, Rango_de_X)
b = randint(0, Rango_de_X)
c = randint(0, Rango_de_X)
op = a + (2*b) + (3*c)
ArrayX.append([a, b, c])
ArrayY.append(op)
A través de este script en Python hemos creado 2 arrays con 100 valores para x1, x2, x3 y sus correspondientes 100 valores de y, aplicando esa fórmula que nosotros conocemos pero no indicaremos al modelo de regresión lineal, para ver si éste es capaz de aprender a través de las muestras y sacar el resultado para un determinado valor de x1, x2, x3 que le daremos una vez haya aprendido. Si hay algo del código que no entiendes, no dudes en contactar conmigo para resolverlo.
Así que ahora entrenamos nuestro modelo:
from sklearn.linear_model import LinearRegression
predictor = LinearRegression(n_jobs=-1)
predictor.fit(X=ArrayX, y=ArrayY)
Y ya podemos predecir cualquier combinación de x1, x2, x3, por ejemplo [10, 20, 30] que según nuestra ecuación desconocida por el modelo, debería dar 140. Veremos qué dice el modelo:
MuestraX = [[10, 20, 30]]
salida = predictor.predict(X=MuestraX)
coeficientes= predictor.coef_
print('Salida: {}\nCoeficientes : {}'.format(salida, coeficientes))
Obteniendo:
Salida : [ 140.]
Coeficientes: [ 1. 2. 3.]
Es decir, tenemos que nuestro modelo, efectivamente, ha obtenido que la predicción a esos valores de entrada es 140 y nos informa que lo ha hecho porque a través del entrenamiento con los valores que le dimos, calculó unos coeficientes que ponderados con las características de entrada x1, x2, x3, nos proporcionan la salida a través de la predicción.
Espero que con este ejemplo vayas viendo en qué consiste ésto de la Inteligencia Artificial y el Machine Learning en este caso a través del modelo de Regresión Lineal.
En esta segunda práctica ya vamos a hacer una práctica algo más tecnológica. Para ello pretendemos predecir las emisiones de CO2 de un coche mediante machine learning en Python. Usaremos como características el peso del vehículo
Además del kit scikit-learn ya instalado, vamos a instalar matplotlib y pandas:
pip install matplotlib
pip install pandas
A continuación vemos las versiones de todas las herramientas que vamos a usar:
# Python version
import sys
print('Python: {}'.format(sys.version))
# scipy
import scipy
print('scipy: {}'.format(scipy.__version__))
# numpy
import numpy
print('numpy: {}'.format(numpy.__version__))
# matplotlib
import matplotlib
print('matplotlib: {}'.format(matplotlib.__version__))
# pandas
import pandas
print('pandas: {}'.format(pandas.__version__))
# scikit-learn
import sklearn
print('sklearn: {}'.format(sklearn.__version__))
Si hemos obtenido las versiones y ningún fallo es que la instalación es correcta. En mi caso, ésta es la salida:
Python: 3.8.10 (default, Mar 15 2022, 12:22:08)
[GCC 9.4.0]
scipy: 1.8.1
numpy: 1.22.4
matplotlib: 3.5.2
pandas: 1.4.2
sklearn: 1.1.1
Vamos a partir nuestro estudio en 2 puntos:
1. Cargamos la base de datos o dataset y mostramos información. Podemos descargar el siguiente dataset con los datos de coches, peso, cm3 y emisión CO2. Código:
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
#Le indicamos ruta/nombre. En este caso está en la misma carpeta
url = "cars.csv"
#Cargamos el archivo en la variable dataset
dataset = read_csv(url)
#Imprimimos algunas características
print(dataset.shape)
print(dataset.head(10))
print(dataset.describe())
#Mostramos algunas gráficas
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
pyplot.show()
dataset.hist()
pyplot.show()
scatter_matrix(dataset)
pyplot.show()
Cargamos el dataset y mostramos el número de instancias y características, así como sus primeros 10 registros o la descripción estadística del mismo. También podemos mostrar algunas de las representaciones que nos permite la librería pandas o matplotlib.
Mostramos las 10 primeras líneas para ver el tipo de dataset con el que estamos trabajando, así como alguna representación:
Car Model Volume Weight CO2
0 Toyota 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
2. A continuación entrenamos el modelo de Regresión Lineal ya conocido y averiguamos el valor de un coche de 2300kg y 1300cm3.
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
from sklearn.linear_model import LinearRegression
#Le indicamos ruta/nombre. En este caso está en la misma carpeta
url = "cars.csv"
#Cargamos el archivo en la variable dataset
dataset = read_csv(url)
#Definimos las entradas y salidas
ArrayX = dataset[['Volume', 'Weight']]
ArrayY = dataset['CO2']
#Entrenamos el modelo
modelo = LinearRegression()
modelo.fit(ArrayX.values, ArrayY.values)
#Por último, predecimos algún comportamiento
predeccirCO2 = modelo.predict([[2300, 1300]])
print(predeccirCO2)
Obteniendo unos 107 de emisión de CO2