2.4 - Práctica 1: la Regresión Lineal desde cero en Python

Lección 4 de la sección “Redes Neuronales” del curso Fundamentos de Deep Learning con Python.

Introducción

En la lección anterior vimos en detalle en qué consiste la Regresión Lineal. En esta lección pondremos en práctica esos conceptos, implementando en Google Colab y con el uso de Python el algoritmo de Regresión Lineal.

Suscríbete y accede al set de datos, código fuente y video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

El problema a resolver y lectura y visualización del set de datos

El dataset que usaremos para esta práctica se encuentra almacenado en formato csv (comma separated values) y puede ser leído fácilmente usando la librería Pandas. Una vez leído podemos verificar que se trata de un set que contiene un total de 100 datos que relacionan el área en $m^2$ de diferentes inmuebles junto con el precio correspondiente (en dólares).

Al visualizar el modelo, usando la librería Matplotlib, podemos verificar que estas dos variables se relacionan linealmente. El objetivo es entonces entrenar un modelo de Regresión Lineal que permita encontrar la recta que mejor se ajusta a este set de datos, para posteriormente generar nuevas predicciones con el modelo ya entrenado.

Funciones para construir el modelo lineal

Teniendo en cuenta que implementaremos el modelo desde cero, sin hacer uso de librerías especializadas en Python, crearemos diferentes funciones encargadas de cada una de las etapas de procesamiento del algoritmo de Regresión Lineal:

Entrenamiento

Definiremos como hiperparámetros iniciales el número de iteraciones (20) y la tasa de aprendizaje (0.00001). Se sugiere modificar ligeramente estos hiperparámetros para mejorar el entrenamiento y desempeño del modelo.

Para realizar el entrenamiento seguiremos estos pasos:

  1. Inicializar aleatoriamente los parámetros del modelo
  2. Calcular la pérdida inicial
  3. Imprimir en pantalla los valores obtenidos en (1) y (2)
  4. Realizar el entrenamiento para el número de iteraciones establecidas, donde en cada una de ellas se llevarán a cabo estos pasos:
    • Actualización de los parámetros usando la función gradiente_descendente
    • Actualización del valor de la pérdida usando la función calcular_perdida. Almacenar el valor en la lista correspondiente
    • Imprimir en pantalla los valores actualizados de los parámetros y de la pérdida, lo que nos permitirá monitorear la evolución del entrenamiento del modelo

A continuación el código completo para la realización del entrenamiento:

def entrenar(x,y,nits,alpha):
	m = x.shape[0]

	# Inicializar pesos
	w = np.random.rand()
	b = np.random.rand()

	# Pérdida inicial
	perdida = []
	perdida_i = calcular_perdida(x,y,w,b,m)
	perdida.append(perdida_i)

	# Imprimir valores iniciales
	print('Inicialización. '  + 'Loss: '
			+ str(perdida_i) + ', w: ' + str(w) + ', b: ' + str(b))

	# Entrenamiento
	for it in range(nits):
		# Aplicar gradiente descendente
		w, b = gradiente_descendente(w,b,alpha,x1,y,m)

		# Actualizar pérdida
		perdida_it = calcular_perdida(x1,y,w,b,m)
		perdida.append(perdida_it)

		# Imprimir en pantalla
		print('Iteración: ' + str(it) + '. ' + 'Loss: '
			+ str(perdida_it) + ', w: ' + str(w) + ', b: ' + str(b))

	return w, b, perdida

Podemos ver que efectivamente al ejecutar la función anterior y llevar a cabo el entrenamiento, progresivamente el error disminuye y en la iteración 20 su valor es cercano a 0. Sólo nos resta realizar predicciones con el modelo.

Predicción

En esta fase vamos a verificar qué tan bien se ajusta el modelo lineal recién entrenado a nuestro set de datos. Para ello generaremos un vector de Numpy dentro del mismo rango de valores alcanzados por la variable independiente del set de datos, y luego usaremos la función predecir (creada anteriormente) para generar las predicciones con el modelo entrenado. Posteriormente usaremos Matplotlib para dibujar en una misma figura las gráficas correspondientes al set de datos original y a las predicciones:

x_pred = np.linspace(x1.min(),x1.max(),x1.shape[0])
y_pred = predecir(x_pred,w,b)

plt.scatter(x1,y)
plt.plot(x_pred,y_pred,'r--')
plt.xlabel('$x_1$ (área en $m^2$)')
plt.ylabel('y (precio (en U$)')

Efectivamente podemos verificar que la recta se ajusta bastante bien al set de datos, lo cual nos permite reconfirmar que el entrenamiento fue adecuado. Y con esto ya tenemos nuestro modelo de Regresión Lineal listo para generar nuevas predicciones.

Suscríbete y accede al set de datos, código fuente y video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Conclusión

El código implementado en esta lección nos ha permitido afianzar los conceptos vistos anteriormente y relacionados con la Regresión Lineal. En la siguiente lección hablaremos entonces de cómo generalizar este algoritmo a casos en los cuales tenemos múltiples variables independientes. Veremos entonces en qué consiste la Regresión Lineal Múltiple.

Ver todas las lecciones de este curso