Regresión Lineal – Práctica con Python
A continuación aprenderás cómo implementar el algoritmo de Regresión Lineal utilizando la librería de Python Scikit Learn, tomando en cuenta cada uno de los parámetros que debes considerar para ajustar y mejorar tus resultados.
Posteriormente desarrollaremos un proyecto de Machine Learning enfocándonos en el algoritmo de Regresión Lineal. Cada una de las explicaciones dadas acá será paso a paso para que puedas entender con detalle cada uno de los métodos explicados acá y que los puedas implementar en tus propios proyectos.
Empecemos con la explicación del proyecto.
Regresión Lineal con Scikit Learn
Si aún no lo sabes, Scikit Learn es una de las más grandes librerías de Machine Learning con la que cuenta Python, pero no solamente eso, es de las más utilizadas al momento de crear los modelos implementando los algoritmos de Machine Learning, por estas razones es muy importante que aprendas a trabajar con ella si apenas te estás iniciando.
Veamos cómo se puede utilizar esta librería para implementar el algoritmo de Regresión Lineal.
Como ya debes saber, el objetivo de Regresión Lineal es minimizar la distancia vertical entre todos los datos y nuestra línea que vendría siendo el modelo, por lo tanto, para determinar la mejor línea, debemos minimizar la distancia entre todos los puntos y la distancia de nuestra línea. Existen muchos métodos para cumplir con este objetivo, pero el más utilizado es el criterio de mínimos cuadrados para reducir el error.
La librería Scikit-Learn proporciona una función llamada LinearRegression para hacer justamente este trabajo, y de esta forma ahorrarnos todos los cálculos matemáticos.
Toda la información para implementar esta librería la pueden encontrar directamente en la página web, por lo que si tenemos alguna duda en la implementación de las instrucciones solamente tenemos que leer esta información.
Implementación de Regresión Lineal con Scikit Learn
Con Scikit Learn es extremadamente sencillo implementar modelos de Regresión Lineal, lo primero que debes hacer es importar la librería e importar la clase LinearRegression, crear los parámetros a utilizar, “x” y “y” y llamar al método fit() junto con los datos de entrenamiento.
La instrucción se puede configurar con ciertos parámetros que puedes ver en la página web pero la mayoría de las veces estos parámetros los dejamos por defecto ya que no afecta el resultado final de nuestro modelo.
Ahora bien, si te acuerdas de la teoría del algoritmo de Regresión Lineal, indicamos que este modelo se basa de encontrar el mejor valor para la intersección y la pendiente lo que da como resultado una línea que se ajusta mejor a los datos.
Bueno, precisamente para ver el valor de intersección y la pendiente o, en otras palabras, para saber los valores de “a” y “b” de nuestros fórmula, que fueron calculados por el algoritmo de Regresión Lineal solamente se debes ejecutar unas simples instrucciones.
Para conocer el valor de la pendiente solamente debes utilizar el comando de “coef_”. Al ejecutar esta instrucción se devuelve los valores de “a”. En caso de que en el problema se cuente con variables independientes, el resultado contará con tantas variables independientes tengan los datos, este sería un problema de Regresión Lineal múltiple.
Por si el contrario, el problema solamente cuenta con una variable independiente esta instrucción devolverá solamente un solo valor, este es un problema de Regresión Lineal simple.
Por su parte, para conocer el valor de la intersección o constante de la fórmula de Regresión Lineal deberás ejecutar la instrucción “intercept_”. El resultado siempre será un solo valor y representa la variable “b” en nuestra fórmula.
Teniendo toda esta información ya tienes el modelo de Regresión Lineal listo.
Precisión de Regresión Lineal con Scikit Learn
El último paso es el de evaluar el rendimiento del algoritmo, este paso es particularmente importante para comparar qué tan bien funcionan diferentes algoritmos en un conjunto de datos particular.
Como lo explicamos en la teoría para conocer la precisión debemos implementar la estadística, pero, obviamente, la librería Scikit Learn cuenta con una instrucción que hace nuestro trabajo mucho más sencillo. Para este caso solamente tienes que utilizar la instrucción “score” junto con los datos de pruebas y devolverá la precisión del modelo con los datos utilizados.
Recuerda que toda esta información la puedes obtener después de haber entrenado el modelo, de lo contrario el programa arrojará un error.
Resumen de comandos Scikit Learn
Sabiendo cómo implementar el algoritmo de Regresión Lineal con la librería de Scikit Learn, ha llegado el momento de desarrollar un proyecto práctico.
Definición del proyecto
En esta práctica del algoritmo de Regresión Lineal, se desarrollará un modelo para predecir el precio de las casas en Boston de acuerdo al número de habitaciones que cuenta la vivienda, el tiempo que ha tenido ocupada y la distancia que se encuentra la misma de los centros de trabajos de Boston, siendo varias características que se tomarán en cuenta para diseñar nuestro modelo.
Para este análisis vamos a utilizar el dataset disponible en la librería scikit-learn correspondiente al Boston Housing o las casas de Boston. Si no lo sabías dentro de la librería sckit-learn se dispone de varios conjuntos de datos, 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.
El algoritmo específico que se utilizará será Regresión Lineal Múltiple porque son varias las características que tomaremos en cuenta para el análisis. En caso de que quieras desarrollar un proyecto de Regresión Lineal Simple solamente tendrás que tomar una sola variable independiente.
Obtener los de datos
El primer paso que daremos será el de importar las librerías que vamos utilizar, en especial las necesarias para importar los datos que utilizaremos.
En este caso vamos a importar de sklearn el 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.
#Se importan la librerias a utilizar
from sklearn import datasets, linear_model
Seguidamente importamos los datos, para ello utilizamos la instrucción datasets.load_boston().
#Importamos los datos de la misma librería de scikit-learn
boston = datasets.load_boston()
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.
Entender los datos
Para entender los datos que estaremos utilizando el proyecto nos vamos a valor de varias instrucciones propias de Python y así verificar la información contenida en el conjunto de datos que acabamos de importar. 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())
Como puedes observar el conjunto de datos cuenta con la siguiente información: primeramente, la data, seguidamente target 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)
Como puedes leer en la descripción 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 indica que no existe ningún valor perdido, en consecuencia, nuestros datos están completos 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)
#Verifico la información de las columnas
print('Nombres columnas:')
print(boston.feature_names)
Procesamiento de los datos
Para este ejemplo vamos a implementar un predictor de Regresión Lineal Múltiple, por lo que podemos tomar varios atributos de nuestros datos para crear el modelo.
Para nuestro análisis solamente vamos a tomar las columnas correspondientes al número de habitaciones con las que cuenta la casa, esta lleva por nombre “RM”, el tiempo que ha tenido ocupada, correspondiente a la columna “AGE” y la distancia que se encuentra la misma de los centros de trabajos de Boston que vendría siendo la columna con el nombre “DIS”. Estas columnas se encuentran ubicadas en la posición 5, 6 y 7 de los datos y vendrían siendo la variable “X”.
#Seleccionamos las columna 5, 6 y 7 del dataset
X_multiple = boston.data[:, 5:8]
Definido “X”, ahora definimos “y” el cual será igual a los datos contenidos en target, como ya lo habíamos visto anteriormente.
#Definimos los datos correspondientes a las etiquetas
y_multiple = boston.target
Como ya tenemos nuestros datos ahora procedemos a separarlos en entrenamiento y prueba, lo hacemos utilizando la instrucción train_test_split, no si antes importar 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_multiple, y_multiple, test_size=0.2)
Con esto ya tenemos nuestros datos divididos en datos de entrenamiento y prueba.
Desarrollo del algoritmo
Con los datos separados en entrenamiento y prueba ha llegado el momento de construir el modelo de Machine Learning, para esto definimos el algoritmo a utilizar que es el de LinearRegression.
#Definimos el algoritmo a utilizar
lr_multiple = linear_model.LinearRegression()
Este es el mismo algoritmo que podemos utilizar para la Regresión Lineal Simple, la razón de esto es que todos los algoritmos relacionados a Regresión Lineal utilizan esta misma librería, es decir no tiene que configurarse nada adicional para implementarla.
Definido el algoritmo ahora procedemos a entrenar nuestro modelo con los datos correspondiente, para ello utilizamos la instrucción fit.
#Entrenamos el modelo
lr_multiple.fit(X_train, y_train)
Y finalmente realizamos la predicción utilizando los datos de prueba.
#Realizamos una predicción
Y_pred_multiple = lr_multiple.predict(X_test)
Análisis de los resultados
Si comparamos los datos que obtuvimos en la predicción con los datos reales dados por el dataset, nos podemos dar cuenta que, algunos de los datos son parecidos unos con otros mientras que otros tienen una diferencia considerable entre sí, por lo tanto, este modelo no es el más adecuado implementar para este conjunto de datos.
Pero a pesar de esto, continuemos con nuestro análisis, ahora obtengamos los valores correspondientes a la pendiente e intersección para obtener nuestra ecuación.
print('DATOS DEL MODELO REGRESIÓN LINEAL MULTIPLE')
print()
print('Valor de las pendientes o coeficientes "a":')
print(lr_multiple.coef_)
print('Valor de la intersección o coeficiente "b":')
print(lr_multiple.intercept_)
Como puedes observar para “a”, nos devuelve tres valores, esto se debe a que estamos utilizando 3 características para nuestro análisis por lo que cada una de ellas tendrá un valor correspondiente de “a”. Los valores serían los siguientes: 8,215 para el primero, -0,096 para el segundo y -0,491 para el último. A su vez el valor de “b” o la intersección es de -20,354.
Teniendo todos estos datos ahora calculemos la precisión del algoritmo para ello empleamos la instrucción “score” el cual devuelve el resultado de la estadística R al cuadrado.
print('Precisión del modelo:')
print(lr_multiple.score(X_train, y_train))
Conclusiones
Haber tenido estos resultados no quiere decir 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 qué se trata cada uno de los algoritmos de Machine Learning, para que de una vez que veamos los datos puedas 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.
Programa completo
A continuación se encuentra el código completo:
"""
Regresión Lineal Múltiple
"""
########## LIBRERÍAS A UTILIZAR ##########
#Se importan la librerias a utilizar
from sklearn import datasets, linear_model
########## 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 MULTIPLE ##########
#Seleccionamos las columna 5, 6 y 7 del dataset
X_multiple = boston.data[:, 5:8]
print(X_multiple)
#Defino los datos correspondientes a las etiquetas
y_multiple = boston.target
########## IMPLEMENTACIÓN DE REGRESIÓN LINEAL MULTIPLE ##########
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_multiple, y_multiple, test_size=0.2)
#Defino el algoritmo a utilizar
lr_multiple = linear_model.LinearRegression()
#Entreno el modelo
lr_multiple.fit(X_train, y_train)
#Realizo una predicción
Y_pred_multiple = lr_multiple.predict(X_test)
print('DATOS DEL MODELO REGRESIÓN LINEAL MULTIPLE')
print()
print('Valor de las pendientes o coeficientes "a":')
print(lr_multiple.coef_)
print('Valor de la intersección o coeficiente "b":')
print(lr_multiple.intercept_)
print('Precisión del modelo:')
print(lr_multiple.score(X_train, y_train))
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!
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.
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!
Hola Magali, acá http://bit.ly/2rRDApz, puedes encontrar una información interesante en cómo manupilar los datos perdidos en un conjunto de datos. Saludos.
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.
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.
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.
Hola Nelson, estoy segura que también lo eres y probablemente mucho mejor que yo. Saludos.
Hola. ¿Si quiera saber el valor de predicción de un numero concreto (suponiendo que quiero comprobar, solamente si coincide el dato de numero de habitaciones = 4, con el valor que va a predecir del precio de la vivienda) como sería el código en este caso?
Hola!,
Mas que nada felicitar tu trabajo que para mi ha sido excelente, tengo una consulta. Que es el target, como lo puedo definir. Ya que he revisado varios set de datos y en algunos que estoy costruyendo, son simples tablas de datos con columnas, sin embargo el TARGET, no logro identificar como hacerlo.
Perdon por si la pregunta es muy sencilla. pero me encantaria que me aclararas un poco.
Hola José, muchas gracias por tus palabras. El target se refiere al objetivo, lo que vamos a predecir. Saludos.
Como hago para ver las tablitas Y_test Y_predic……gracias genia !!!!!!
Hola Raul, puedes utilizar print() junto a la variable. Si estas utilizando Spyder puedes ver la información en el visor de variables. Saludos.
Hola!
Una pregunta que se puede hacer cuando existen datos fuera de rango como podría ajustar esos datos para mejorar la correlación agradecería tu ayuda
Hola Alex, para esto tienes que realizar un procesamiento de datos. En esta serie de videos explico mejor esto de manera práctica: https://bit.ly/315xRy7. Saludos.
Excelente explicación.
Muchas gracias Eduardo, espero que esta explicación te haya ayudado en tu aprendizaje. Saludos.