Fernando Rondón Puma - Regresión Lineal - Vehiculos
Fernando Rondón Puma - Regresión Lineal - Vehiculos
Fernando Rondón Puma - Regresión Lineal - Vehiculos
ipynb - Colaboratory
Una vez lo tengas descargado es importante que sepas donde lo dejaste guardado.
Esta segunda parte del ejercicio contiene todo lo de la primera, una vez llegues a una celda que
dice "Comienza la segunda parte" es donde está todo lo nuevo.
1 !jupyter nbconvert --to html "Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb
Options
=======
<cmd> --help-all
--debug
--show-config
--show-config-json
--generate-config
-y
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 1/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
--execute
--allow-errors
Continue notebook execution even if one of the cells throws an error and incl
Equivalent to: [--ExecutePreprocessor.allow_errors=True]
--stdin
read a single notebook file from stdin. Write the resulting notebook with def
Equivalent to: [--NbConvertApp.from_stdin=True]
--stdout
--inplace
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 2/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
Toda celda de código en Google Colab tiene un botón de ejecutar arriba a la izquierda, cada vez
que lo clickees se ejecutará todo el cógido de la celda.
1
#<---- Boton para correr este bloque de codigo
3
import pandas as pd
4
# Este codigo permite importar la libreria pandas, la cual sera util para manejar los d
5
#"as pd" singifica que para usar funciones de pandas debemos escribir pd.nombre_de_func
6
7
from google.colab import files #estas dos lineas de codigo permiten subir el archivo vs
8
uploaded = files.upload()
10
11
import io # No preocuparse por esta linea, lo importante es que nos permite leer vsc qu
12
df = pd.read_csv(io.BytesIO(uploaded['car data.csv']))# esta linea se encagarga de cont
13
# |
14
# |
15
# | Deberia aparecer un boton de "Examinar..." para subir el archivo con el dataset una
16
# |
17
# ↓
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 3/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
Antes de hacer cualquier otra cosa es importante examinar y entender el dataset, por eso se
utilizaran algunas funciones de ejemplo. Como describe, head, shape y dtypes
1
df.describe() # la funcion describe nos muestra un buen resumen del dataset
1
df.head() # la funcion head nos muestra los primeros 5 elementos del dataset
1
df.shape # la funcion shape nos da la forma del dataset en este formato (Cantidad de fi
2
3
#Las cantidad de filas representa la cantidad de casas del dataset
4
#La cantidad de columnas representa la cantidad de atributos o datos que tiene cada cas
(301, 9)
1
df.dtypes # la funcion dtypes nos muestra los tipos de variables del dataset, podemos v
Car_Name object
Year int64
Selling_Price float64
Present_Price float64
Kms_Driven int64
Fuel_Type object
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 4/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
Seller_Type object
Transmission object
Owner int64
dtype: object
1
correlations = df.corr()['Selling_Price']
3
# la funcion corr nos permite obtener las correlaciones entre las distintas variables
4
# En este caso selecionamos del dataframe la variable "Selling_Price" (precio de venta)
5
# obtendremos las relaciones entre esta variable y las demas
6
# Entre mas cercano a 1 sea el valor mayor es la correlacion y mejor es la variable par
7
8
print(correlations) # imprimimos los valores
10
#Present_Price (precio actual del vehiculo) deberia dar el valor de mayor correlacion c
11
Year 0.236141
Selling_Price 1.000000
Present_Price 0.878983
Kms_Driven 0.029187
Owner -0.088344
Al igual que con el R2, entre más cercano a 1 sea el valor de correlación mejor.
Al usar la función shape la consola debería haber mostrado que el dataset contiene 301, lo cual
puede ser una cantidad incomoda para visualizar en gráficas como haremos más adelante. Por
este motivo en el siguiente bloque de codigo vamos a "achicar el dataset", dejando solo 15
casas para analizar. Más adelante usaremos todo el dataset y podremos comparar resultados.
1
df_min = df.sample(15, random_state=10) #creamos un nuevo dataset al cual copiamos 15 v
2
# random_state=10 es un valor que deberias mantener igual si quieres obtener las mismas
3
# si pongo otro valor como random state el conjunto de 15 datos seria diferente
5
from sklearn.linear_model import LinearRegression # Sklearn es la libreria de machine l
6
X = df_min['Present_Price'].values.reshape(-1,1) # Definimos como X los valores de la c
7
# ".values.reshape(-1,1)" es necesario para luego utilizar la funcion fit, es sencillam
8
9
y = df_min['Selling_Price'].values.reshape(-1,1) # Definimos como Y la columna que con
10
1
import matplotlib.pyplot as plt # Esta libreria tiene herramientas para graficar
4
# Ahora que tenemos un conjunto de datos mas pequeño deberia ser facil graficarlo
6
plt.scatter(X,y) # Genera una grafica de puntos
8
plt.title('Demostración de Regresión Lineal') # Agrego un titulo
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 5/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
9
plt.ylabel('Precio de venta del vehiculo') # defino un nombre del eje y
10
plt.xlabel('Precio actual del vehiculo') # defino un nombre del eje x
1
reg = LinearRegression().fit(X,y)
2
# La funcion fit relaciona los valores de X e y, mientras que Linear Regression calcula
3
# la recta (y = mx + b) obtenida se guarda en la variable reg
1
y_hat = reg.predict(X) # Sustituimos en la recta (y = mx + b) nuestros valores iniciale
2
print(y_hat) # guardamos los resultados en y_hat
[[ 7.87551953]
[ 0.77227448]
[ 2.75470529]
[ 0.81136467]
[ 3.51975606]
[ 5.6082888 ]
[20.36204149]
[ 0.69967843]
[ 0.73876861]
[ 4.18987352]
[ 0.74435292]
[ 8.09889202]
[ 4.07818727]
[ 0.81136467]
[ 4.52493224]]
1
import matplotlib.pyplot as plt # Esta libreria tiene herramientas para graficar
3
# Recreamos la misma grafica pero ahora se muestra la recta obtenida
5
plt.scatter(X,y)
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 6/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
6
plt.plot(X, y_hat, color='green')
8
plt.title('Demostración de Regresión Lineal') # Agrego un titulo
9
plt.ylabel('Precio de venta del vehiculo') # defino un nombre del eje y
10
plt.xlabel('Precio actual del vehiculo') # defino un nombre del eje x
1
import matplotlib.pyplot as plt # Esta libreria tiene herramientas para graficar
3
# Recreamos la misma grafica pero ahora se muestra la recta obtenida
5
plt.scatter(X,y) # Grafica de dispersion, muestra los puntos iniciales
7
plt.scatter(X,y_hat, color='red')
9
# grafica de dispersion, muestra los puntos que se obtienen al sustituir nuestros valor
10
11
plt.plot(X, y_hat, color='green') # Dibuja la linea de regresion
12
13
14
plt.title('Demostración de Regresión Lineal') # asigna titulo a la grafica
15
plt.ylabel('Precio de venta del vehiculo') # asigna nombre al eje y de la grafica
16
plt.xlabel('Precio actual del vehiculo') # asigna nombre al eje x de la grafica
17
18
# No preocuparse demasiado por esta parte, al igual que las otras graficas no es necesa
19
# pero ayuda a visualizar que esta pasando
20
21
# Esto es un loop, el cual recorre todos los valores de los conjuntos X, y, y_hat
22
# a medida que los recorre va dibujando lineas punteadas para ilustrar el error de la r
23
for i in range(0, len(X)):
24
point1 = [X[i], y[i]]
25
point2 = [X[i], y_hat[i]]
26
27
x_values = [point1[0], point2[0]]
28
y_values = [point1[1], point2[1]]
29
30
plt.plot(x_values, y_values, color='red', linestyle='dashed')
31
32
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 7/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
En este momento en la variable y tenemos los valores de precios originales, mientras que en
y_hat tenemos los valores de precios obtenidos mediante la regresión lineal. Si comparamos la
diferencia entre estos valores podemos obtener el R2 de la recta.
1
from sklearn.metrics import r2_score
2
r2_score(y, y_hat)
3
# |
4
# |
5
# | Deberia aparecer el r2 una vez ejecutes este codigo
6
# |
7
# ↓
0.9843525074921549
1
# Defino nuevos valores de X e y pero con un 1 al final para no repetir nombres de vari
2
3
X1 = df['Present_Price'].values.reshape(-1,1)
4
y1 = df['Selling_Price']
6
# vuelvo a usar las herramientas de regresion
8
reg = LinearRegression().fit(X1,y1)
9
y_hat1 = reg.predict(X1)
10
11
# Y grafico nuevamente
12
plt.scatter(X1,y1)
13
plt.plot(X1, y_hat1, color='green')
14
plt.title('Demostración de Regresión Lineal')
15
plt.ylabel('Precio de venta del vehiculo')
16
plt.xlabel('Precio actual del vehiculo')
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 8/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
Ahora que tengo todos los datos la recta ya no parece tan representativa, ¿No?
Veamos su valor de R2
1
r2_score(y1, y_hat1)
2
# |
3
# |
4
# | Deberia aparecer el r2 una vez ejecutes este codigo
5
# |
6
# ↓
0.7726103146985799
El valor de R2 obtenido deberia ser de 0.7726103146985799, un valor mucho menor. ¿Por qué
sucede esto? La respuesta es bastante sencilla, con el primer conjunto de datos tuvimos
"suerte" de que los pocos valores caian cerca de la recta. Pero al utilizar todos los datos del
dataset se mostró que una recta que considera solo dos variables no es suficiente para
predecir de forma adecuada el precio de venta de los vehiculos, resulta que hay muchos otros
factores que afectan.
En esta segunda parte del ejercicio vamo a separar los datos en un conjunto de entrenamiento
y otro de validación de forma de evaluar de forma correcta su presición, utilizaremos multiples
variables para hacer la regresion y recurriremos tambien a regresiones no lineales.
1
X = df['sqft_living'].values.reshape(-1,1) # Definimos como X los valores de la columna
2
# ".values.reshape(-1,1)" es necesario para luego utilizar la funcion fit, es sencillam
3
4
y = df['price'].values.reshape(-1,1) # Definimos como Y la columna que contiene los pr
5
1
from sklearn.model_selection import train_test_split
3
#Sklearn tiene una libreria que nos permite separar facilmente el dataset
5
#Igualamos las variables a los resultados de la funcion train_test_split
6
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1
7
8
#con la funcion len podemos ver la cantidad de elementos en cada variable, asi podemos
9
print("Cantidad de valores en conjunto X: ", len(X))
10
print("Cantidad de valores de X en conjunto entrenamiento: ",len(X_train))
11
print("Cantidad de valores x en conjunto de validacion: ",len(X_test))
12
print("Cantidad de valores y en conjunto de entrenamiento: ",len(y_train))
13
print("Cantidad de valores y en conjunto de validacion: ",len(y_test))
14
15
X_train, X_test, y_train, y_test deja definidas 4 variables. X contiene los valores de
"sqft_living" (superficie en pies cuadrados), mientras que y contiene los valores de "price"
(precio). La X_train contendrá los valores de "sqft_living" que se usaran para entrenar el modelo,
mientras que la variable X_test contendrá los valores de "sqft_living" que se utilizaran para
evaluar el modelo. Lo mismo sucede con y_train e y_test.
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 10/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
La función train_test_split está aceptando 4 argumentos, los cuales sirven para ajustar
parámetros.
train_test_split(X, y, test_size=0.2, random_state=1)
Lo primero que colocamos entre paréntesis son las variables X e y (separadas con comas,
como debe ser al ingresar argumentos en una función). Esto le indica a la funcion
train_test_split que estos son los datos que queremos separar.
Luego tenemos test_size=0.2 esto indica que queremos usar el 20% de los datos del dataset
para el conjunto de evaluación. Lo cual automáticamente deja un 80% de los datos para el
entrenamiento.
Regresión polinómica
Con los datos ya separados es momento de hacer la regresión polinómica. Esta funciona de
una manera muy similar a la regresión lineal, incluso se usa la misma funcion de
LinearRegression, solo que antes se aplica una transformacion polinomial a los datos. No te
preocupes si esto suena confuso ya que Python se encarga de toda esta matemática, por lo
que basta con entender los conceptos sencillos que ya vimos.
Lo único que es necesario entender es que para realizar una regresión lineal tenemos que
guardar nuestros datos en variables X e y para luego utilizar la función LinearRegression.
Mientras que para obtener una regresión polinomica tenemos que guardar nuestros datos en
variables X e y, luego utilizar la funcion poly.fit_transform() en nuestros datos y finalmente
utilizar la función LinearRegression.
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 11/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
Y estos valores de R2
R2 en entrenamiento 0.48876078213887486
R2 en Validacion 0.5033019006466926
Lo cual podría llegar a ser decepcionante. Primero que nada se supone que la ventaja de la
regresion polinomial era obtener lineas curvas en lugar de una recta y en segundo lugar de
acuerdo al anterior artículo ya sabemos que un valor de R2 de 0,5 en validación no es muy útil.
Pero todo tiene una explicación, la razón por la cual obtuvimos una recta es sencilla.
poly = PolynomialFeatures(degree=1) # Definimos el grado de nuestro polinomio
En esa línea definimos que el valor del grado sea igual a 1, lo que hace imposible obtener algo
que no sea una recta. También es fácil ver como una recta no es una gran opción a la hora de
representar esa nube de puntos, explicando el bajo valor de R2.
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 12/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
¿Qué vamos a hacer entonces? Probar con grados mayores hasta encontrar el que nos de un
mejor valor de R2.
Para eso vamos a dejar en un solo bloque de código todo lo necesario para definir el grado,
realizar la regresión, graficar y obtener el R2. De forma de que sea sencillo copiar y pegar ese
bloque cambiando solo el valor del grado del polinomio.
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 13/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
Podemos ver que los valores de R2 en entrenamiento fueron mejorando levemente cada vez
que subiamos el grado del polinomio, mientras que los resultdos de R2 en validacion subieron
hasta el tercer grado para luego bajar a su peor resultado hasta el momento en el 4to grado y
para el 5to el resultado de R2 ya era negativo (o sea, inutilizable). Este fenómeno se conoce
como "overfitting" o sobreajuste. Básicamente al aumentar el grado del polinomio estamos
aumentando la complejidad del modelo, lo cual puede llegar a dar mejores resultados. Pero
luego de cierto punto de complejidad el modelo deja de "aprender" y pasa a "memorizar", por lo
que nos da cada vez mejores valores de entrenamiento pero al enfrentarlo a datos que no ha
visto antes los resultados obtenidos de R2 son desastrosos, porque haber "memorizado" ahora
no sirve para nada.
Podríamos decir entonces que lo mejor es utilizar el modelo polinomial de tercer grado, pero
aún así un valor de R2 de 0,55 no es nada demasiado útil. ¿Qué podemos hacer para seguir
mejorando? La respuesta está en utilizar más variables.
1
correlations = df.corr()['price'].sort_values() # una vez mas utilizamos la fucion corr
2
3
#la variable correlations tiene ahora guardadas todas las correlaciones de "price" con
4
5
plt.figure(figsize=(25,10)) #Definimos un buen tamaño para la gráfica
6
plt.xlabel('variables', fontsize=25) # le damos nombres a los ejes y asignamos un tamañ
7
plt.ylabel('correlacion con "Price"', fontsize=25)
8
plt.grid(True) # con esto nos aseguramos de que la gráfica esté cuadriculada
10
correlations = correlations.round(decimals=2) # con esto redondeamos el valor de las co
11
plt.rc('font', size=12) # ajustamos el tamaño de la fuente por defecto
12
# assign your bars to a variable so their attributes can be accessed
13
bars = plt.bar(correlations.index,correlations) #hacemos un diagrama de barras con las
14
#correlations.index tiene los nombres de las variables
15
16
# estas lineas de codigo hacen que cada barra tenga encima escrito el numero de correla
17
for bar in bars:
18
yval = bar.get_height()
19
plt.text(bar.get_x(), yval + .005, yval, fontsize=14)
20
21
plt.show
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 14/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
<function matplotlib.pyplot.show>
Podemos veer que hay una variable con una correlacion de 0.67, una diferencia bastante
mínima de la variable que utilizamos en el anterior ejercicio (0,7).
Vamos entonces a usar estas
dos variables a la vez para nuestra siguiente regresion. Veremos que usar dos variables es muy
similar a usar una sola. Literalmente cambia solo una línea de código.
Un detalle importante es que de ahora en adelante vamos a estar trabajando al menos con
datos tridimensionales (o de más dimensiones si seguimos utilizando más variables) por lo
cual se hace cada vez más difícil graficar como veníamos haciendo, por lo cual nos guiaremos
únicamente por los valores de R2.
Utilizando 4 variables
De acuerdo a la gráfica que hicimos un par de celdas atrás, hay una variable que tiene un valor
de correlacion de 0,61, lo cual podría llegar a sernos útil. Vamos a entonces repetir el mismo
código pero agreando una variable más.
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 15/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
[ ] ↳ 6 celdas ocultas
Utilizando 5 variables
De acuerdo a la gráfica que hicimos un par de celdas atrás, hay una variable que tiene un valor
de correlacion de 0,61, lo cual podría llegar a sernos útil. Vamos a entonces repetir el mismo
código pero agreando una variable más.
[ ] ↳ 6 celdas ocultas
Conclusiones finales
A través de este ejercicio de dos partes recorrimos por encima el uso de las herramientas de
sklearn y varias modalidades de uso de la regresión. Vimos los riesgos del sobre ajuste, la
importancia de separar los datos en entrenamiento y validación, las ventajas de considerar
múltiples variables a la vez y los riesgos de tener en cuenta demasiadas variables y también la
mentalidad que debemos tener al momento de mejorar nuestro modelo.
0,648 no es para nada un mal valor para un primer ejercicio de Machine Learning y en futuros
ejercicios es posible que volvamos a este dataset para intentar obtener mejores resultados.
Solo que esa vez probablemente sería mejor utilizar un modelo que no sea de regresión.
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 16/17
18/11/22, 19:26 Fernando Rondón Puma - Regresión lineal - Vehiculos.ipynb - Colaboratory
https://colab.research.google.com/drive/1itk6qi-8I4lquS7cxX-ifWERFc-CMG0H#scrollTo=wLMTDC1ZRZAC&printMode=true 17/17