• Michel

Recomendação de Preços para Residências

Usando Machine Learning é possível determinar preços de imóveis, carros usados,

e uma infinidade de produtos, baseando-se não em duas ou três variáveis, como por exemplo, a marca o ano e a quilometragem de um automóvel, mas dezenas ou centenas de variáveis, como estado da pintura, pneus, acessórios, localização, cor, número de proprietários, personalizações, etc.

Neste artigo apresentamos um modelo de Machine Learning para avaliação de imóveis baseada em cerca de 80 variáveis, já usado de maneira extensiva no mercado imobiliário. Os dados são fornecidos por uma companhia imobiliária americana e serviram para uma competição entre Cientistas de Dados.

Competições em Machine Learning

Como na maioria das ciências aplicadas, a melhor maneira de aprender Machine Learning é trabalhar com problemas reais e tentar resolvê-los.

Existem alguns sites de Competiçoes em Machine Learning, dos quais o mais famoso é o Kaggle, recentemente adquirido pelo Google.

O Kaggle é uma plataforma em que cientistas de dados competem para produzir os melhores modelos para problemas reais enviados por enviados por empresas. Essa abordagem de crowdsourcing se baseia no fato de que existem inúmeras estratégias que podem ser aplicadas a qualquer tarefa de modelagem preditiva e é impossível saber de antemão qual delas será mais eficaz.

O Kaggle já realizou mais de 200 competições distribuindo prêmios para os vencedores que chegam a 1 milhão de dólares. As competições resultaram em muitos projetos de sucesso, incluindo o avanço do estado da arte na pesquisa do HIV, identificação de imagens e previsão de tráfego.

Através do Kaggle algoritmos de grande sucesso como o Xgboost e o Keras são amplamente utilizados e as soluções comentadas.

Em maio de 2016, o Kaggle tinha mais de 536.000 usuários registrados, ou Kagglers em 194 países. É a maior e mais diversificada comunidade de cientistas de dados do mundo. Uma posição de destaque em competições representa grande prestígio na comunidade e no mercado.

Na minha opinião a maior virtude do Kaggle é patrocinar a troca de ideias e soluções para um dado problema ou um algoritmo entre os cientistas de dados. É claro que os prêmios são tentadores, mas vencer, ou chegar próximo, geralmente requer além do profundo conhecimento em Machine Learning, a disponibilidade de grande potência computacional e o trabalho em equipes.

Descrição da Competição

Quando um comprador descreve a casa dos seus sonhos, ele provavelmente não começará com a altura do teto do garagem ou o tipo de telhado. O conjunto de dados desta competição prova que existem muitos outros fatores que influenciam as negociações de preço.

Com 79 variáveis ​​independentes descrevendo (quase) todos os aspectos de casas residenciais em Ames, Iowa, esta competição desafia você a prever o preço final de cada casa.

Se você tem alguma experiência com R ou Python e noções básicas de aprendizado de máquina, esta é uma competição perfeita para estudantes de ciência de dados que concluíram um curso on-line de aprendizado de máquina e desejam expandir seu conjunto de habilidades.

A competição está em https://www.kaggle.com/c/house-prices-advanced-regression-techniques.

Como desenvolvi a solução

Neste trabalho utilizei os seguintes recursos técnicos:

  • Imputação de valores ausentes (missing values)

  • Transformação de algumas variáveis numéricas que parecem ser realmente categóricas

  • Codificação de algumas variáveis categóricas que podem conter informações em sua ordenação (label encoding)

  • Transformação Box Cox para as variáveis numéricas com elevado skew

  • Geração de variáveis dummy para as variáveis categóricas

  • Modelos Gradient Boost Regressor, XGBoost do Sklearn e LightGBM da Microsoft

  • Ensemble

Meu resultado final está nos 4% melhores de um total de 11.387 concorrentes.


Pré-requisisos

Este artigo não é um tutorial de Machine Learning nem do Python.

Como pré-requisitos você deve saber o que é uma Análise Exploratória de Dados, programação em Python, ScikitLearn e ter os conceitos centrais de algoritmos de Machine Leaning.


Dados do problema


Uma variável target e 79 atributos das casas



O Fluxo do processo


Coleta de Dados


A documentação informa a existência de outliers. Vamos explorar esses valores atípicos no train set. Podemos ver na parte inferior direita dois outliers com GrLivArea extremamente grande e de um baixo preço.


Esses valores são oultliers. Portanto, podemos com segurança, excluí-los.

Análise da variável target




A variável target é bem distorcida. Precisamos transformar essa variável e torná-la mais normalmente distribuída. Para isso usamos a função np.log1p

A inclinação (skew) parece agora corrigida pois os dados estão mais normalmente distribuídos.



Correlações

À primeira vista, há dois quadrados coloridos vermelhos que chamam a atenção. O primeiro deles refere-se às variáveis 'TotalBsmtSF' e '1stFlrSF', e o segundo refere-se às variáveis 'GarageX'. Ambos os casos mostram significativa correlação entre essas variáveis. Na verdade, esta correlação é tão forte que pode indicar uma situação de multicolinearidade. Se pensarmos sobre essas variáveis, podemos concluir que elas dão quase a mesma informação.

Gráficos entre variáveis correlacionadas com 'SalePrice'



Features Engineering

Atributos desnecessários

Temos muitos atributos.Vamos usar modelos de regressão linear regularizados para classificá-los por importância.


Usamos a regularização tanto L1(Lasso). Também definiremos uma função que retorna o erro de validação cruzada rmse, para que possamos avaliar nossos modelos.


L1(Lasso)

O parâmetro de ajuste principal para o modelo Lasso é alfa - um parâmetro de regularização que mede a flexibilidade do nosso modelo. Quanto maior a regularização, menos propenso nosso modelo será para overfiting, entretanto ele perde a flexibilidade e pode não capturar todos os sinais presentes nos dados.

O valor do erro parece razoável, e vemos que os coeficientes mais importantes são:



Missing Values

Concatenamos (juntamos) os sets de treinamento e teste, e verificamos se existem missing values.



Substitução de missing values (valores faltantes)

Os missing values são preenchidos de acordo com os critérios abaixo:

MiscFeature : NA ="no misc feature"

Alley : NA = "no alley access"

Fence : NA ="no fence"

FireplaceQu : NA = "no fireplace"

LotFrontage : Supondo que casas na mesma rua terão áreas semelhante a outras casas em sua vizinhança, podemos preencher os valores ausentes, com a mediana de LotFrontage do bairro.

GarageType, GarageFinish, GarageQual e GarageCond : Substituímos por missing values por ‘None’

GarageYrBlt, GarageArea e GarageCars : Substituímos por missing values por 0

BsmtFinSF1, BsmtFinSF2, BsmtUnfSF, TotalBsmtSF, BsmtFullBath e BsmtHalfBath : valores ausentes são provávemente zero por nãio ter bsmt.

BsmtQual, BsmtCond, BsmtExposure, BsmtFinType1 e BsmtFinType2 : Para todos estes atributos categóricos, NaN significa que não há nenhum bsmt.

MasVnrArea e MasVnrType : NA provavelmente significa não haver este atributo (alvenaria) para estas casas. Colocamos 0 para a área e ‘None’ para o tipo.

MSZoning (The general zoning classification) : 'RL' é, de longe, o valor mais comum. Então podemos preencher valores ausentes com 'RL'

Utilities : Para este atributo categórico todos os registros são "AllPub", com exceção de um "NoSeWa" e 2 NA’s. Podemos então com remove-lo segurança.

Functional : NA = typical

Electrical : Só tem um NA. Substituímos pelo valor mais comum 'SBrkr‘.

KitchenQual: Só tem um NA. Substituímos pelo valor mais comum 'TA.

Exterior1st e Exterior2nd : Ambos só tem um NA. Substituímos pelo valor mais comum.

SaleType: Substituímos Os NA’s pelo valor mais comum ‘WD’.

"WD"

MSSubClass: NA provavelmente significa não haver este atributo para estas casas. Colocamos ‘None’.

Isso é efetuado usando o código abaixo:

Transformando algumas variáveis numéricas que são realmente categóricas


Label Encoding para algumas variáveis categóricas que podem conter informações em sua ordenação


Adicionamos um atributo que é a soma de todas as áreas construídas da casa.



Transformação Box Cox

Para reduzir o skew das variáveis contínuas usamos a função boxcox1p de scipy que calcula a transformação de Box Cox de 1 + x.

Observe que essa configuração é equivalente λ = 0 na transformação log1p usada acima para a variável target.


Gerando variáveis dummy para os atributos categóricos


Importando as bibliotecas do sklearn


Definindo uma estratégia de validação

Usamos a função cross_val_score do Sklearn


Usamos três modelos:

GBRegressor, XGBoost e LightGBM e obtemos o score para cada um deles.




Finalmente combinamos os três modelos.


Ainda como um último passo, fiz algumas simulações no Excel procurando combinar os três modelos de forma ponderada e ir reduzindo o desvio padrão da combinação. O modelo final obteve um rmse de 0,11519 que ficou em 193º num total de 5.273 competidores.


3 Dimensões

Inteligência Artificial nas Empresas

Al. das Papoulas, 147 - Santana de Parnaíba - Alphaville, SP 06539-180 - (11) 4153 6004  - (11) 9 9795 9765

michel@3dimensoes.com.br