Análisis de regresión multivariable
Clase 9 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
Clase 9 de 18 • Curso de Regresión Lineal con Python y scikit-learn
Contenido del curso
Martín Álvarez
Alberto Gonzalez
José Pablo Cabrera Romo
Andres Gutiérrez Castillo
Efrem Medina
Joel Orellana
Luis Fernando Laris Pardo
Mateo Zarate Guerrero
Erika Alexandra García Barrios
Felipe Sebastián Zepeda González
Juan R. Vergara M.
Carlos Andrés
Tomas Dale
Ever Orlando Reyes Ruiz
Gabriel Divenuto
Juan Santiago Gutierrez Estrada
Juan R. Vergara M.
Alberto Gonzalez
KEVIN XAVIER FREGOSO ROMERO
Luis Fernando Laris Pardo
Santiago Nicolas Diez
Jhonatan Smith Garcia Muñoz
Tomas Dale
Dick Saide Suárez Blanco
Ángel Samuel Suesca Ríos
Juan Pablo Ocampo
Antonio Demarco Bonino
Alfonso Andres Zapata Guzman
Hugo Montoya Diaz
Giancarlo Zevallos Lecca
Wilmer Fernando Sanabria
jhon Robert Matamoros
Yonatan Efraín Jara Boza
Antonio Demarco Bonino
Jhon Freddy Tavera Blandon
jabes nestor frias martinez
Si les aparece un error en la línea
ax = fig.gca(projection = '3d')
Intenten cambiando ese comando por
ax = fig.add_subplot(projection='3d')
Parece ser un error de versión de matplotlib
Muchas gracias por esta aclaratoria, tenía el error al que te refieres!
¡Gracias, bro!
graficacion 3d interactiva con plotly
recomiendo mas usar plotly para graficar y asi obtener una grafica deinamica como la siguiente:
#LIBs import plotly.express as px import plotly.graph_objects as go # TRAINING MODEL X = df[['RM', 'INDUS']].values y = df['MEDV'].values.reshape(-1, 1) slr = LinearRegression() slr.fit(X, y) # PLOTTING mesh_size = .02 margin = 0 # Create a mesh grid on which we will run our model x_min, x_max = X[:,0].min() - margin, X[:,0].max() + margin y_min, y_max = X[:,1].min() - margin, X[:,1].max() + margin xrange = np.arange(x_min, x_max, mesh_size) yrange = np.arange(y_min, y_max, mesh_size) xx, yy = np.meshgrid(xrange, yrange) # Run model pred = slr.predict(np.c_[xx.ravel(), yy.ravel()]) pred = pred.reshape(xx.shape) # Generate the plot fig = px.scatter_3d(df, x='RM', y='INDUS', z='MEDV') fig.update_traces(marker=dict(size=5)) fig.add_traces(go.Surface(x=xrange, y=yrange, z=pred, name='pred_surface')) fig.show()
referencia: https://plotly.com/python/ml-regression/
no conocia plotly, la comenzare a usar mas! gracias.
wowww, la sintaxis cambia mucho de matplotlib?
Este vídeo es el más pesado (siento yo) del curso, déjenme todas las dudas que tengan y estoy pendiente para ustedes 😄
Sii una pregunta, sabes de algún curso en Platzi dónde muestren Regresión Lineal Multivariable con el método del Gradiente Descendente?
Pues yo sí creo que está durito :c
Quizá esto llega un poco tarde, pero me parece que el proceso de regresión de la grilla falla porque en primera instancia no se normalizaron los datos en X1 y X2. Una solución es generar la grilla a partir de X_std.
x1_range=np.arange(X_std[:,0].min(),X_std[:,0].max()) x2_range=np.arange(X_std[:,1].min(),X_std[:,1].max()) x1, x2 = np.meshgrid(x1_range,x2_range) pred=slr.predict(np.array([x1.flatten(),x2.flatten()]).T).reshape(x1.shape) fig=plt.figure(figsize=(8,8)) ax = fig.add_subplot(projection='3d') ax.plot_surface(x1,x2,pred, alpha=0.4, linewidth=2) ax.scatter3D(X_std[:,0],X_std[:,1],y_std, color='r',alpha=1) ax.view_init(elev=10,azim=5) ax.set_xlabel('RM') ax.set_ylabel('INDUS') ax.set_zlabel('MEDV') plt.show()
Gracias amigo, me has ayudado bastante 👍🥇✔
me has ayudado Gxs
PREDECIR PARA 2 VARIABLES
import numpy as np
rooms = 5 indus =3
v1 = np.array([rooms,indus]).reshape(1,-1)
precio = sc_y.inverse_transform(slr.predict(v1))
print("El precio de una casa con 5 habitaciones y 3 indus en Boston es de ", precio)
Lineas código para evitar warnings about deprecated:
# Creating the plot. fig = plt.figure(figsize=(10, 10)) axes = plt.axes(projection='3d') axes.plot_surface(x1, x2, prediction, alpha=1) axes.scatter(df['RM'], df['INDUS'], df['MEDV'], label='Housing Data', marker='.', color='r') axes.view_init(10, 5) plt.show()
Ever, muchísimas gracias !!!
Si usaron el Collab de la clase y les sale un error al ejecutar el bloque de “Generando predicción con el modelo”, deben actualizarlo al siguiente.
num_rooms_std = sc_x.transform(np.array([5.0,10]).reshape(1, -1)) price_std = slr.predict(num_rooms_std) print('El precio en miles es de %.3f'% sc_y.inverse_transform(price_std)) El precio en miles es de 12.865
En cuyo caso es una predicción para una casa con 5 habitaciones y de la variable INDUS de 10, dado que es un modelo que usa 2 variables y no una solamente. Adicionalmente noten que el reshape pasa de ser (-1, 1) a ser (1,-1)
Excelente gracias 🥇
Gracias Juan!
Calling gca() with keyword arguments was deprecated in Matplotlib 3.4. Starting two minor releases later, gca() will take no keyword arguments. The gca() function should only be used to get the current axes, or if no axes exist, create new axes with default keyword arguments. To create a new axes with non-default arguments, use plt.axes() or como se puede resolver?
Claro, puedes sustituir así el código :D Gracias por mencionar esto fig = plt.figure() ax = fig.add_subplot(projection='3d')
Me parece y según lo visto hasta ahora que R, en lo que se refiere a estadistica, es tremendamente mas poderoso que python e incluso mas sencillo. Es realmente mucha la diferencia. Alguno que maneje R comparte esta opinión?
Aqui un estadistico en R. Y en efecto, apenas estoy familiarizandome con Python y en definitiva, R es más amigable y sencillo a la par que poderoso en terminos estadisticos. Igual, hay que sacarle provecho a ambas herrmientas.
Si solo desean ver el plano, otra forma de grafico
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import * import numpy as np
RANGOS
x1_range = np.arange(df['RM'].min(), df['RM'].max()) x2_range = np.arange(df['INDUS'].min(), df['INDUS'].max())
X1, X2 = np.meshgrid(x1_range, x2_range)
plano = pd.DataFrame({'RM':X1.ravel(), 'INDUS':X2.ravel()})
pred = slr.predict(plano).reshape(X1.shape) pred = sc_y.inverse_transform(pred) Z = pred
from matplotlib import cm my_col = cm.jet(Z/np.amax(Z))
fig , ax = plt.subplots(subplot_kw={"projection":"3d"}) surf = ax.plot_surface(X1,X2,pred, facecolors = my_col) fig.colorbar(surf);
----->Análisis de regresión multivariable<----
σ Objetivo: Reacomodar las lineas de codigo anteriores para poder usar 1 . Importar un herramienta que se le llama toolkits. Usando from mpl_toolkits.mplot3d import* + Lo cual nos ayuda a basicamente graficar en 3d + Luis uso " * " al final, y menciono que significa "everything" (interesante 🤔) 2.Procede a importar numpy usando algo ya visto anteriormente: " import numpy as np" -----------> Explica que se necesita crear un plano, para generar una malla en 3era dimension, y no solo un plano cartesiano. 3. Lo siguiente es usar las variables anteriores " (RM) " " (INDUS) ". Usando " x_range = np.arrange (df [ 'RM' ].min (), df [ 'RM' ].Max() ) " + Notese que se hizo un " arreglo a la funcion minima de ' RM ', asi como para su funcion Maxima . " (Algo asi como delimitar el alcance minimo y el maxio que tiene la funcion dentro del plano). 4. Continua haciendo un copy / paste del codigo anterior y cambia el nombre de la variable " x1_range " a " x2_range " +Esto ya que ahora estamos usando una segunda variable. 5. Interesantemente esta es la funcion que nos permite crear la malla del plano, y esta es la siguiente. " X1, X2 = np.meshgrid(x1_range, x2_range) ". +Debido a que igual no estoy entendiendo al 100% lo que esta pasando. Es importante recalcar la maenra tan peculiar en la ques esta escrito el dodigo, la cual es la estructura de la funcion para crear la malla. + Con esto se crea una malla con todas las variables.
6. Todo lo anterior ya definido, ahora solo resta crear el plano, para ello se crea la variable " plano " y se aplica lo siguiente: " plano = pd.DataFrame({‘RM’:X1.ravel(), ‘INDUS’:X2.ravel()}) " + se esta defininedo como un Data Frame. + Que a su vez tiene como primera variable el promedio de las casas (RM). + Notese que despues de ' RM ' se utliza " : " el cual es para darle paso a la definicion que es ," X1. ravel() ". +" X1.ravel ()" , el cual a su vez esta poniendo (o invocando el arreglo de numpy que se hizo anteriormente), haciendolo mas sencillo y mejor de graficar. +Por ultimo, Luis agrega solo la siguiente variable que es " ' INDUS ' "y desues se usan dos ( "." ) puntos para deifinir que tiene " X2.ravel () " +Notese que se esta usando llaves ( " { } " )en donde estan las variables. ...interesante 🤔
σ Una vez definido el plano con el que vamos a trabajar. 1. " pred = slr.predict(plano).reshape(X1.shape)" +Se crea una variable, la cual basicamente se le dice a la prediccion que tenga la misa forma de x1 y que todas las variables tengan las mismas caracteristicas. ( Asi se vuelva mas facil de entender para que maplotlib cree el grafico en 3era dimension ).
2.pred = sc_y.inverse_transform(pred) +Pondresmos la inversa para que muestre los resultados en comparacion con los precios. + Luis hace nota de que se esta utilizando " sc_y " debido a que se esta usando codigo de anteriores ejercicios. Mas que en casos mas como ahora estamos usando 3 variables, esta bien podria llamarse " sc_z ". 3. Ahora cuando ya tienes la grafica pero ahora sigue definirla como fig = plt.figure() 4. A lo que Luis de inmediatamente despues explica que un axis sobre esta figura de tal manera de que sepa que es una figura en 3 dimensiones. A lo que se usa.
" ax = fig.gca (projection='3d') " +Lo que se le esta diciendo a Matplotlib, es que tiene que hace una grafica en 3 dimensiones. 7. Lo siguiente es crear la superficie, la malla que se va a usar. Para ello ya se tiene la funcion apropiara, la cual es: " ax.plot_surface (X1,X2,pred, alpha=0.4) " +Diciendo asi que basicamente se va hacer una superficie con la variable" x1", "x2" y la variable " predi " (o prediccion, ya establecida anteriormente). +Asi mismo, agregando al final (y antes de cerrar parentesis) , la cacteristica " alpha = 0.4 ". Lo cual agrega solo un valor de transparencia a la figura, lo que permitira que sea mas legible. ax.plot.dca (projection = '3d') " 8.Ya con esto definido lo ultimo que se tiene que hacer es invocar la version scatter de las variables que ya definiste. Como se muestra a continuacion : " ax.scatter3D( df ['RM'], df ['INDUS'], df ['MEDV'], color = 'R', marker = '.' ) " ---------------->Pasaron muchas cosas. + notese que ax. scatter, ya no es "ax.plotscatter" sino "ax.scatter3D" y esto por que sencillamente ahora estamos usando una grafica 3D y asi que tamb se tomen en cuentan las 3 variables que lo crean. + Y que al final las unicas cosas a destacar tambien, son el que se le pide que el color a usar sea Rojo ( 'R' ) y tamb un marcador que tenga forma de un punto ( '.' ). 9.Lo siguiente que se hizo fue cambiar el punto de vista desde el cual se mostraba la grafica 3D. Para cambiarla se escribio la linea: "ax.view_init (elev = 10, azim =5) + Asiendo asi el que el modelo se vea desde una perspectiva mas adecuada. y se aprecien mejor los detalles del mismo. 10. Por ultimo se escribe "plt.show" Para mostrar el resultado.
En economîa y econometría esta es una de las cosas mas fundamentales. La regresión lineal permite que podamos estudiar bajo el supuesto de ceteris paribus.
Si te sale el error: TypeError: gca() got an unexpected keyword argument 'projection' cambila la linea de codigo :
ax = fig.gca(projection='3d')
por
ax = fig.add_subplot(111, projection='3d')
Brillante. Muchas gracias por tu aporte a la comunidad.
Realice el escalamiento de nuestras variables y luego grafique. Para como se indico en el ejercicio pasado, se ajustara mejor nuestro modelo. Pero esto me genero una duda, ya que aqui como usamos solo 3 variables para graficar, un scatter 3d nos da las dimensiones visualmente, pero y si en algun caso requirieramos usar 3 variables para predecir otra? tendriamos 4 dimensiones, como lo graficariamos para verlo visualmente? Tengo la nocion de que entraria en juego el PCA para tomar las 3 dimensiones que capturen mejor nuestra varianza y asi graficar? o estos conceptos no se mezclan?
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import * import numpy as np x1_range = np.arange(X_std[:,0].min(),X_std[:,0].max()) x2_range = np.arange(X_std[:,1].min(),X_std[:,1].max()) X1, X2 = np.meshgrid(x1_range, x2_range) plano = pd.DataFrame({'RM':X1.ravel(), 'INDUS':X2.ravel()}) plano pred = slr.predict(plano).reshape(X1.shape) import plotly.graph_objects as go import plotly.express as px fig = go.Figure(data=[go.Surface(x=X1, y=pred, z=X2, opacity=0.5)]) fig1 = px.scatter_3d(x=X_std[:,0], y=y_std[:,0], z=X_std[:,1], color_discrete_sequence=['#FA0087'], opacity=0.8) fig1.update_traces(marker=dict(size=5)) fig.add_traces( data=fig1.data ) fig.update_layout(title='Ejercicio', scene_camera_eye=dict(x=1.87, y=0.88, z=-0.64), width=700, height=700, margin=dict(l=65, r=50, b=65, t=90)) fig.show()
🤔
Al ser programador por años, percato que este código no sigue los patrones de código limpio, y no solo lo digo por el profesor en como declara las variables, sino que también la librería que usa muchas abreviaciones, y no es nada entendible estar escribiendo de esa forma, como: gca, elev, azim, etc) se que algunas son fáciles de deducir, pero cuando uno recién es nuevo en esto, parece que esta todo en chino.
Muchas gracias por ir explicando el porque del codigo que se pone alli, me ha costado un monton entender machine learning y hasta que por fin mi mente esta absorbiendo todo. Mil gracias.
Hola tengo el siguiente error: UserWarning: X has feature names, but LinearRegression was fitted without feature names warnings.warn(, alguien me puede ayudar?
Si le haces una captura con el código, podrá ser más sencillo ayudarte
Le hice un par de retoques al código para que quede más vistoso el scatter3D:
from mpl_toolkits.mplot3d import * x_01_range = np.arange(df['RM'].min(), df['RM'].max(), 1) x_02_range = np.arange(df['INDUS'].min(), df['INDUS'].max()) X_01, X_02 = np.meshgrid(x_01_range, x_02_range) plane = pd.DataFrame({'RM': X_01.ravel(), 'INDUS': X_02.ravel()}) pred = slr.predict(plane).reshape(X_01.shape) pred = sc_y.inverse_transform(pred) fig = plt.figure(figsize=(15, 10)) ax = fig.add_subplot(111, projection='3d') ax.scatter3D(df['RM'], df['INDUS'], df['MEDV'], color='blue') ax.plot_surface(X_01, X_02, pred, color='red', alpha=0.4) ax.view_init(10, 15 ) ax.set_xlabel('RM') ax.set_ylabel('INDUS') ax.set_zlabel('MEDV') plt.show()
##Plotly
Este código utiliza la biblioteca Plotly para crear una figura 3D con una superficie basada en las predicciones del modelo y puntos dispersos representando los datos reales. Puedes personalizar la apariencia de la gráfica según tus preferencias modificando los parámetros en el código.
te quedo bien bonito