Codificando a sazonalidade para melhorar nossos modelos de avaliação de propriedades

Nov 29 2022
Introdução Na Homebound, a equipe de Machine Learning & Pricing é responsável por desenvolver e manter um Modelo de Avaliação Automatizado (AVM) para prever com precisão o valor de uma propriedade. Apelidado aqui como Homebound Valuation Model (HVM), características como o tamanho de uma casa, vista da propriedade, proximidade de estradas principais e muito mais são usadas para estimar o preço de uma propriedade.
Uma propriedade Homebound em Santa Rosa!

Introdução

Na Homebound, a equipe de Machine Learning & Pricing é responsável por desenvolver e manter um Modelo de Avaliação Automatizado (AVM) para prever com precisão o valor de uma propriedade. Apelidado aqui como Homebound Valuation Model (HVM), características como o tamanho de uma casa, vista da propriedade, proximidade de estradas principais e muito mais são usadas para estimar o preço de uma propriedade. Isso permite que nossa equipe de subscrição avalie propriedades com rapidez e precisão para clientes que desejam vender suas casas por meio do Homebound Property Purchase Portal .

Nossa equipe está trabalhando continuamente para melhorar o HVM, projetando novos recursos, modificando a arquitetura do modelo e melhorando a qualidade dos dados. Uma característica que incorporamos recentemente em nossos modelos é a sazonalidade. A altura do ano em que decide comprar ou vender a sua casa pode ter um impacto no valor da sua propriedade. Dependendo da localização da casa, os preços tendem a ser mais altos durante os meses de primavera e verão e mais baixos durante o inverno. Embora nossos modelos iniciais capturassem ingenuamente alguns aspectos da sazonalidade por meio de recursos como a quantidade de tempo desde a última venda de uma casa, queríamos codificar explicitamente os aspectos da sazonalidade em nossos modelos.

Sazonalidade de Codificação

Tradicionalmente, o preço de listagem de uma casa depende de casas próximas, comparáveis ​​ou comparáveis ​​vendidas recentemente. Enquanto um vendedor listando sua casa pode não estar planejando quando está vendendo sua casa, um avaliador ou agente imobiliário considera a temporada no preço de listagem de sua casa. Para modelos de aprendizado de máquina, essa sazonalidade deve ser explicitamente incluída no modelo e pode ser feita de várias maneiras.

Por mês

A codificação da sazonalidade por meio do mês em que ocorreu um evento, ordinal ou categórico, é provavelmente a maneira mais comum e simples de extrair características sazonais. Na Homebound, este é o mês em que um imóvel foi colocado à venda. Embora seja fácil de implementar e interpretar, esse método muitas vezes carece do que queremos que o modelo entenda sobre sazonalidade. Por exemplo, se esses dados forem codificados one-hot, cada mês é considerado independente, enquanto na realidade sabemos que existe uma relação no tempo. Se esses dados forem ordinais, contabilizamos a similaridade entre meses como janeiro e fevereiro, enquanto distanciamos meses dissimilares como janeiro e junho, mas então nos deparamos com a questão de janeiro e dezembro como sendo representados como os meses menos semelhantes.

Figura 1: Representação linear da sazonalidade de codificação como feições mensais (categóricas e ordinais).

Em balde

Outra maneira de representar a sazonalidade é agrupar ou agrupar o tempo que pode ser relevante para o resultado que está sendo previsto. Por exemplo, agrupamos manualmente as datas da lista em duas formas potencialmente relevantes, trimestral e sazonalmente. Embora isso reduza a dimensionalidade e codifique manualmente os aspectos da sazonalidade percebida, os mesmos problemas discutidos acima persistem com as representações categóricas e ordinais desses grupos agrupados.

Figura 2: Representação linear da sazonalidade de codificação como grupos agrupados (trimestral e sazonal).

Cíclico

Embora as representações mensais e agrupadas do tempo ajudem a interpretar e representar a sazonalidade como recursos do modelo, elas lutam para capturar a natureza cíclica do tempo e das estações. Uma maneira alternativa de capturar esse ciclo sazonal é transformar datas em um ano em um espaço bidimensional, seno e cosseno. Isso é feito normalizando o dia numérico do ano para um valor entre 0 e 1, transformando esses valores entre os intervalos de seno e cosseno de 0 e 2π e, em seguida, obtendo o seno e o cosseno desses valores (lembre-se do círculo unitário da trigonometria ). Cada dia do ano é então representado por um par único de valores de seno e cosseno que forma um círculo, conforme mostrado na figura abaixo.

Figura 3: Representação cíclica do tempo onde cada dia do ano é representado por um único par de valores de seno e cosseno. Pontos mais próximos no tempo são mais visualmente (gradiente de cores) e numericamente semelhantes.

Uma desvantagem dessa metodologia é a falta de interpretabilidade. Ter dois recursos representando o tempo torna mais difícil decifrar a importância do recurso e seu efeito geral na variável de resultado. Além disso, alguns modelos, como métodos baseados em árvore, podem ter problemas para criar divisões úteis em dois recursos que representam um elemento, a sazonalidade. Uma possível solução para esse problema é criar um recurso cíclico unidimensional semelhante que é interpretado como N dias a partir de um ponto específico escolhido no tempo. Isso é o equivalente a representar o tempo apenas como a representação de cosseno normalizada do tempo de cima, onde cada dia está a N dias de 1º de janeiro até N convergir em julho. No entanto, isso faz com que duas épocas diferentes do ano sejam representadas pelo mesmo valor.

Figura 4: Representação cíclica do tempo em que dois dias do ano são representados por um único valor de cosseno. Cada valor de cosseno é representativo de N dias a partir de 1º de janeiro, até que os valores converjam em julho. Pontos mais próximos no tempo são mais visualmente (gradiente de cores) e numericamente semelhantes.

Em última análise, não existe uma maneira “certa” de codificar a sazonalidade. Cada um desses métodos tem seus prós e contras com base no problema em questão, nos requisitos de negócios e no modelo escolhido. Portanto, a única maneira de avaliar de forma justa qual método era o melhor para o HVM era por meio da experimentação.

Avaliando experimentos

Para determinar a melhor forma de representar a sazonalidade no HVM, realizamos experimentos para determinar o recurso que minimizou o erro, conforme definido pelo erro médio de precisão média (MAPE) e, por fim, forneceu o maior aumento na precisão do modelo. Na Homebound, usamos o mlflow para rastrear experimentos, armazenar detalhes do modelo e avaliar as principais métricas em diferentes regiões. A tabela abaixo contém informações sobre os experimentos de sazonalidade executados.

Tabela 1: Resultados do aumento do modelo para cada representação de recurso de sazonalidade discutida

Dado que as codificações de recursos cíclicos são geralmente usadas em modelos não baseados em árvore, geralmente em modelos de aprendizado profundo, ficamos surpresos ao ver que isso nos deu o maior aumento no desempenho do modelo. O HVM é um conjunto de métodos baseados em árvore e, portanto, não tínhamos certeza sobre sua capacidade de captar a sazonalidade dos preços das residências a partir de um espaço de recursos bidimensionais.

Se você não tiver certeza sobre como codificar sazonalidade para seus projetos, experimente esses métodos, você pode se surpreender com o que funciona!

Próximas etapas e trabalho futuro

Conforme mencionado anteriormente, um dos principais objetivos de nossa equipe é ajudar a equipe de subscrição da Homebound a fazer ofertas rápidas, precisas e justas para clientes potenciais da Homebound. Fornecer mais explicabilidade às previsões de HVM é uma maneira de melhorar a parceria entre nossas equipes. Embora a incorporação dos recursos cíclicos bidimensionais tenha sido ótima para aumentar o desempenho do modelo, ela diminuiu um pouco a interpretabilidade do modelo.

Uma maneira pela qual a equipe de aprendizado de máquina tem obtido informações sobre previsões individuais e os efeitos da sazonalidade em uma previsão é por meio dos valores de Shapley . No futuro, fornecer o mesmo nível de interpretabilidade para as previsões HVM para a equipe de subscrição também pode nos ajudar a iterar e melhorar nossa compreensão da sazonalidade dos preços das residências em diferentes mercados regionais e melhorar nossos modelos.

Implementação do Python

Esta seção se concentrará principalmente na implementação dos diferentes recursos de sazonalidade discutidos acima, em Python.

Começamos importando os pacotes necessários para criar um Pandas DataFrame fictício contendo datas nos últimos três anos (2019–2021) para extrair recursos de sazonalidade.

# 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)

Tabela 2: Exemplo de linhas de feições de sazonalidade extraídas do primeiro dia de cada mês em 2021.

Homebound está contratando! Interessado em trabalhar na Homebound? Confira nossa página de carreiras !

Para saber mais sobre a Homebound, visite o site da Homebound ou acesse o Homebound Technology Blog para ver mais histórias de nossa equipe.

Referências

[1] Araj, Vitória. “A melhor época do ano para comprar uma casa.” Hipoteca Rocket , 1 de novembro de 2022,https://www.rocketmortgage.com/learn/best-time-of-year-to-buy-a-house.

[2] Bescond, Pierre-Louis. “Codificação de recursos cíclicos, já era hora!”, Towards Data Science , 8 de junho de 2020,https://towardsdatascience.com/cyclical-features-encoding-its-about-time-ce23581845ca.

[3] Funil. “Ai em viagens, parte 2: representando características cíclicas e geográficas.” Medium - Life at Hopper , 27 de abril de 2018,https:///life-at-hopper/ai-in-travel-part-2-representing-cyclic-and-geographic-features-4ada33dd0b22.