fbpx
Get In Touch
1201 3rd Avenue Seattle, WA 98101, US
(HQ) Av. Punto Sur 31, Tlajomulco de Zúñiga, Jal 45050, MX
Carrera 11B # 99 - 25, Btá, 110221, CO
Let's talk
hello@inmediatum.com
Ph: +1 (650) 603 0883
Sales attention M - F 9am - 5pm (CT)
Get support
Careers
Endless inspiration and meaningful work
See open positions
Back

Como predecir el costo de una casa con Python

Python se ha convertido en uno de los lenguaje de programación más populares dentro de la industria del Machine Learning y otras ramas de la ingeniería. Es increíble la cantidad de cosas que se pueden hacer con el y un poco de imaginación. En este articulo haremos uso de Python para predecir costo casa Python , utilizado como alimentación de nuestro algoritmo un dataset enorme de casas con sus características y costo de cada una de ellas.

Instalaciones requeridas

Partiremos en el punto de que todos tenemos Python instalado en nuestros ordenadores, o estamos utilizando un editor en linea como Jupyter para poder continuar.

Dependencias:

$ pip install pandas
$ pip install numpy
$ pip install seaborn
$ pip install matplotlib
$ pip install sklearn

Parecieran muchas, más sin embargo son bastantes útiles estas herramientas.

Comencemos

Primero necesitamos importar cada una de las librerías a utilizar en nuestro archivo

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split

El siguiente paso es importar nuestro dataset, en este caso en formato csv con la información para entrenar nuestro modelo:

df = pd.read_csv('home_data.csv')

Este es el formato de nuestro dataset, el cual cuenta con 21,614 registros:

id date price bedrooms bathrooms sqft_living sqft_lot floors waterfront view condition grade sqft_above sqft_basement yr_built yr_renovated zipcode lat long sqft_living15 sqft_lot15
7129300520 20141013T000000 221900 3 1 1180 5650 1 0 0 3 7 1180 0 1955 0 98178 47.5112 -122.257 1340 5650
6414100192 20141209T000000 538000 3 2.25 2570 7242 2 0 0 3 7 2170 400 1951 1991 98125 47.721 -122.319 1690 7639
5631500400 20150225T000000 180000 2 1 770 10000 1 0 0 3 6 770 0 1933 0 98028 47.7379 -122.233 2720 8062
2487200875 20141209T000000 604000 4 3 1960 5000 1 0 0 5 7 1050 910 1965 0 98136 47.5208 -122.393 1360 5000

Ahora vamos a analizar los datos y encontrar una relación entre nuestra salida esperada en este caso es el precio y cada una de nuestras columnas, para ello nos apoyamos de una matriz de correlación grafica:

corr = df.corr()
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns)
plt.show()

Analizando la grafica nos damos cuenta que información influye más en el costo de una vivienda y podemos pulir de alguna forma nuestra dataset para eliminar nuestro sesgo de información.

Entre mas fuerte sea el cuadro que intercepta al precio y cada columna, menos relacion tiene en cuento al mismo, entonces en base a esto podemos deducir lo siguiente, los campos:

  • ‘id’
  • ‘date’
  • ‘zipcode’
  • ‘condition’

no influyen en nuestra salida esperada, entonces procedemos a quitarlas de nuestro dataset:

x = np.asanyarray(df.drop(columns=['id','date','price','zipcode', 'condition']))
y = np.asanyarray(df[['price']])

en nuestra x tendremos nuestros datos para entrenar a nuestro modelo (eliminando price ya que le estaríamos dando las respuestas al modelo y habría un sobre entrenamiento) y en el caso de nuestra solo incluiríamos el price ya que será lo que esperamos de salida.

Ahora viene el momento de separar la información 80 -20, normalmente es lo utilizado para entrenar modelos, separar de manera aleatoria los datos 80% para entrenar 20% para testing.

xtrain, xtest, ytrain, ytest = train_test_split(x,y)

Casi por ultimo viene el entrenamiento de nuestro modelo y el pipeline para ello, el modelo que en este caso utilizamos fue el de Ridge Regressor.

model = Pipeline([
('poly', PolynomialFeatures(degree=2, include_bias=False)),
('scaler', StandardScaler()),
('lin_reg', Ridge(alpha=0.0001)),
])

model.fit(xtrain,ytrain)

print('Train: ', model.score(xtrain,ytrain))
print('Test: ', model.score(xtest,ytest))

Nuestro pipeline en pocas palabras hace:

  • Agrega característica polinomial lo que aumenta la complejidad de nuestro modelo, en este caso a grado 2.
  • Estandarización de datos
  • Ridge Regressor
  • Entrena el modelo

Con esto tendremos nuestros scores para valorar lo certero que será nuestro modelo, los valores Train y Test, nos otorgan nuestro porcentaje de eficiencia. Entre más se acerquen a 1 y entre ambos valores tengan una diferencia no mayor a 3, nuestro modelo funcionara correctamente, con un bajo porcentaje de error.

Train: 0.8060546359311568
Test: 0.8108612763406902

Ahora es turno de realizar una prueba aleatoria con nuestro mismo dataset, para eso usamos el siguiente codigo:

r = np.random.randint(0, 21613)
x_test = np.asanyarray(df[r:r+1].drop(columns=['id','date','price','zipcode', 'condition']))
print("Predict price: ", int(model.predict(x_test)))
print("Real price: ", df.at[r,'price'])

Obtenemos un registro aleatorio dentro de nuestro dataset y hacemos una predicción con nuestro modelo entrenado y lo comparamos con nuestro precio real.

Predict price:  643438
Real price:  552500

Predict price:  338676
Real price:  315000

Este articulo puede interesarte Configuración de HTTPS de manera fácil y gratuita
Predict price:  321347
Real price:  355000
Luis Estrada
Luis Estrada

We use cookies to give you the best experience. Cookie Policy