Tasación Predictiva de propiedades

Para el 3er desafío de Data Science en Digital House, se nos planteó lo siguiente:
Utilizando una base de datos de propiedades en venta del último semestre de 2017, debíamos entrenar un modelo de regresión, que nos permitiera predecir el valor de una propiedad.
Lo que sigue, es el approach que tomamos, y los resultados que obtuvimos:

El Dataset

Properati ofrece en su sitio, la posibilidad de descargar datasets con las propiedades publicadas en su base de datos. Este dataset contiene una gran cantidad de información de propiedades en venta. Cada una de estas propiedades, está representada por una fila. A su vez, el dataset contiene varias columnas. Cada una de estas columnas representan una característica específica de la publicación, que puede estar relacionada tanto a la propiedad, como a la publicación. El siguiente paso es identificar la relación de cada una con el precio de la propiedad.

Las Features / Características

Las características de una propiedad están representadas en este caso, por cada columna. En las columnas tambien hay información específica de la publicación y no de la propiedad, por lo que tuvimos que realizar un proceso de selección de características que íbamos a mantener en nuestro modelo, y cuales íbamos a sacar.

Listado de Características del Dataset

  • Fecha de creación
  • Tipo de la propiedad (house, apartment, ph)
  • Operación del aviso (sell, rent)
  • Nombre del lugar
  • Nombre del lugar + nombre de sus ‘padres’
  • ID de geonames del lugar (si está disponible)
  • Latitud,Longitud
  • Precio original del aviso
  • Moneda original del aviso (ARS, USD)
  • Precio del aviso en moneda local (ARS)
  • Precio aproximado en USD
  • Superficie en m²
  • Superficie cubierta en m²
  • Precio en USD/m²
  • Precio por m²
  • N° de piso, si corresponde
  • Ambientes
  • URL en Properati
  • Descripción
  • Título
  • URL de un thumbnail de la primer foto

Eligiendo las características:

Realizamos dos tipos de selecciones:
La primera es la selección de características que pueden llegar a explicar el precio de la propiedad. Decidimos que estas características son:
  • Tipo de propiedad
  • Nombre del Lugar (Provincia, ciudad, barrio)
  • Superficie cubierta en m2
  • Número de Piso
  • Ambientes
La segunda es la selección de características que pueden llegar a decirnos algo sobre el precio, pero no están relacionadas específicamente a el. Esto significa que podemos armar características nuevas a partir de unas que no están completamente relacionadas:
  • Latitud y Longitud: Nos van a dar la ubicación exacta de la propiedad. Esto nos va a servir para extraer información de otro dataset, relacionando su ubicación.
  • Descripción: La descripción puede llegar a contener mucha información adicional que nos va a permitir generar características que no existen en el dataset original.

Limpieza de Información

Si bien el dataset de properati es extenso y contiene mucha información, no toda la información está completa o es correcta. Por esto, realizamos un proceso inicial de limpieza y corrección de información, intentando recuperar información a partir de otras variables.
Un ejemplo de esto es la recuperación de valores nulos del campo Superficie Total en m². 
Investigando los datos, podemos deducir que el precio está mas relacionado a la superficie total que a la superficie cubierta.
Este mapa lo armamos dividiendo el precio total / precio por metro cuadrado. La variable total_div_per_m2 es el valor resultante y, al compararlo con superficie total y superficie cubierta, podemos ver que claramente el precio total está relacionado directamente al la superficie total y no a la superficie cubierta.

Ingeniería de Características (Feature Engineering)

A partir de las características que elegimos, comenzamos el proceso de generación de otras características. Una de estas característica creadas, fue pensada en base a outliers que se encontraban en el precio.
Al analizar los datos, encontramos por ejemplo zonas como Tigre, que tenían precios muy bajos y precios MUY altos. Esto se debe a que hay una gran concentración de barrios privados, y la variación de precios es muy grande.
Por esto, pensamos en alguna manera de identificar las propiedades en relación a los barrios privados. Lo que hicimos fue crear nuestro propio dataset de todos los barrios privados de la argentina, realizando un WebScraping de la pagina www.guiacountry.com. El dataset puede ser descargado desde aquí: https://www.kaggle.com/juanumusic/argentinas-private-neighborhoods 

Con este dataset, creamos una característica llamada distancia con barrio privado la cual contiene la distancia en kilometros de la propiedad con el barrio privado mas cercano. Esto lo hicimos utilizando las coordenadas de la propiedad y las coordenadas del barrio privado.

Outliers

Una vez solucionado el inconveniente de grandes diferencias de precios en una misma zona, encontramos tambien que existían varios outliers en función de superficie y de precio.
Realizamos varias pruebas para encontrar la mejor solución:
  • Aplicar la media
  • Winsorize (cambiar el valor de los outliers al máaximo o mínimo de +/- 3 desviaciones estandard)
  • Eliminarlos
Luego de probar con las 3 cómo respondía el modelo, decidimos deshacernos de los outliers ya que esta es la que menos nos modificaba la distirbución. De hecho, al eliminarlos, la relación entre precio y superficie mejoró significativamente.

Parametrización

El siguiente paso fue parametrizar la notebook. Esto nos permitió generar distintas configuraciónes para cada proceso, y de esta manera ajustarlas para obtener el modelo con la mayor precisión, con las distintas combinaciones posibles de parametros.
Algunos parametros que definimos fueron:

  • CALCULAR_DISTANCIA_CON_BARRIOS_PRIVADOS = True/False: Indica al modelo si se crea la columna de distancia con barrios privados para luego entrenarlo con esta
  • UTILIZAR_ROOMS: Indica si en nuestro modelo de entrenamiento vamos a incluir o no la columna de Ambientes
  • NIVEL_UBICACION: La columna PLACE contiene la ubicacion de la propiedad de manera jerarquica. Algo así como: PAIS|PROVINCIA|CIUDAD|BARRIO. Con el nivel podíamos elegir hasta que nivel queremos utilizar. Encontramos que el valor que mejor resultado da en nuestro modelo es 3 (PAIS|PROVINCIA|CIUDAD) dejando BARRIO fuera de la ecuación
Por supuesto que hay muchas otras variables. Al final del blog van a encontrar el link a la notebook para ver las implementaciones que se hicieron.

Modelo: Elección, entrenamiento y Cross validation

Una vez que tenemos preparado nuestro modelo de datos, con toda la información procesada, y nuestras features creadas, llega el modelo de elegir el modelo de regresión a utilizar.
Realizamos la prueba con tres modelos de regresión:
  • LinearRegression
  • Ridge
  • Lasso
Ridge y Lasso requieren de un hiperparametro extra llamado alpha. El parámetro alpha indica la fuerza de regularización que se le va a aplicar al modelo. Este valor es distinto para el tipo de modelo de datos que estemos utilizando, por lo que la manera de encontrar el mejor valor es probar hasta encontrar el valor más óptimo. Está fuera del alcance de este post explicar el significado de ALPHA, pero se puede investigar en la web mas sobre este tema:


Para elegir el mejor valor de alpha, utilizamos CrossValidaton sobre estos dos métodos utilizando los modelos RidgeCV y LassoCV

Utilizando los modelos de cross validation, scikitlearn se encarga de recorrer para una cantidad N de alphas y elegir los que mejor se ajustan al modelo.

Y que hago con todo esto?

Tenemos nuestros datos, tenemos elegidos los modelos. Tenemos nuestros alphas.
Ahora solo nos queda empezar a jugar con los parametros que creamos en nuestra notebook, hasta encontrar el modelo que mejor se ajuste.

Identificando el mejor modelo

Cuando empecé a meterme en el mundo de Data Science y machine learning, pensaba que existía un valor o medida específica que me podía decir si mi modelo era bueno o malo.
Esto es así, pero teniendo en cuenta la siguiente premisa:
Es mi modelo bueno o malo EN RELACION A QUE?
Esto significa que, una vez que tenemos nuestro modelo, podemos utilizar muchos tipos de métricas que nos van a dar distintos tipos de resultados sobre nuestra predicción. Estas métricas por si solas no nos van a decir si el modelo es bueno o malo. Lo que van a hacer es decirnos cómo cambia nuestro modelo, en relación a otro modelo, utilizando la misma métrica.

Mean Squared Error (MSE)

Mean Squared Error o Error Cuádratico Medio, es:
La media de la diferencia de nuestra predicción contra el valor real, al cuadrado. Teniendo en cuenta que $y= \text{valor real}$,$\hat{y}=\text{valor predicho}$ y $n=\text{cant. de observaciones}$

La fórmula es:

$$ MSE = \frac{\sum(y - \hat{y})^2}{n} $$

Si no la entendés no importa. Lo que hay que saber es que nos da un valor de referencia que está basados en: El promedio de la resta entre el valor real y el valor predicho.

Con esto, podemos correr distintas configuraciones de nuestro modelo y, como sabemos que la métrica es una resta entre el valor real y el valor predicho, vamos a buscar que este nro sea lo mas cercano a CERO, ya que si este valor es CERO, nuestra predicción es exactamente igual al valor real.

Features con Coeficiente Cero

Luego de haber ejecutado lasso, obtenemos los campos cuyos coeficientes quedaron en cero y los eliminamos del modelo. Ejecutamos de nuevo el modelo y observamos que, aún cuando tenemos esta ventaja con Lasso, el puntaje de MSE de Ridge es mejor que el de Lasso.


Observamos tambien que la diferencia (color blanco)  es tan pequeña, que en los gráficos de comparación de $y$ y $\hat{y}$, no se nota. Una predicción perfecta tendría que dibujar una linea horizontal perfecta en 45 grados, y con sus ejes X e Y en la misma escala.

Conclusión

Este gráfico nos muestra la regresión lineal elegida por cada modelo (Lineal, Ridge y Lasso) en la linea azul, cómo se distribuyen las predicciones en relación a los valores reales (cada punto), y la diferencia en relación al valor real (color). Lo ideal es que la regresión esté alineada con los puntos en blanco. Esto nos daría una predicción casi perfecta.

Sabemos que no es el mejor modelo a utilizar, pero vemos que no estabamos tan lejos tampoco.

Si bien nuestro modelo no es perfecto, logramos comprender el funcionamiento de los modelos lineales, así como el significado de muchos valores como: MSE, R2, Ridge, Lasso, así como su utilización.

Recursos

Pueden descargar el código de este proyecto en mi GitHub: https://github.com/HarkDev/Predicci-n-Lineal-de-Propiedades

Comentarios

Entradas populares