Construindo o Primeiro Algoritmo de Recomendação da Samwise
2024-10-09
Na Samwise, propusemo-nos a resolver um problema comum, mas complexo, no mundo imobiliário: ajudar os utilizadores a encontrar as propriedades mais relevantes de forma rápida e eficiente. Em vez de mostrar aos utilizadores uma lista bruta de propriedades baseada em filtros simples como preço e localização, queríamos oferecer algo muito mais inteligente — um algoritmo que classificasse as propriedades com base nas preferências do utilizador, dinâmicas previstas do mercado e atualidade. Esta é a história de como construímos o nosso primeiro algoritmo de recomendação do zero, os desafios que enfrentámos e as soluções que desenvolvemos ao longo do caminho.
O Problema Inicial
No início, a Samwise era simples: os utilizadores inseriam um preço máximo, número de quartos e localização. A nossa plataforma filtrava as listagens para mostrar propriedades que atendiam a esses critérios, mas faltava qualquer tipo de classificação inteligente. Isso levava a uma experiência subótima, onde os utilizadores não tinham uma indicação clara de quais propriedades eram as melhores correspondências para as suas necessidades.
Pretendíamos ir além da filtragem básica e criar um motor de recomendação que classificasse as propriedades com base em múltiplos fatores-chave:
- Preço Previsto: Qual deveria ser o preço de mercado da propriedade com base nas suas características.
- Preferências do Utilizador: Ajustar o preço com base em quão bem a propriedade se adequa aos desejos específicos do utilizador.
- Atualidade: Ter em conta há quanto tempo uma propriedade está listada e reduzir a sua classificação se não tiver sido vendida num prazo razoável.
- Impulso de Bom Negócio: Destacar propriedades que estão listadas abaixo do seu preço previsto para capturar potenciais "pechinchas".
Passo 1: Prever Preços de Propriedades
O primeiro passo importante foi estabelecer uma base com preços previstos para cada propriedade. Construímos um modelo de aprendizagem automática que considera características-chave de uma propriedade, incluindo:
- Localização: Desejabilidade do bairro, proximidade de comodidades
- Tamanho: Metros quadrados, número de quartos/casas de banho
- Condição e Comodidades: Recentemente renovado, tem varanda, lugar de estacionamento
Este modelo produz um preço de mercado previsto para cada listagem, dando-nos uma avaliação justa de mercado que serve como base do nosso sistema de classificação. Adicionalmente, aproveitamos o modelo CogVLM2 para processar imagens de propriedades, extraindo informações visuais valiosas que melhoram ainda mais a precisão da nossa previsão de preços. Esta combinação de análise de dados textuais e visuais permite-nos capturar detalhes subtis sobre a condição, estilo e valor percebido de uma propriedade que podem não ser evidentes apenas a partir de descrições textuais.
Passo 2: Adaptar Preços às Preferências do Utilizador
Nem todos os utilizadores valorizam as mesmas características de propriedade igualmente. Por exemplo, alguém à procura de uma casa familiar pode priorizar a proximidade de escolas e parques, enquanto outro utilizador pode preocupar-se mais em ter uma cozinha moderna ou uma vista. Esta personalização exigiu que desenvolvêssemos um mecanismo para ajustar o preço previsto com base nas preferências individuais de um utilizador.
Conseguimos isso usando Modelos de Linguagem Grande (LLMs) para processar as entradas dos utilizadores (como descrições da sua casa ideal) e traduzi-las num conjunto de etiquetas. Estas etiquetas eram então comparadas com as etiquetas associadas a cada propriedade, gerando uma pontuação de correspondência de preferência. Esta pontuação ajustava o preço previsto para cima ou para baixo dependendo de quão bem a propriedade correspondia à descrição ideal do utilizador.
PP_utilizador = preçoPrevisto × (1 + β(M_etiquetas - 1))
Onde:
- PP_utilizador é o preço previsto personalizado.
- M_etiquetas é uma pontuação de correspondência entre 0 e 2, onde 1 representa uma correspondência neutra.
- β é um parâmetro de ajuste que controla a força do ajuste de preferência.
Esta fórmula garante que uma correspondência perfeita (M_etiquetas = 2) aumenta o preço previsto, enquanto uma correspondência fraca (M_etiquetas < 1) o diminui. O parâmetro β permite-nos afinar o impacto das preferências do utilizador na classificação geral.
Passo 3: Considerar a Atualidade e Dinâmicas de Mercado
O próximo fator que considerámos foi a atualidade — há quanto tempo uma propriedade estava listada sem ser vendida. No mercado imobiliário, uma propriedade que permanece muito tempo no mercado geralmente indica uma discrepância entre o seu preço listado e o que os compradores estão dispostos a pagar. Precisávamos de uma forma de reduzir a classificação de propriedades que tinham sido listadas por um período prolongado, preservando o valor das listagens recentes.
Desenhámos uma curva de decaimento de atualidade que começa suave, refletindo a realidade de que as propriedades não se vendem imediatamente. No entanto, após um certo período, o decaimento acelera, sugerindo que o preço é provavelmente muito alto ou a propriedade é menos desejável. A nossa fórmula de decaimento é:
R = 1 / (1 + γ · [(1 / (1 + exp(-λ · (diasListados - τ))) - 0.5) · (1 + δ · log(1 + |preçoPrevisto - preçoListado| / preçoListado))])
Onde:
- γ controla o decaimento geral.
- λ ajusta a inclinação da curva de decaimento.
- τ define quando o decaimento se torna mais agressivo (ponto médio).
- δ afina o fator de diferença de preço.
Esta fórmula garante um impacto mínimo em listagens recentes, mas aplica um decaimento mais forte à medida que o tempo passa e as discrepâncias de preço se tornam mais evidentes.
Passo 4: Impulso de Bom Negócio
Uma das principais inovações no algoritmo da Samwise é o Impulso de Bom Negócio. Queríamos recompensar propriedades que estavam listadas a preços bem abaixo do seu valor de mercado previsto. Estas listagens subvalorizadas representam potenciais pechinchas, e precisávamos de uma forma de aumentar a sua visibilidade na classificação.
A fórmula para aplicar este impulso é:
Impulso = 1 + α · max(0, (preçoPrevisto - preçoListado) / preçoPrevisto)
Onde:
- α controla quão forte é o impulso (tipicamente entre 0 e 1).
- O impulso só é aplicado quando o preço listado está abaixo do preço previsto.
- O impulso aumenta linearmente com a diferença percentual entre os preços previstos e listados.
Este mecanismo garante que propriedades com uma diferença de preço substancial (por exemplo, uma propriedade listada por €150k mas prevista a €250k) recebam um impulso significativo, enquanto propriedades listadas ao ou acima do seu preço previsto não recebem impulso.
Passo 5: Juntar Tudo
Depois de trabalhar em cada um destes componentes, a fórmula de classificação final para a Samwise fica assim:
ClassificaçãoFinal = PP_utilizador × R × Impulso
Eis como tudo funciona em conjunto:
- Preço Previsto Personalizado (PP_utilizador) ajusta o preço previsto da propriedade com base em quão bem se adequa às preferências do utilizador.
- Multiplicador de Atualidade (R) aplica um decaimento baseado no tempo para refletir há quanto tempo a propriedade está listada.
- Impulso de Bom Negócio recompensa propriedades listadas significativamente abaixo do seu preço previsto.
Este sistema de classificação abrangente permite à Samwise apresentar aos utilizadores uma lista personalizada e atualizada de propriedades que não só correspondem às suas preferências, mas também representam um bom valor no mercado atual.
Ao combinar estes fatores, garantimos que:
- Os utilizadores veem propriedades que correspondem às suas necessidades e preferências específicas.
- As listagens recentes têm prioridade, mas não à custa de listagens mais antigas que ainda podem ser bons negócios.
- Propriedades potencialmente subvalorizadas são destacadas, dando aos utilizadores a oportunidade de encontrar ótimos negócios.
- A classificação geral se adapta às dinâmicas do mercado e às preferências individuais do utilizador.
A beleza deste algoritmo reside na sua flexibilidade e interpretabilidade. Cada componente tem um propósito claro e pode ser ajustado independentemente:
- O fator de personalização (β) controla quanto as preferências do utilizador influenciam a classificação.
- Os parâmetros de decaimento de atualidade (γ, λ, τ, δ) podem ser ajustados para refletir diferentes condições de mercado e ciclos de vida das listagens.
- O impulso de bom negócio (α) pode ser ajustado para enfatizar ou desenfatizar discrepâncias de preço.
Esta configuração flexível significa que podemos continuar a ajustar e melhorar o nosso algoritmo com base no que os utilizadores nos dizem e no que está a acontecer no mercado imobiliário. O nosso objetivo é simples: ajudá-lo a encontrar a casa dos seus sonhos sem complicações. Estamos sempre a trabalhar para tornar a Samwise mais inteligente para que possa ser o seu fiel companheiro na sua aventura de procura de casa!