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.
Tabla de contenido
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:
- En primer lugar crearemos la función
calcular_perdida
que, como su nombre lo indica, permite obtener el error cuadrático medio (ECM). Los parámetros de entrada a esta función serán el set de datos, y los parámetros del modelo (los cuales irán cambiando en cada iteración). - A continuación implementamos la función
gradiente_descendente
que permite implementar el algoritmo del Gradiente Descendente, tomando como entradas los parámetros actuales del modelo así como el set de entrenamiento y la tasa de aprendizaje. La función retorna además los valores actualizados de los parámetros del modelo. Además, es importante resaltar que esta es la función que permitirá realizar el entrenamiento del modelo y aprender los parámetros especificados. - Finalmente, para generar la predicción con el modelo ya entrenado crearemos la función
predecir
que simplemente tomará como entrada un valor de la variable independiente (en este caso el área de un inmueble) junto con los parámetros del modelo y generará la correspondiente predicción (es decir el precio estimado para el inmueble).
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:
- Inicializar aleatoriamente los parámetros del modelo
- Calcular la pérdida inicial
- Imprimir en pantalla los valores obtenidos en (1) y (2)
- 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
- Actualización de los parámetros usando la función
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.