A continuaci贸n aprender谩s c贸mo implementar el algoritmo de Regresi贸n Polinomial utilizando la librer铆a de Python Scikit Learn, desarrollandoun proyecto de Machine Learning. 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.

Curso Te贸rico-Pr谩ctico: Machine Learning para no programadores
Por que python para machine Learning

Definici贸n del proyecto

En esta pr谩ctica del algoritmo de Regresi贸n Polinomial, 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.

aprende f谩cilmente inteligencia artificial - newsletter

Este es el mismo proyecto que desarrollamos en la pr谩ctica de Regresi贸n Lineal, pero esta vez aplicaremos el algoritmo de Regresi贸n Polinomial.

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 Polinomial.

usos de la inteligencia artificial en la vida cotidiana

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.

Curso Te贸rico-Pr谩ctico:Generaci麓贸n de Texto con Inteligencia Artificial
				
					#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.

aprender a programar para machine Learning 1

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())
				
			

Regresio虂n-Lineal-simple-practica-1

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)
				
			

Regresio虂n-Lineal-simple-practica-2

Como ya nos lo visto anteriormente 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

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

Por que python para machine Learning

Procesamiento de los datos

Para este ejemplo vamos a implementar un predictor de Regresi贸n Polinomial.聽Los datos que se utilizar谩n para el an谩lisis ser谩n los correspondientes al n煤mero聽de habitaciones que cuenta la vivienda, estos datos se encuentran ubicados en la columna n煤mero 6 de nuestro dataset, por lo que debemos definir esta columna a la variable 鈥淴鈥, en este caso vamos a utilizar 鈥淴_p鈥 para representar el algoritmo que estamos utilizando, Regresi贸n Polinomial.

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

Seguidamente definimos los datos de 鈥測鈥 o 鈥測_p鈥, para este ejemplo, los cuales ser谩n igual a la columna de target de nuestro dataset.

				
					#Definimos los datos correspondientes a las etiquetas
y_p = boston.target

				
			

Definidas ambas variables podemos graficarlas utilizando la instrucci贸n scatter. Como podemos observar los datos no se encuentran distribuidos de manera lineal sobre en la parte inferior izquierda por lo que perfectamente podemos utilizar el algoritmo de Regresi贸n Polinomial.

				
					#Graficamos los datos correspondientes
plt.scatter(X_p, y_p)
plt.show()
				
			

Regresio虂n-lineal-practica

Ahora separamos los datos de entrenamiento y prueba, para ello importamos train_test_split de la聽librer铆a scikit learn聽y lo implementamos a nuestros datos 鈥淴_p鈥 y 鈥測_p鈥.

				
					from sklearn.model_selection import train_test_split

#Separo los datos de "train" en entrenamiento y prueba para probar los algoritmos
X_train_p, X_test_p, y_train_p, y_test_p = train_test_split(X_p, y_p, test_size=0.2)
				
			

En este punto tenemos los datos 鈥淴鈥 y 鈥測鈥 de entrenamiento y prueba.

Qu茅 son las Redes Neuronales Artificiales

Desarrollo del algoritmo

Con los datos separados en entrenamiento y prueba ha llegado el momento de construir el modelo de Machine Learning,聽pero antes de definir el algoritmo y empezar a entrenarlo debemos definir el grado del polinomio, para ello se importa de la librer铆a scikit learn las caracter铆sticas polinomiales o PolynomialFeatures, y procedemos a definir el grado.

				
					from sklearn.preprocessing import PolynomialFeatures
				
			

En este caso lo definimos igual a 2. Recuerda que en este punto tu puedes definir este n煤mero, lo ideal es comenzar con un valor bajo como el 2 y despu茅s ir subiendo poco a poco para ver si se mejora lo resultados de la predicci贸n, pero debes tener mucho cuidado porque en ocasiones puedes ajustar de m谩s el modelo ocasionando un sobreajuste u overfitting.

				
					#Se define el grado del polinomio
poli_reg = PolynomialFeatures(degree = 2)
				
			

Definido el grado se procede a transformar las caracter铆sticas de existentes, en este caso tanto X_train como X_test en caracter铆sticas de mayor grado, para ello utilizamos el polinomio definido anteriormente y lo entrenamos a estos datos.

				
					#Se transforma las caracter铆sticas existentes en caracter铆sticas de mayor grado
X_train_poli = poli_reg.fit_transform(X_train_p)
X_test_poli = poli_reg.fit_transform(X_test_p)
				
			

En este punto lo que estamos haciendo es calculando los valores de 鈥淴鈥 para cada uno de los elementos dentro de la f贸rmula, te acuerdas que en la teor铆a vimos que 鈥淴鈥 estaba elevado a la n potencia dependiendo del valor del coeficiente del polinomio, bueno es ac谩 donde se calcula el valor de 鈥淴鈥.

C贸mo seleccionamos un polinomio de grado 2, entonces tenemos la f贸rmula ser铆a esta:

Regresio虂n-Polinomial-teori虂a-1

Entonces ac谩 estamos calculando los datos de 聽y , para tenerlos listo para calcular el modelo. Esto lo hacemos tanto para X_train como para X_test.

Realizado esto lleg贸 el momento de definir el algoritmo en nuestro modelo, que en este caso ser铆a LinearRegression, con esta misma instrucci贸n se puede calcular el modelo de Regresi贸n Polinomial.

				
					#Definimos el algoritmo a utilizar
pr = linear_model.LinearRegression()
				
			

Definido el algoritmo lo utilizamos para entrenar los datos, recuerda que ac谩 utilizamos los datos que transformamos con las caracter铆sticas de mayor grado.

				
					#Entrenamos el modelo
pr.fit(X_train_poli, y_train_p)
				
			

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.

				
					#Realizamos una predicci贸n
Y_pred_pr = pr.predict(X_test_poli)
				
			
Regresio虂n-lineal-practica-1
importancia de las matema虂ticas en machine learning

An谩lisis de los resultados

Como puedes observar en el recuadro anterior 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 ve谩moslo gr谩ficamente para detallar con m谩s cuidado, para ello utilizamos la librer铆a de matplotlib.

				
					#Graficamos los datos junto con el modelo
plt.scatter(X_test_p, y_test_p)
plt.plot(X_test_p, Y_pred_pr, color='red', linewidth=3)
plt.show()
				
			

Regresio虂n-lineal-practica-2

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.

Igual que todos los algoritmos de regresi贸n que hemos desarrollado hasta ahora el objetivo de este 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.

Recordando este concepto podemos observar que el modelo cubre una buena parte de los datos y tiene un comportamiento correcto muy parecido al de los datos. Por lo tanto, calculemos los datos relacionados a este algoritmo incluyendo la precisi贸n del mismo.

				
					print('Valor de la pendiente o coeficiente "a":')
print(pr.coef_)
				
			

Regresio虂n-lineal-practica-3

Comencemos calculando los coeficientes de la f贸rmula de Regresi贸n Polinomial, calculamos primeramente los coeficientes dando como resultado: -19,257 para a1, 2,221 para a2. Ignora el primer valor que es 0, siempre vas a obtener este valor igual a cero para este algoritmo.

				
					print('Valor de la intersecci贸n o coeficiente "b":')
print(pr.intercept_)
				
			
Regresio虂n-lineal-practica-4

Seguidamente calculamos el valor de la intersecci贸n o coeficiente 鈥渂鈥, este dato ser谩 igual a: 54,743.

				
					print('Precisi贸n del modelo:')
print(pr.score(X_train_poli, y_train_p))
				
			

Regresio虂n-lineal-practica-5

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. El resultado obtenido ac谩 es de 0,563, como ya lo hab铆amos visto comparando los resultados de 鈥測_predict鈥 y viendo la gr谩fica pod铆amos deducir que la precisi贸n no iba a ser muy buena.

por que虂 programar es tan dificil

Conclusiones

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 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.

por que虂 programar es tan dificil

Programa completo

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

				
					"""
Regresi贸n Polinomial
"""

########## 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 POLINOMIAL ##########

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

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

#Graficamos los datos correspondientes
plt.scatter(X_p, y_p)
plt.show()

########## IMPLEMENTACI脫N DE REGRESI脫N POLINOMIAL ##########

from sklearn.model_selection import train_test_split

#Separo los datos de "train" en entrenamiento y prueba para probar los algoritmos
X_train_p, X_test_p, y_train_p, y_test_p = train_test_split(X_p, y_p, test_size=0.2)

from sklearn.preprocessing import PolynomialFeatures

#Se define el grado del polinomio
poli_reg = PolynomialFeatures(degree = 2)

#Se transforma las caracter铆sticas existentes en caracter铆sticas de mayor grado
X_train_poli = poli_reg.fit_transform(X_train_p)
X_test_poli = poli_reg.fit_transform(X_test_p)

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

#Entreno el modelo
pr.fit(X_train_poli, y_train_p)

#Realizo una predicci贸n
Y_pred_pr = pr.predict(X_test_poli)

#Graficamos los datos junto con el modelo
plt.scatter(X_test_p, y_test_p)
plt.plot(X_test_p, Y_pred_pr, color='red', linewidth=3)
plt.show()

print()
print('DATOS DEL MODELO REGRESI脫N POLINOMIAL')
print()

print('Valor de la pendiente o coeficiente "a":')
print(pr.coef_)

print('Valor de la intersecci贸n o coeficiente "b":')
print(pr.intercept_)

print('Precisi贸n del modelo:')
print(pr.score(X_train_poli, y_train_p))
				
			

Si te llamo la atenci贸n todo este contenido y te animaste a empezar a estudiar Inteligencia Artificial, he desarrollado un curso que te ayudar谩, de igual forma a iniciar tu camino dentro de est谩 tecnolog铆a. Este curso te sentar谩 las bases y te dar谩 m谩s claridad para poder seleccionar el enfoque o 谩rea que m谩s te interese sobre la Inteligencia Artificial, de igual forma te ayudar谩 tener m谩s claridad en muchos conceptos que seguramente en estos momentos te parece confusos. Este curso es ideal si apenas est谩s empezando. Si quieres m谩s informaci贸n puedes ingresar a este enlace.

12 comentarios en “Regresi贸n Polinomial – Pr谩ctica con Python”

    1. Hola Jes煤s, gracias por la sugerencia. Pero tu puedes hacerlo por tu cuenta tambi茅n con este proyecto, cuando definas X en vez de solo seleccionar una sola columna puedes seleccionar varias y de esta forma ya tendr谩s varias variables independientes. Saludos.

  1. Gerson Garc铆a

    Hola!
    Qued茅 un poco colgado en una parte del c贸digo. En la l铆nea 44, X_p = boston.data[:, np.newaxis, 5], por qu茅 usas 芦np.newaxis禄? 驴Para que X_p sea un vector columna?
    Gracias!

  2. Hola!
    Primero de todo felicitarte por este blog, esta muy bien explicado todo.
    Luego tengo una duda, hay alguna manera (funci贸n del scikit o asi) de saber el grado optimo para tu predecir tus datos?
    Gracias de antenamo.

    1. Hola Enrique, muchas gracias por tu comentario. La 煤nica forma para saber el grado 贸ptimo es probando, no hay ninguna funci贸n en Python que te recomiende un valor. Saludos.

  3. Hola Ligdi,

    Gracias por este blog. Como siempre excelente!!

    Solo tengo una duda. Me podr铆as orientar- A medida que agrego m谩s variables al modelo (antig眉edad y distancia por ejemplo) noto que la gr谩fica que se dibuja muestra casi todos los datos a la izquierda. Esto se debe a que no he corregido el c贸digo para mostrar un gr谩fico en 3 dimensiones? Saludos

    1. Hola Ricardo, recuerda que todas las variables no influyen en la variable dependiente y en ocasiones incluirla en el an谩lisis puede ocasionar resultados err贸neos, de repente esto sea lo que est谩s viendo. Saludos.

  4. Sheccid Cort茅s

    Hola!

    Gracias por generar este c贸digo y ayudame a entender un poco mejor. Tengo una duda la cual me pregunto si puedes ayudarme, estoy tratando de generar el mismo c贸digo el cual tu desarrollaste pero en lugar de importar los datos yo tengo una lista con los valores de x y otra lista con los valores de y. El problema es que cuando trato de que me grafique la curva ajustada me dice que:
    ValueError: Expected 2D array, got 1D array instead:
    array=[269 183 345 234 424 423 347 344 294 168 228 241 197 316 361 313 409 213
    153 328 267 411 184 244].
    Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

    Y realmente no entediendo muy bien, soy nueva en esto y no entiendo qye me trata de decir con respecto a que necesita un arreglo en 2D y que lo tengo que dar un re ajuse a la lista. 驴C贸mo prodr铆a solucionarlo?

    1. Hola Sheccid, para realizar una gr谩fica necesitas dos columnas (x,y) seg煤n el error que te esta dando, estas proporcionando datos de una dimensi贸n 1D, por lo que solamente tendr铆as x, por lo que te falta la parte de y. Saludos.

Deja un comentario

Tu direcci贸n de correo electr贸nico no ser谩 publicada.