Regresi贸n Lineal Simple – Pr谩ctica con Python

En la entrada de hoy veremos la parte pr谩ctica del algoritmo de Regresi贸n Lineal Simple, en donde desarrollaremos un modelo para predecir el precio de las casas en Boston de acuerdo al n煤mero de habitaciones que cuenta la vivienda.

Para este an谩lisis no nos vamos a complicar mucho y utilizaremos uno de los dataset disponible en la librer铆a sckit-learn y es el correspondiente al de Boston Housing o las casas de Boston.

Si no lo sab铆as dentro de la librer铆a sckit-learn se dispone de varios dataset, muy b谩sicos, con los que puedes practicar tus conocimientos de Machine Learning, no son muchos, pero cubre los principales tipos de algoritmos como regresi贸n y clasificaci贸n.

Como todos los programas que hemos desarrollados hasta ahora lo primero que debemos hacer es importar las librer铆as que vamos a utilizar.

En este caso vamos a importar numpy, y de sklearn importamos datasets, que es donde se guardan todos los conjuntos de datos que dispone esta librer铆a y a su vez importamos de una vez linear_model ya que vamos a hacer el programa bas谩ndonos 煤nicamente en Regresi贸n Lineal.

A su vez importamos matplotlib ya que graficaremos los resultados obtenidos.

#Se importan la librerias a utilizar
import numpy as np
from sklearn import datasets, linear_model
import matplotlib.pyplot as plt

Seguidamente importamos los datos, para ello utilizamos la instrucci贸n datasets punto load_boston().

#Importamos los datos de la misma librer铆a de scikit-learn
boston = datasets.load_boston()

Como tenemos mucha informaci贸n dentro de esta variable lo que se nos hace dif铆cil entender la informaci贸n, por lo tanto, ahora procedemos a entender la data.

Para ello lo primero que vamos hacer es verificar la informaci贸n contenida en el dataset, para este fin utilizamos la instrucci贸n keys.

#Verifico la informaci贸n contenida en el dataset
print('Informaci贸n en el dataset:')
print(boston.keys())

Regresio虂n-Lineal-simple-practica-1

Como podemos observar el dataset cuenta con la siguiente informaci贸n: primeramente, la 鈥渄ata鈥, seguidamente 鈥渢arget鈥 que ser铆a la columna con las etiquetas o respuestas, posteriormente tenemos feature_names que ser铆an los nombres de cada una de las columnas de la data y finalmente tenemos DESCR que ser铆a la descripci贸n total del dataset.

Sabiendo ya esto podemos ahora utilizar estos nombres para entender mejor los datos, lo primero que vamos a hacer es utilizar DESCR para ver las caracter铆sticas del dataset.

#Verifico las caracter铆sticas del dataset
print('Caracter铆sticas del dataset:')
print(boston.DESCR)

En la descripci贸n de este dataset cuenta con 506 datos y 13 atributos, la columna 14 es el target y es la media del valor de las viviendas.

Seguidamente tenemos la descripci贸n del significado de cada una de las columnas o atributos de los datos. De igual forma nos indica un dato importante para nuestro an谩lisis y es que nos indican que no existe ning煤n valor perdido, en consecuencia, nuestra data esta completa por lo que no es necesario realizar mucho preprocesamiento a los datos.

Ahora utilizaremos la instrucci贸n shape para determinar la cantidad de datos contamos, aunque este es un paso de m谩s ya que esta informaci贸n nos la hab铆a dado previamente la descripci贸n del dataset, pero de todas formas lo hacemos.

#Verifico la cantidad de datos que hay en los dataset
print('Cantidad de datos:')
print(boston.data.shape)

Regresio虂n-Lineal-simple-practica-2

Como ya nos lo hab铆an indicado este conjunto de datos cuenta con 506 muestras y 13 columnas.

Finalmente veamos las etiquetas de cada columna para ello utilizamos feature_names.

#Verifico la informaci贸n de las columnas
print('Nombres columnas:')
print(boston.feature_names)

Regresio虂n-Lineal-simple-practica-3

Como podemos observar tenemos muchos datos, pero para nuestro an谩lisis solamente vamos a tomar la columna correspondiente al n煤mero de habitaciones con las que cuenta la casa, esta ser铆a la que lleva por nombre 鈥淩M鈥.

Sabiendo toda esta informaci贸n entonces procedemos a preparar los datos que vamos a utilizar para crear el modelo.

Para este ejemplo vamos a implementar un predictor de Regresi贸n Lineal Simple, si te acuerdas un poco de la teor铆a explicada en videos anteriores, para este algoritmo solamente se requiere una variable independiente, para nuestro caso ser谩 la correspondiente al n煤mero de habitaciones, pero tambi茅n puedes tomar la columna correspondiente a los a帽os de construcci贸n de la vivienda o cualquier otra que consideres prudente, lo importante ac谩 es que debes seleccionar solamente una de ellas.

Para nuestro caso las variables se encuentran ubicadas en la columna n煤mero 5, recuerda que el conteo de columnas y filas siempre comienza desde 0, esta columna ser铆a los datos correspondientes a 鈥淴鈥 en nuestro an谩lisis.

Es importante detallar ac谩 que los datos se encuentran almacenados como numpy por lo que tenemos que tratarlos como tal.

#Seleccionamos solamente la columna 5 del dataset
X = boston.data[:, np.newaxis, 5]

Definido 鈥淴鈥 ahora definimos 鈥測鈥 el cual ser谩 igual a los datos contenidos en target, como ya lo hab铆amos visto anteriormente.

#Defino los datos correspondientes a las etiquetas
y = boston.target

Grafiquemos los datos utilizando una gr谩fica de dispersi贸n para ver exactamente la distribuci贸n de los datos.

#Graficamos los datos correspondientes
plt.scatter(X, y)
plt.xlabel('N煤mero de habitaciones')
plt.ylabel('Valor medio')
plt.show()

Regresio虂n-Lineal-simple-practica-4

A simple vista ya puedo deducir que el modelo de Regresi贸n Lineal que vamos a construir tendr谩 un error muy alto, pero esto lo explicar茅 m谩s adelante, pero continuemos con nuestro an谩lisis.

Como lo primero que debemos hacer es separar los datos en entrenamiento y prueba lo hacemos utilizando la instrucci贸n train_test_split, no si antes importando la respectiva librer铆a.

Para la separaci贸n de los datos, vamos a tomar un 20% de los mismos para utilizarlos como prueba una vez que hayamos obtenido el modelo.

from sklearn.model_selection import train_test_split
#Separo los datos de "train" en entrenamiento y prueba para probar los algoritmos
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

Seguidamente definimos el algoritmo a utilizar que es el de LinearRegression.

#Defino el algoritmo a utilizar
lr = linear_model.LinearRegression()

Entrenamos nuestro modelo con los datos de entrenamiento y utilizando la instrucci贸n fit.

#Entreno el modelo
lr.fit(X_train, y_train)

Y finalmente realizamos la predicci贸n utilizando los datos de prueba.

#Realizo una predicci贸n
Y_pred = lr.predict(X_test)

Realizado todo esto comparemos los valores obtenidos en nuestra predicci贸n con los valores reales, para ver que tal es el comportamiento de nuestro modelo.

Regresio虂n-Lineal-simple-practica-5

Como podemos observar en este recuadro tenemos los datos reales mientras que en este otro est谩n los datos obtenidos de nuestra predicci贸n implementando el modelo. Si observamos con detenimiento estos datos nos podemos dar cuenta que en ciertos momentos los datos reales son muy parecidos con los datos que se han calculados mientras que otros casos los datos son totalmente distintos.

Con esta peque帽a comparaci贸n podemos determinar que nuestro modelo no es del todo eficiente, pero veamos gr谩ficamente para detallarlo con m谩s cuidado, para ello utilizamos la librer铆a de matplotlib.

#Graficamos los datos junto con el modelo
plt.scatter(X_test, y_test)
plt.plot(X_test, Y_pred, color='red', linewidth=3)
plt.title('Regresi贸n Lineal Simple')
plt.xlabel('N煤mero de habitaciones')
plt.ylabel('Valor medio')
plt.show()

Regresio虂n-Lineal-simple-practica-6

Como podemos observar en la gr谩fica, la l铆nea roja ser铆a nuestro modelo y los puntos azules son los datos de pruebas con los que lo entrenamos.

Si nos recordamos un poco el objetivo de este algoritmo es que el modelo o la l铆nea abarque el mayor n煤mero de muestras y de esta forma disminuir el error que vendr铆a siendo la distancia desde la l铆nea hasta el punto, entonces todos los datos fuera de la l铆nea ser铆an errores, es por esta raz贸n que cuando realizamos la comparaci贸n de los datos anteriormente nos encontramos que varios ten铆an una diferencia considerable, bueno la raz贸n de esto es que el modelo no abarc贸 todos los puntos.

De igual forma, te acuerdas que cuando graficamos los datos primeramente te coment茅 que no 铆bamos a obtener buenos resultados con este algoritmo, y la raz贸n es muy simple los datos se encuentran muy dispersos por lo que es dif铆cil que la l铆nea cubriera la mayor铆a de los datos por lo que 铆bamos a obtener una mala precisi贸n, esto no quiere decir que este algoritmo sea malo sino m谩s bien que este algoritmo no es bueno para este conjunto de datos.

Calculemos ahora los valores de la pendiente e intersecci贸n para ver como queda la ecuaci贸n del modelo.

print('DATOS DEL MODELO REGRESI脫N LINEAL SIMPLE')
print()
print('Valor de la pendiente o coeficiente "a":')
print(lr.coef_)
print('Valor de la intersecci贸n o coeficiente "b":')
print(lr.intercept_)
print()
print('La ecuaci贸n del modelo es igual a:')
print('y = ', lr.coef_, 'x ', lr.intercept_)

Recuerda que la Regresi贸n Lineal Simple viene representada como y es igual a 鈥渁鈥 por 鈥渪鈥 + 鈥渂鈥, por lo tanto, para el modelo construido 鈥渁鈥 es igual a 8,66 y 鈥渂鈥 es igual a -31,99 y la ecuaci贸n queda como se muestra.

Regresio虂n-Lineal-simple-practica-7

Ahora calculemos la precisi贸n del algoritmo para ello empleamos la instrucci贸n 鈥渟core鈥 el cual devuelve el resultado de la estad铆stica R al cuadrado.

print('Precisi贸n del modelo:')
print(lr.score(X_train, y_train))

Regresio虂n-Lineal-simple-practica-8

El resultado obtenido ac谩 es de 0,458, como ya lo hab铆amos visto comparando las resultados de 鈥測_predict鈥 y viendo la gr谩fica pod铆amos deducir que la precisi贸n no iba a ser muy buena.

Recuerda que esto no significa que el algoritmo sea malo sino que no es el mejor para este conjunto de datos.

Por todo esto es que es bueno saber exactamente de que se trata cada uno de los algoritmos de Machine Learning, para que de una vez que veamos la data podamos deducir qu茅 algoritmo es el m谩s adecuado implementar y de esta forma no perder tiempo en el desarrollo de algoritmos que no vayan a funcionar.

A continuaci贸n se encuentra el c贸digo completo:

"""
Regresi贸n Lineal Simple

@author: ligdigonzalez
"""

########## LIBRER脥AS A UTILIZAR ##########

#Se importan la librerias a utilizar
import numpy as np
from sklearn import datasets, linear_model
import matplotlib.pyplot as plt

########## PREPARAR LA DATA ##########

#Importamos los datos de la misma librer铆a de scikit-learn
boston = datasets.load_boston()
print(boston)
print()

########## ENTENDIMIENTO DE LA DATA ##########

#Verifico la informaci贸n contenida en el dataset
print('Informaci贸n en el dataset:')
print(boston.keys())
print()

#Verifico las caracter铆sticas del dataset
print('Caracter铆sticas del dataset:')
print(boston.DESCR)

#Verifico la cantidad de datos que hay en los dataset
print('Cantidad de datos:')
print(boston.data.shape)
print()

#Verifico la informaci贸n de las columnas
print('Nombres columnas:')
print(boston.feature_names)

########## PREPARAR LA DATA REGRESI脫N LINEAL SIMPLE ##########

#Seleccionamos solamente la columna 5 del dataset
X = boston.data[:, np.newaxis, 5]

#Defino los datos correspondientes a las etiquetas
y = boston.target

#Graficamos los datos correspondientes
plt.scatter(X, y)
plt.xlabel('N煤mero de habitaciones')
plt.ylabel('Valor medio')
plt.show()

########## IMPLEMENTACI脫N DE REGRESI脫N LINEAL SIMPLE ##########

from sklearn.model_selection import train_test_split

#Separo los datos de "train" en entrenamiento y prueba para probar los algoritmos
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

#Defino el algoritmo a utilizar
lr = linear_model.LinearRegression()

#Entreno el modelo
lr.fit(X_train, y_train)

#Realizo una predicci贸n
Y_pred = lr.predict(X_test)

#Graficamos los datos junto con el modelo
plt.scatter(X_test, y_test)
plt.plot(X_test, Y_pred, color='red', linewidth=3)
plt.title('Regresi贸n Lineal Simple')
plt.xlabel('N煤mero de habitaciones')
plt.ylabel('Valor medio')
plt.show()

print()
print('DATOS DEL MODELO REGRESI脫N LINEAL SIMPLE')
print()
print('Valor de la pendiente o coeficiente "a":')
print(lr.coef_)
print('Valor de la intersecci贸n o coeficiente "b":')
print(lr.intercept_)
print()
print('La ecuaci贸n del modelo es igual a:')
print('y = ', lr.coef_, 'x ', lr.intercept_)

print()
print('Precisi贸n del modelo:')
print(lr.score(X_train, y_train))

8 comentarios en “Regresi贸n Lineal Simple – Pr谩ctica con Python”

  1. Es muy agradable tu contenido, dejo mi apoyo manifiesto en estas l铆neas hacia tu trabajo. Sigue adelante difundiendo conocimiento con claridad. Vengo terminando un mooc guindado en la plataforma a la que estoy afiliado sobre Machine Learning y ahora inicio la etapa de practicar mucho mucho. Cualquier sugerencia, consejo o si tienes alg煤n proyecto abierto en marcha que pudiera husmear ser铆a un honor aprender directamente de la fuente.
    Un besito. Chao y Gracias!

    1. Hola, muchas gracias por tu comentario. Dentro de esta p谩gina podr谩s encontrar bastante informaci贸n sobre Machine Learning e inclusive varios proyectos que he desarrollado. Saludos.

  2. Hola! Es muy interesante tu pagina, gracias por la info.
    Estoy teniendo problemas para realizar los c谩lculos ya que tengo Nan adentro de mis datos. De que forma lo puedo solucionar?
    Hay alg煤n comando que discrime estos datos y no los tenga en cuenta para hacer la regresi贸n?

    Gracias!

  3. Hola Lidgi,
    Muchas gracias por compartir.
    De casualidad t煤 tienes o sabes de otra p谩gina donde pueda encontrar un ejemplo de regressi贸n lineal pero sin usar librer铆as?? Es decir, sin usar nada de “sklearn” y esas cosas, un ejemplo donde expliquen como se hace usando s贸lo python sin ayuda de librer铆as de machine learning.
    Te agradezco de antemano.
    Saludos.

    1. Hola Jorge, no tengo ninguna p谩gina precisa con esa informaci贸n, pero puedes buscar sobre este tema dentro del 谩rea de estad铆sticas y 谩lgebra lineal, por all铆 seguramente encuentres algo al respecto. Recuerdo que Regresi贸n Lineal se basa fundamentalmente en estas 谩reas.

  4. Nelson Yesid Reino Calder贸n

    Hola Ligdi.
    Eres excelente. Excelentes v铆deos de aprendizaje. Dominas muy bien el tema, y sabes trasmitir. Yo tambi茅n soy docente, pero no tan bueno como t煤. Felicitaciones.

    Me quito el sombrero.

Deja un comentario

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *