Codificación de la estacionalidad para mejorar nuestros modelos de valoración de propiedades

Introducción
En Homebound, el equipo de aprendizaje automático y fijación de precios es responsable de desarrollar y mantener un modelo de valoración automatizado (AVM) para predecir con precisión el valor de una propiedad. Apodado aquí como el Modelo de valoración de la vivienda (HVM), características como el tamaño de una casa, la vista de la propiedad, la proximidad a las carreteras principales y mucho más se utilizan para estimar el precio de una propiedad. Esto permite que nuestro equipo de suscripción valore las propiedades de manera rápida y precisa para los clientes que buscan vender sus casas a través del Portal de compra de propiedades en el hogar .
Nuestro equipo trabaja continuamente para mejorar HVM mediante la ingeniería de nuevas funciones, la modificación de la arquitectura del modelo y la mejora de la calidad de los datos. Una característica que hemos incorporado recientemente en nuestros modelos es la estacionalidad. La época del año en la que decide comprar o vender su casa puede tener un impacto en el valor de su propiedad. Dependiendo de la ubicación de una casa, los precios tienden a ser más altos durante los meses de primavera y verano y más bajos durante el invierno. Si bien nuestros modelos iniciales capturaron ingenuamente algunos aspectos de la estacionalidad a través de características como la cantidad de tiempo desde la última venta de una casa, queríamos codificar explícitamente aspectos de la estacionalidad en nuestros modelos.
Codificación de la estacionalidad
Tradicionalmente, el precio de cotización de una casa depende de las casas comparables cercanas vendidas recientemente o de las comparaciones. Si bien es posible que un vendedor que enumere su casa no esté planificando cuándo está vendiendo su casa, un tasador o agente de bienes raíces tiene en cuenta la temporada en el precio de lista de su casa. Para los modelos de aprendizaje automático, esta estacionalidad debe incluirse explícitamente en el modelo y se puede hacer de muchas maneras.
Mensual
Codificar la estacionalidad a través del mes en el que ocurrió un evento, ordinal o categórico, es probablemente la forma más común y sencilla de extraer características estacionales. En Homebound, este es el mes en el que se puso a la venta una propiedad. Aunque esto es fácil de implementar e interpretar, este método a menudo carece de lo que queremos que el modelo entienda sobre la estacionalidad. Por ejemplo, si estos datos están codificados en caliente, cada mes se considera independiente, mientras que en realidad sabemos que existe una relación en el tiempo. Si estos datos son ordinales, consideramos la similitud entre meses como enero y febrero, mientras que distanciamos meses diferentes como enero y junio, pero luego nos encontramos con el problema de enero y diciembre como los meses menos similares.

Cubo
Otra forma de representar la estacionalidad es agrupar o agrupar el tiempo que puede ser relevante para el resultado que se predice. Por ejemplo, clasificamos manualmente las fechas de la lista en dos formas potencialmente relevantes, trimestral y estacional. Si bien esto reduce la dimensionalidad y codifica manualmente aspectos de la estacionalidad percibida, los mismos problemas discutidos anteriormente persisten con las representaciones tanto categóricas como ordinales de estos grupos divididos en cubos.

Cíclico
Si bien las representaciones de tiempo mensuales y agrupadas ayudan a interpretar y representar la estacionalidad como características del modelo, tienen dificultades para capturar la naturaleza cíclica del tiempo y las estaciones. Una forma alternativa de capturar este ciclo estacional es transformar las fechas de un año en un espacio de características bidimensional, seno y coseno. Esto se hace normalizando el día numérico del año a un valor entre 0 y 1, transformando esos valores entre los intervalos de seno y coseno de 0 y 2π, y luego obteniendo el seno y el coseno de esos valores (piense en el círculo unitario de la trigonometría ). Luego, cada día del año se representa mediante un par único de valores de seno y coseno que forma un círculo, como se ve en la siguiente figura.

Una desventaja de esta metodología es la falta de interpretabilidad. Tener dos características que representan el tiempo hace que sea más difícil descifrar la importancia de la característica y su efecto general en la variable de resultado. Además, algunos modelos, como los métodos basados en árboles, pueden tener problemas para crear divisiones útiles en dos características que representan un elemento, la estacionalidad. Una posible solución a este problema es crear una característica cíclica unidimensional similar que se interprete como N días a partir de un punto específico elegido en el tiempo. Esto es el equivalente a representar el tiempo como la representación del tiempo en coseno normalizado desde arriba, donde cada día está a N días del 1 de enero hasta que N converge en julio. Sin embargo, esto lleva a que dos momentos diferentes del año estén representados por el mismo valor.

En última instancia, no existe una forma "correcta" de codificar la estacionalidad. Cada uno de estos métodos tiene sus ventajas y desventajas según el problema en cuestión, los requisitos comerciales y el modelo elegido. Por lo tanto, la única forma en que pudimos evaluar de manera justa qué método era el mejor para HVM fue a través de la experimentación.
Evaluación de experimentos
Para determinar cómo representar mejor la estacionalidad en el HVM, realizamos experimentos para determinar la función que minimiza el error, según lo define el error de precisión promedio promedio (MAPE), y finalmente brinda el mayor aumento en la precisión del modelo. En Homebound, usamos mlflow para rastrear experimentos, almacenar detalles de modelos y evaluar métricas clave en diferentes regiones. La siguiente tabla contiene información sobre la ejecución de los experimentos de estacionalidad.

Dado que las codificaciones de características cíclicas generalmente se usan en modelos que no están basados en árboles, a menudo en modelos de aprendizaje profundo, nos sorprendió ver que nos brinda el mayor impulso en el rendimiento del modelo. El HVM es un conjunto de métodos basados en árboles y, por lo tanto, no estábamos seguros de su capacidad para captar la estacionalidad de los precios de las viviendas desde un espacio de características bidimensional.
Si no está seguro de cómo codificar la estacionalidad para sus proyectos, pruebe estos métodos, ¡puede que se sorprenda con lo que funciona!
Próximos pasos y trabajo futuro
Como se mencionó anteriormente, uno de los objetivos principales de nuestro equipo es ayudar al equipo de suscripción de Homebound a realizar ofertas rápidas, precisas y justas a los posibles clientes de Homebound. Proporcionar una mayor capacidad de explicación en las predicciones de HVM es una forma en que podemos mejorar la asociación entre nuestros equipos. Si bien la incorporación de las características cíclicas bidimensionales fue excelente para impulsar el rendimiento del modelo, disminuyó un poco la interpretabilidad del modelo.
Una forma en que el equipo de Machine Learning ha obtenido información sobre las predicciones individuales y los efectos de la estacionalidad en una predicción es a través de los valores de Shapley . En el futuro, proporcionar el mismo nivel de interpretabilidad a las predicciones de HVM para el equipo de suscripción también podría ayudarnos a iterar y mejorar nuestra comprensión de la estacionalidad del precio de la vivienda mejor en diferentes mercados regionales y mejorar nuestros modelos.
Implementación de Python
Esta sección se centrará principalmente en la implementación de las diferentes funciones de estacionalidad discutidas anteriormente, en Python.
Comenzamos importando los paquetes necesarios para crear un Pandas DataFrame ficticio que contiene fechas de los últimos tres años (2019-2021) para extraer características de estacionalidad.
# import packages
import pandas as pd
import numpy as np
# create dummy dataframe of dates over the past 3 years (2019-2021)
df = pd.DataFrame()
df['date'] = pd.Series(pd.date_range('2019', periods=1096, freq='D'))
# extract month number for ordinal representation of months
df['month_ordinal'] = df['date'].dt.month
# extract month name for categorical representation of months
df['month_categorical'] = df['date'].dt.month_name()
# extract quarters for bucketed representation of time
# note: the last two characters are removed to keep the quarter without year
df['quarter'] = df['date'].dt.to_period('Q').astype('str').str[-2:]
# create list of desired month number to group mapping
seasons = ['Winter', 'Winter', 'Spring', 'Spring', 'Spring', 'Summer',
'Summer', 'Summer', 'Fall', 'Fall', 'Fall', 'Winter']
# map month number (1-12) to desired group (list created above)
season_month_map = dict(zip(range(1,len(seasons)+1), seasons))
# map extracted month number (month_ordinal) to desired group
df['season'] = df['month_ordinal'].apply(lambda x: season_month_map[x])
# extract day of year from date
df['day_of_year'] = df['date'].dt.dayofyear
# create cyclic sine and cosine normalized representation of time using extracted day of year
# note: divide by 366 to normalize & account for leap years (max number of days in a year)
# note: using just cos_date feature is equivalent to the one-dimnesional feature described
df['sin_date'] = np.sin(2 * np.pi * df['day_of_year']/366)
df['cos_date'] = np.cos(2 * np.pi * df['day_of_year']/366)

Homebound está contratando! ¿Interesado en trabajar en Homebound? ¡ Mira nuestra página de carreras !
Para obtener más información sobre Homebound, visite el sitio web de Homebound o vaya al Blog de tecnología de Homebound para ver más historias de nuestro equipo.
Referencias
[1] Araj, Victoria. “La mejor época del año para comprar una casa”. Rocket Mortgage , 1 de noviembre de 2022,https://www.rocketmortgage.com/learn/best-time-of-year-to-buy-a-house.
[2] Bescond, Pierre-Louis. "Codificación de características cíclicas, ¡ya era hora!", Hacia la ciencia de datos , 8 de junio de 2020,https://towardsdatascience.com/cyclical-features-encoding-its-about-time-ce23581845ca.
[3] Tolva. "Ai en viajes, Parte 2: Representación de características cíclicas y geográficas". Medio — La vida en Hopper , 27 de abril de 2018,https:///life-at-hopper/ai-in-travel-part-2-representing-cyclic-and-geographic-features-4ada33dd0b22.