Prediciendo los precios de las casas de Boston

En este proyecto vamos a implementar el algoritmo de regresión linear para predecir el precio de las casas en Boston. La base de datos (dataset) a utilizar es provisto por la librería de scikit-learn y consiste en el precio de las casas en varios lugares en Boston, Estados Unidos.

Adicional al precio, esta base de datos incluye información sobre el crimen, los impuestos e inclusive las proporciones de edades de las personas que habitan las casas, en total son 13 atributos de información que contiene esta base de datos, se puede ver toda la información ingresando en este link.

Dicho todo esto comencemos a programar, lo primero que se debe realizar es importar todas las librerías que vayas a utilizar en todo el programa, esta información se puede ir actualizando a medidas que avancemos.

import numpy as np
import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt
import sklearn

from sklearn.linear_model import LinearRegression
from sklearn import preprocessing, svm
from sklearn.model_selection import train_test_split
from matplotlib import style

Exploración de los datos

Una vez importado las librerías debemos importar la base de datos de las casas de Boston “Boston Housing”, esto lo hacemos utilizando scikit-learn.

from sklearn.datasets import load_boston
boston = load_boston()

Ahora procedemos a conocer más sobre los datos importados, primeramente, verificamos si existen “keys” o atributos, ya que esta base datos está basada en un diccionario.

print(boston.keys())

Adicionalmente, podemos verificar más información, como la forma de la base de datos (shape), la descripción (DESCR) e inclusive el encabezado de cada columna (feature_names).

print(boston.data.shape)
print(boston.DESCR)
print(boston.feature_names)

Conociendo más los datos podemos ahora a convertirlos en “pandas”. La razón de esto es que gran parte de las librerías utilizadas en Python para Machine Learning, manejan solamente datos en formato pandas, para que sea más fácil su manipulación. Realizar esta conversión es muy fácil y se hace en solo una línea de código.

bostonpd = pd.DataFrame(boston.data)
print(bostonpd.head())

Como se puede observar, el encabezado de las columnas ya no aparece, esto lo podemos solucionar fácilmente utilizando “feature_names”.

bostonpd.columns = boston.feature_names
print(bostonpd.head())

Si observamos la base datos podrás ver que no existe ninguna columna con los precios de las casas, pero si te acuerdas cuando verificamos los “keys” había uno de ellos llamado “target”, este es el que contiene los precios, por lo que lo incluimos en la nueva base de datos que estamos creando.

bostonpd["PRICE"] = boston.target
print(bostonpd.head())

Con todo este procedimiento tenemos nuestra base datos lista para realizar el análisis respectivo para la predicción correspondiente. Inclusive podemos graficar lo que tenemos hasta los momentos para ver de manera visual el contraste entre el precio y el número de habitaciones de las viviendas.

plt.scatter(bostonpd.RM, bostonpd.PRICE)
plt.xlabel('Número de habitaciones')
plt.ylabel('Precio')
plt.show()

División de la base de datos

Procedemos a separar la data, lo primero que hacemos es separar en “X” y “y”. X corresponde solamente a los datos con los precios de las casas, en otras palabras, los datos a predecir; mientras que y corresponde al resto de los datos que son los que se necesitan para construir el modelo predictor.

X = np.array(bostonpd.drop(['PRICE'], 1))
X = preprocessing.scale(X)
y = np.array(bostonpd['PRICE'])

En este momento, la base de datos esta lista para ser procesada, por lo que la separamos para obtener los datos de entrenamiento y los datos de prueba. Los primeros los utilizaremos para realizar las pruebas respectivas y obtener el mejor modelo y los últimos se utilizan para comprobar si el modelo obtenido se encuentra correcto. La proporción será de la siguiente manera: el 70% se utilizará para entrenamiento mientras que el 30% se empleará para las pruebas.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

Regresión linear

Finalmente aplicamos el algoritmo para obtener el modelo para luego ser usado para predecir los precios de las casas. En este caso utilizamos el algoritmo de aprendizaje supervisado: regresión lineal. Al mismo tiempo calculamos la confianza del modelo, entre más cercano sea este número a 1 más confiable es el modelo.

lr = LinearRegression()
lr.fit(X_train, y_train)
confidence = lr.score(X_test, y_test)
print('Confianza = ', confidence)

Continuamos ahora con la predicción de los datos utilizando el modelo anteriormente definido, y calculamos la media del error para verificar que tan exacto fueron los datos obtenidos.

predict = lr.predict(X_test)
resta = np.mean(y_test - predict)
print('Error = ',resta)

Análisis final

Con este proyecto utilizamos datos reales e implementamos un modelo de regresión lineal para predecir los precios de las casas en Boston.

Lo importante en todo esto es tener una data lo suficientemente limpia para que podemos desarrollar un modelo lo más aproximado posible a la realidad, en este caso la data estaba bastante limpia y solamente se tuvo que realizar lo básico para que pudiese ser manejada por las librerías correspondiente, pero en ocasiones esto no es así y hay que trabajar bastante en la data para sacar lo mejor de ella.

El modelo obtenido se puede utilizar para predecir los precios de las casas en Boston y como se pudo observar tiene una confianza satisfactoria para que los resultados que se obtengan estén bastante ajustados a la realidad.

El código completo de este proyecto es el siguiente:

import numpy as np
import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt
import sklearn

from sklearn.linear_model import LinearRegression
from sklearn import preprocessing, svm
from sklearn.model_selection import train_test_split
from matplotlib import style

#Se obtiene la data
from sklearn.datasets import load_boston
boston = load_boston()

#Se verifica la data extraida
print(boston.keys())

print(boston.data.shape)
print(boston.DESCR)
print(boston.feature_names)

#Se convierte la data de diccionario a pandas
bostonpd = pd.DataFrame(boston.data)
print(bostonpd.head())

bostonpd.columns = boston.feature_names
print(bostonpd.head())

bostonpd["PRICE"] = boston.target
print(bostonpd.head())

plt.scatter(bostonpd.RM, bostonpd.PRICE)
plt.xlabel('Número de habitaciones')
plt.ylabel('Precio')
plt.show()

#Se divide la data en prueba y entrenamiento
X = np.array(bostonpd.drop(['PRICE'], 1))
X = preprocessing.scale(X)
y = np.array(bostonpd['PRICE'])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

#Se realiza el análisis correspondiente
lr = LinearRegression()
lr.fit(X_train, y_train)
confidence = lr.score(X_test, y_test)
print('Confianza = ', confidence)

predict = lr.predict(X_test)
resta = np.mean(y_test - predict)
print('Error = ',resta)

plt.scatter(y_test, predict)
plt.xlabel("Pricios")
plt.ylabel("Precios Predecidos")
plt.show()

 

3 thoughts on “Prediciendo los precios de las casas de Boston”

  1. Hola, excelente artículo, tengo las siguientes observaciones:
    1. En el siguiente texto «Procedemos a separar la data, lo primero que hacemos es separar en “X” y “y”. X corresponde solamente a los datos con los precios de las casas, en otras palabras, los datos a predecir; mientras que y corresponde al resto de los datos que son los que se necesitan para construir el modelo predictor», creo que están trocados los significados de «X» y «y».
    2. Puedes explicarme para qué se hace «preprocessing.scale(X)»
    Mucgas gracias!

  2. Gran aporte. Además, es un excelente ejemplo de cómo, como profesionales, podemos aprovechar internet para difundir nuestros trabajos y conocimiento. Es una manera excelente de hacer currículum. Saludos desde Lima, Perú.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *