Encoder la saisonnalité pour améliorer nos modèles d'évaluation des propriétés

Introduction
Chez Homebound, l'équipe Machine Learning & Pricing est responsable du développement et de la maintenance d'un modèle d'évaluation automatisé (AVM) pour prédire avec précision la valeur d'une propriété. Surnommé ici le modèle d'évaluation à domicile (HVM), des caractéristiques telles que la taille d'une maison, la vue sur la propriété, la proximité des routes principales et bien d'autres sont utilisées pour estimer le prix d'une propriété. Cela permet à notre équipe de souscription d'évaluer rapidement et avec précision les propriétés des clients qui cherchent à vendre leur maison via le portail d'achat de propriété Homebound .
Notre équipe travaille en permanence à l'amélioration de la HVM en concevant de nouvelles fonctionnalités, en modifiant l'architecture du modèle et en améliorant la qualité des données. Une caractéristique que nous avons récemment intégrée à nos modèles est la saisonnalité. La période de l'année à laquelle vous décidez d'acheter ou de vendre votre maison peut avoir un impact sur la valeur de votre propriété. Selon l'emplacement d'une maison, les prix ont tendance à être plus élevés au printemps et en été et plus bas en hiver. Alors que nos modèles initiaux capturaient naïvement certains aspects de la saisonnalité à travers des caractéristiques telles que le temps écoulé depuis la dernière vente d'une maison, nous voulions encoder explicitement les aspects de la saisonnalité dans nos modèles.
Encodage de la saisonnalité
Traditionnellement, le prix d'inscription d'une maison dépend des maisons récemment vendues, comparables à proximité ou des comps. Alors qu'un vendeur inscrivant sa maison peut ne pas prévoir quand il vendra sa maison, un évaluateur ou un agent immobilier tient compte de la saison dans le prix d'inscription de sa maison. Pour les modèles d'apprentissage automatique, cette saisonnalité doit être explicitement incluse dans le modèle et peut être effectuée de nombreuses manières.
Mensuel
L'encodage de la saisonnalité au cours du mois au cours duquel un événement s'est produit, ordinal ou catégoriel, est probablement le moyen le plus courant et le plus simple d'extraire des caractéristiques saisonnières. Chez Homebound, il s'agit du mois au cours duquel une propriété a été mise en vente. Bien que cela soit facile à mettre en œuvre et à interpréter, cette méthode manque souvent de ce que nous voulons que le modèle comprenne sur la saisonnalité. Par exemple, si ces données sont encodées à chaud, chaque mois est considéré comme indépendant, alors qu'en réalité nous savons qu'il existe une relation dans le temps. Si ces données sont ordinales, nous tenons compte de la similitude entre des mois tels que janvier et février, tout en éloignant des mois dissemblables tels que janvier et juin, mais rencontrons ensuite le problème de janvier et décembre comme étant représentés comme les mois les moins similaires.

Benne
Une autre façon de représenter la saisonnalité est de regrouper ou de regrouper le temps qui peut être pertinent pour le résultat prévu. Par exemple, nous avons regroupé manuellement les dates de liste de deux manières potentiellement pertinentes, trimestrielles et saisonnières. Bien que cela réduise la dimensionnalité et encode manuellement les aspects de la saisonnalité perçue, les mêmes problèmes évoqués ci-dessus persistent avec les représentations catégorielles et ordinales de ces groupes de compartiments.

Cyclique
Bien que les représentations mensuelles et par tranches du temps aident à interpréter et à représenter la saisonnalité en tant que caractéristiques du modèle, elles ont du mal à saisir la nature cyclique du temps et des saisons. Une autre façon de capturer ce cycle saisonnier consiste à transformer les dates d'une année en un espace de caractéristiques à deux dimensions, sinus et cosinus. Cela se fait en normalisant le jour numérique de l'année à une valeur comprise entre 0 et 1, en transformant ces valeurs entre les intervalles sinus et cosinus 0 et 2π, puis en obtenant le sinus et le cosinus de ces valeurs (repensez au cercle unitaire de la trigonométrie ). Chaque jour de l'année est alors représenté par une paire de valeurs sinus et cosinus unique qui forme un cercle, comme le montre la figure ci-dessous.

Un inconvénient de cette méthodologie est le manque d'interprétabilité. Le fait d'avoir deux caractéristiques représentant le temps rend plus difficile le déchiffrement de l'importance de la caractéristique et son effet général sur la variable de résultat. De plus, certains modèles, tels que les méthodes basées sur des arbres, peuvent avoir des difficultés à créer des divisions utiles sur deux caractéristiques représentant un élément, la saisonnalité. Une solution potentielle à ce problème consiste à créer une caractéristique cyclique unidimensionnelle similaire qui est interprétée comme N jours à partir d'un point précis et choisi dans le temps. Cela équivaut à représenter le temps comme la simple représentation en cosinus normalisé du temps d'en haut, où chaque jour est à N jours du 1er janvier jusqu'à ce que N converge en juillet. Cela conduit cependant à ce que deux périodes différentes de l'année soient représentées par la même valeur.

En fin de compte, il n'y a pas de "bonne" façon d'encoder la saisonnalité. Chacune de ces méthodes a ses avantages et ses inconvénients en fonction du problème à résoudre, des exigences de l'entreprise et du modèle choisi. Par conséquent, la seule façon dont nous pouvions évaluer équitablement quelle méthode était la meilleure pour le HVM était par l'expérimentation.
Évaluation des expériences
Pour déterminer la meilleure façon de représenter la saisonnalité dans le HVM, nous avons effectué des expériences pour déterminer la fonctionnalité qui minimisait l'erreur, telle que définie par l'erreur de précision moyenne moyenne (MAPE), et qui fournissait finalement la plus grande amélioration de la précision du modèle. Chez Homebound, nous utilisons mlflow pour suivre les expériences, stocker les détails du modèle et évaluer les mesures clés dans différentes régions. Le tableau ci-dessous contient des informations sur les tests de saisonnalité exécutés.

Étant donné que les encodages de caractéristiques cycliques sont généralement utilisés dans des modèles non basés sur des arbres, souvent dans des modèles d'apprentissage en profondeur, nous avons été surpris de voir qu'ils nous donnent le plus grand coup de pouce dans les performances du modèle. Le HVM est un ensemble de méthodes basées sur des arbres, et nous n'étions donc pas sûrs de sa capacité à capter la saisonnalité des prix des maisons à partir d'un espace de caractéristiques bidimensionnel.
Si vous ne savez pas comment coder la saisonnalité pour vos projets, essayez ces méthodes, vous serez peut-être surpris de ce qui fonctionne !
Prochaines étapes et travaux futurs
Comme mentionné précédemment, l'un des principaux objectifs de nos équipes est d'aider l'équipe de souscription de Homebound à proposer des offres rapides, précises et équitables aux clients potentiels de Homebound. Fournir plus d'explicabilité dans les prédictions HVM est un moyen d'améliorer le partenariat entre nos équipes. Bien que l'incorporation des caractéristiques cycliques bidimensionnelles ait été excellente pour améliorer les performances du modèle, elle a quelque peu diminué l'interprétabilité du modèle.
L'équipe d'apprentissage automatique a notamment pu mieux comprendre les prédictions individuelles et les effets de la saisonnalité sur une prédiction grâce aux valeurs de Shapley . À l'avenir, fournir le même niveau d'interprétabilité aux prévisions HVM pour l'équipe de souscription pourrait également nous aider à itérer et à améliorer notre compréhension de la saisonnalité des prix des maisons sur différents marchés régionaux et à améliorer nos modèles.
Implémentation Python
Cette section se concentrera principalement sur la mise en œuvre des différentes fonctionnalités de saisonnalité décrites ci-dessus, en Python.
Nous commençons par importer les packages nécessaires pour créer un DataFrame Pandas factice contenant des dates au cours des trois dernières années (2019-2021) pour en extraire les caractéristiques de saisonnalité.
# 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 recrute ! Intéressé à travailler chez Homebound? Consultez notre page carrières !
Pour en savoir plus sur Homebound, visitez le site Web Homebound ou rendez-vous sur le blog Homebound Technology pour voir plus d'histoires de notre équipe.
Références
[1] Araj, Victoria. "Le meilleur moment de l'année pour acheter une maison." Rocket Mortgage , 1 nov. 2022,https://www.rocketmortgage.com/learn/best-time-of-year-to-buy-a-house.
[2] Bescond, Pierre-Louis. "Encodage des caractéristiques cycliques, il est temps !", Vers la science des données , 8 juin 2020,https://towardsdatascience.com/cyclical-features-encoding-its-about-time-ce23581845ca.
[3] Trémie. "Ai in Travel, Part 2: Représentation des caractéristiques cycliques et géographiques." Médium — La vie à Hopper , 27 avr. 2018,https:///life-at-hopper/ai-in-travel-part-2-representing-cyclic-and-geographic-features-4ada33dd0b22.