¡Compártelo!

Cómo hacer una Regresión Lineal Simple en Machine Learning

En la actualidad, el aprendizaje automático se ha convertido en una de las bases para resolver problemas y como ayuda a la toma de decisiones. En este artículo nos centraremos en el análisis y aplicación práctica de uno de los modelos predictivos más sencillos, el modelo de Regresión Lineal Simple en Machine Learning.  

Como entrada del modelo tenemos un conjunto de datos y las observaciones sobre los mismos. El modelo una vez entrenado nos servirá para hacer predicciones de cuál será el peso de una persona para una altura que no está en los datos iniciales.

Modelo matemático

Se basa en hacer predicciones de los datos mediante la ecuación de una línea recta. 

y = b0 + b1 X1

y: variable dependiente

b0: intercepto de la recta de regresión

b1: pendiente de la recta de regresión

X1: variable independiente

El trabajo de entrenamiento del modelo consiste en buscar los valores para b0 y b1 que mejor se adapten a las observaciones que disponemos en el conjunto de datos de entrenamiento. 

Para estimar estos valores se utiliza el método estadístico OLS (Ordinary Least Squares). Con esta técnica se buscan los valores de b0 y b1 que minimizan la suma de los cuadrados de las diferencias entre los valores observados de la variable dependiente y los valores predichos por el modelo.

i(yi – yi)2

Python, Scikit-Learn y Google Colab

Python es un lenguaje de programación de alto nivel interpretado, multiplataforma, de código abierto y ampliamente utilizado en aplicaciones de Machine Learning.

Scikit-Learn es una librería Python para Machine Learning que proporciona implementaciones para regresión, clasificación y aprendizaje. 

Google Colab es un entorno de desarrollo (IDE) basado en la nube que permite a los usuarios utilizar Python sin instalar nada en su ordenador local. Permite experimentar con distintos mecanismos de aprendizaje automático sin preocuparse del entorno. 

La combinación de las tres herramientas ofrece una plataforma muy potente y versátil para el desarrollo de aplicaciones de Machine Learning, por lo que es la seleccionada en este post para implementar un ejemplo de Regresión Lineal simple.

Caso de estudio: predecir peso a partir de la altura

Para el ejemplo empleamos un caso muy simplificado, donde vamos a seleccionar un grupo de personas y tomar las mediciones de altura y peso. Las almacenamos en un fichero en «formato csv» y las representamos de forma gráfica:

Observando la gráfica de los datos de entrada podemos sacar como conclusión que la variable dependiente (Peso) se relaciona con la variable independiente (Altura) mediante una distribución lineal. En este contexto, el método de Regresión Lineal nos va a permitir calcular la recta que mejor se aproxime a las observaciones y usar dicha ecuación para predecir el peso de alturas para las que no disponemos de información en los datos de entrada.

Importar las librerías

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

Numpy contiene utilidades para vectores y matrices grandes.

Maplotlib nos proporciona funciones de visualización de datos.

Pandas para análisis de datos.

Importar el dataset

dataset = pd.read_csv('altura_pesos.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

El primer caso es utilizar la función read_csv de la librería Pandas para obtener la estructura del dataset a partir del nombre del fichero. Devuelve una matriz de datos que dividimos entre variable independiente X (altura) y variable dependiente y (peso) aplicando las facilidades de Python para indexado de matrices.

Dividir datos entre conjunto de entrenamiento y de test

Una práctica en los modelos de Machine Learning es dividir los datos de los que disponemos entre datos de entrenamiento y datos de test. Los datos de entrenamiento se utilizan para ajustar los parámetros del modelo, mientras que los datos de test para evaluar la precisión del modelo con datos que no conoce. Si el modelo se ajusta demasiado a los datos de entrenamiento, se puede dar el overfitting, lo que hace que sea demasiado impreciso con datos nuevos. Por lo tanto, una vez ajustados los parámetros, lo que haremos es evaluar el modelo sobre los datos de test y calcular el error promedio para ver si el modelo obtenido es bueno o debemos hacer reajustes y volver a entrenarlo.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state = 0)

Se usa la función train_test_split a partir de las variables del paso anterior para separar los datos. Reservar un 30% para test suele ser adecuado para este modelo de regresión (parámetro test_size). Cada conjunto de datos se almacena en las variables X_train e y_train y los restantes en X_test e y_test.

Entrenar el modelo de Regresión Lineal

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

Para entrenar el modelo lo primero es crear un objeto de la clase LinearRegression. Sirve tanto para el modelo simple, con una variable independiente, que es el que realizamos en este post, como para modelo múltiple de regresión lineal. Entrenamos el modelo mediante el método fit, que recibe el conjunto de datos de entrenamiento de entrada X_train y las salidas esperadas para dichos datos y_train.

Obtener las constantes en la recta de regresión

print("b0", regressor.intercept_)
print("b1", regressor.coef_)

La recta de regresión para el entrenamiento realizado sería:

Predicción peso = -36.76345330739295 + 59.90953307 * Altura

Predecir valores

Con el modelo ya entrenado podemos predecir los valores. Lo hacemos para el conjunto de datos de test, mediante la función predict

y_pred = regressor.predict(X_test)

También podemos predecir valores que no pertenezcan al conjunto de datos iniciales. Por ejemplo, para predecir el peso de dos personas que miden 1.90 y 1.53 haríamos:

regressor.predict([[1.90], [1.53]])

array([77.06465953, 55.31749903])

Visualizar datos entrenamiento

Analicemos de forma gráfica los datos de entrenamiento frente a las predicciones del modelo para dichos datos.

plt.scatter(X_train, y_train, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('Altura vs Peso (Datos entrenamiento)')
plt.xlabel('Altura')
plt.ylabel('Peso')
plt.show()
En azul vemos las predicciones realizadas por el modelo entrenado que al tratarse de regresión lineal forman una recta. Los puntos rojos son las observaciones reales. Vemos que la recta del modelo se ajusta bastante bien a las predicciones.

Visualizar datos prueba

plt.scatter(X_test, y_test, color = 'red')
plt.plot(X_test, regressor.predict(X_test), color = 'blue')
plt.title('Altura vs Peso (Datos de prueba)')
plt.xlabel('Altura')
plt.ylabel('Peso')
plt.show()
La recta de predicción en azul se aproxima razonablemente a las observaciones reales, en rojo.

Evaluación del modelo. ECM y R2

Aunque gráficamente intuimos que el modelo se puede ajustar bien a los datos, podemos comprobarlo matemáticamente mediante el cálculo del error cuadrático medio (ECM).

from sklearn.metrics import mean_squared_error
y_predict = regressor.predict(X)
mse = mean_squared_error(y, y_predict)
print(mse)


0.5244080671609953

Utilizamos la función mean_squared_error a la que indicamos como parámetros, por una parte, los valores reales de nuestra muestra de pesos y por otra la predicción hecha sobre todos los valores de entrada.

Aplicado a nuestro modelo de predicción de peso, el valor 0.5244 obtenidos para el ECM nos indica un ajuste razonable del modelo de datos. Significa que en término medio el valor de peso predicho por el modelo se desvía 0.5444 kg respecto al valor real.

También vamos a calcular el coeficiente de determinación R2. En regresión lineal se define como la proporción de la varianza total que es explicada por el modelo. Puede variar entre 0 y 1, interpretándose de la siguiente forma:

  • R2= 0: El modelo no explica ninguna variabilidad en la variable dependiente.
  • R2= 1: El modelo explica toda la variabilidad en la variable dependiente. Todas las observaciones caen exactamente en la línea de regresión.
  • 0 < R2 < 1: El modelo explica parcialmente la variabilidad de la variable dependiente. Cuanto más próximo a 1, mejor es el modelo para explicar la variabilidad.
from sklearn.metrics import r2_score
r2 = r2_score(y, y_predict)
print(r2)

0.9886552763209479

El cálculo se realiza con la función r2_score. El valor obtenido nos indica que el modelo es bueno, ya que explica el 98,86% de la variable peso respecto a la altura.

Conclusiones

Hemos visto cómo implementar en Python y Google Colab uno de los modelos más sencillos de Machine Learning para predicción de datos, el modelo de regresión lineal simple. También hemos evaluado el modelo de forma gráfica y con las medidas matemáticas más típicas. 

Este modelo se generaliza en el caso de múltiples variables independientes en la entrada, conociéndose como Regresión Lineal Múltiple. El concepto matemático es similar al mostrado en este artículo. La librería y funciones utilizadas en el ejemplo simple sirven para el caso múltiple, ya que son genéricas respecto al número de variables independientes.

El código del ejemplo está disponible en Google Colab.

Artículos relacionados

Descubriendo las posibilidades de los componentes web con Polymer

Descubriendo las posibilidades de los componentes web con Polymer

En este post, exploraremos qué son los Web Components, tecnologías estándar de la web que facilitan la creación de componentes reutilizables y encapsulados. Analizaremos cómo Polymer simplifica su uso y promueve las mejores prácticas de desarrollo, proporcionando herramientas y características que facilitan la construcción de

No code

Qué es el No Code: Principales herramientas

La capacidad de crear soluciones tecnológicas sin la necesidad de escribir código se ha convertido en una tendencia cada vez más relevante. Esto se debe en gran parte al surgimiento de herramientas No Code, que permiten a personas con diversos niveles de habilidad técnica dar

Object Pooling

Patrones de diseño en los videojuegos: Object Pooling

El uso de patrones de diseño, como el Object Pooling, es una práctica muy recomendable cuando se quieren realizar desarrollos de software escalables, robustos y que tengan un buen rendimiento. Además, nos puede ayudar a mantener una estructuración de todo el código fuente para ayudar