por Guilherme Duarte e Jonathan Carvalho, Data Scientists na Datarisk.io

Neste post falaremos sobre um projeto que foi desenvolvido na DataRisk, um score de crédito baseado em imagens da casa ou do comércio do cliente, utilizando fotos do Google Street View e do Google Satélite além das tradicionais informações utilizadas em modelos de risco de crédito. Ao longo do projeto, usamos diversas técnicas comuns em um projeto de data science, como uso de APIs, construção de um modelo usando uma rede neural, extração de variáveis e PCA, por exemplo. Sem mais delongas, vamos ao post.

Motivação

Antes das técnicas de machine learning se popularizarem, já era muito comum empresas de crédito ou bancos terem seus próprios modelos estatísticos de concessão de crédito, de risco de crédito, de propensão, etc. Frequentemente, uma das variáveis desses modelos era uma pontuação dada por um agente de crédito especializado que atribuía uma nota ao cliente baseado em uma visita a casa desta pessoa, onde o agente avaliava diversos aspectos dessa moradia, como os móveis do indivíduo, a região e a própria casa deste cliente, além da própria entrevista com os moradores. Muitos comentavam que mesmo dentro de residências de uma mesma faixa de renda era possível observar detalhes de organização e padrões de consumo que ajudavam a traçar um perfil do cliente.

Com a massificação da análise de crédito e a modernização dos algoritmos, esse tipo de avaliação foi sendo deixado de lado, afinal, é mais barato investir em um time de modelagem especializado do que em um batalhão de agentes para fazer todas as visitas necessárias. Acontece que em diversos casos, esta variável se apresentava como uma das mais importantes do modelo. Ou seja, existem indícios de que características da casa de uma pessoa podem ajudar um modelo a responder questões referente a crédito ou renda dessa pessoa.

Dito isso, parece natural tentarmos usar a tecnologia e os dados disponíveis na internet para conseguir fotos da frente e da região da casa de uma pessoa para treinar um modelo de machine learning que tente fazer esse papel que antes era feito pelos agentes.

O problema

No nosso caso, falaremos aqui sobre um modelo de risco de crédito, onde a variável resposta era se o cliente atrasou ou não um pagamento por mais de 60 dias. Tínhamos uma base de dados tradicional para esse tipo de modelo, com dados cadastrais do cliente e outras informações que podem ser conseguidas em bancos de dados públicos. Entretanto, muitas variáveis tinham valores faltantes. Apesar do modelo estar bom o suficiente para ser utilizado, ainda podia ser melhorado. Então surgiu a ideia de usar o endereço cadastrado para pegar dados da região do cliente, e assim enriquecer mais o modelo. Podíamos pegar imagens que existem na internet e adicioná-las ao modelo.

Entretanto isso não é um problema trivial. Hoje em dia temos várias classes de algoritmos de machine learning, mas para alguns tipos de problemas temos o que chamamos de algoritmos estado da arte, que costumam dominar os outros em questão de performance. Para dados estruturados em formato de tabela, os algoritmos de ensemble e boosting costumam ser os mais usados (já falamos deles nessa série de posts). Já para dados não estruturados, como imagens, texto e áudio, as redes neurais artificiais tem se destacado nos últimos anos. Portanto teríamos que combinar dois algoritmos bem diferentes se quiséssemos o melhor resultado. Não é trivial, mas também não é impossível.

Obtenção das imagens

Para a obtenção das imagens, usamos uma API do Google Maps. Nela, passamos um endereço como parâmetro, e a API retornava uma imagem referente àquele endereço. Na API, tínhamos a opção de escolher usar a imagem de satélite do local e a imagem do street view. Como do street view poderíamos definir pegar toda a visão panorâmica do endereço resolvemos pegar apenas a primeira foto sem passar qualquer parâmetro de ângulo. Assim, mesmo que não pegássemos a casa em si, teríamos uma ideia da região, o que era suficiente. Então, para cada endereço, temos duas imagens da região, uma vista de cima e outra vista de frente.

Como a base tinha cerca de 30 mil registros, o que ainda é bem pouco para o treinamento de uma rede convolucional, totalizando cerca de 60 mil imagens, fizemos uso de um script para o download das imagens na maior resolução possível (640×640).

Pré-processamento das imagens

Antes da fase de construção dos modelos, foram feitas manipulações nas imagens. Foi feito um rescaling, para diminuição das imagens, o que também diminui a memória e o tempo de treinamento das redes neurais. Além disso, foram testadas técnicas de remoção de ruído, realce de contrastes, segmentação em superpixels, mudança do espaço de cores, etc.

Devemos lembrar que o paradigma 80/20 da ciência de dados ainda vale aqui. Isto é, normalmente em um projeto nessa área, passamos 80% do tempo no pré-processamento, limpando dados, selecionando variáveis, criando variáveis, analisando correlações, etc, e 20% na construção do modelo. Imagens não tem variáveis convencionais, mas é possível destacar pontos de interesse e remover componentes que podem confundir o modelo. Nesse projeto, apesar de não termos dedicado 20% do tempo apenas na construção dos modelos, isso basicamente significa que para termos um modelo com boa performance no final, não basta usar o algoritmo que todos estão usando, e sim ter um bom conjunto de dados para alimentar esse modelo.

Construção das redes

Após o download das imagens, dividimos o projeto na construção de dois modelos. O primeiro usava as imagens do street view para estimar a variável resposta, enquanto o segundo usava as imagens de satélite. Para ambos, escolhemos usar Redes Neurais Convolucionais, que são o estado da arte no que diz respeito a técnicas de machine learning em visão computacional. Caso queira uma introdução a esse tipo de modelo, recomendamos esse post.

A partir dessa fase, foi feita uma bateria de testes usando diversas imagens, arquiteturas, funções de perdas e outras técnicas diferentes. Para citar algumas delas, testamos redes pré-treinadas como a GoogleNet, a VGG19, e a ResNet50; técnicas de augmentation nas imagens (geração de imagens semelhantes às originais, com algumas diferenças de rotação ou borramento, por exemplo); redes multi-task, que estimam mais de um target ao mesmo tempo; redes adaptadas de segmentação já usadas em tarefas com imagens de satélite, etc.

No final, para o modelo usando as imagens de satélite, foi usada uma adaptação da rede de detecção de objetos YOLOv3. A inicialização de pesos foi feita usando um arquivo com estes parâmetros que foram obtidos de uma rede pré-treinada. Para as camadas finais, fizemos alguns ajustes para que a rede se transformasse em uma rede de classificação binária, isto é, com dois neurônios na última camada, cada um com a probabilidade de uma casa (e consequentemente uma pessoa) pertencer a uma das duas classes (isto é, se a casa é de uma pessoa inadimplente ou não).

Já para o modelo com as imagens de street view usamos a arquitetura ResNet adaptada para repetir algumas camadas intermediárias, a fim de reforçar certos padrões das imagens e para multi-task, prevendo algumas variáveis cadastrais do cliente, além da variável resposta.

Mesmo com todas as técnicas testadas, ainda sim não tivemos boas performances. Uma das hipóteses para a falha do modelo em estimar o risco de crédito é que talvez não tínhamos imagens suficientes para que as redes reconhecessem padrões claros nas imagens. Além disso, redes convolucionais são boas para classificar elementos das imagens. Estávamos tentando diferenciar uma casa de um cliente inadimplente de uma casa de um cliente que é um bom pagador, que já não é uma relação clara mesmo para um humano. Portanto, nosso conjunto de dados e nossa variável resposta não eram os ideais para alimentar uma rede deste tipo.

Dessa maneira, tentamos outra abordagem. Ao invés de usar somente as imagens para estimar essa variável resposta, decidimos extrair os valores das camadas anteriores da rede como variáveis e usá-los no modelo original. Basicamente estamos usando as redes para decompor a imagem em valores numéricos que podem ser lidos por um modelo mais simples. Mas não é uma simples conversão de imagem para números, a própria rede precisa de números para ser treinada e fazemos isso convertendo os pixels da imagem para quantidades de cada cor. Estamos convertendo também possíveis características das fotos que a rede neural pode ter relacionado a variável resposta.

Para aqueles familiarizados com o conceito de stacking, é uma abordagem bem similar. Porém, ao invés de usarmos o output das classificação das redes para usar como variáveis de um modelo final, usamos valores dos neurônios das últimas camadas.

Vale ressaltar que algumas técnicas obtiveram resultados similares ao que decidimos utilizar no modelo final. Portanto, é recomendável testar em mais casos qual funciona melhor.

Modelo final

Em suma, utilizando a abordagem acima, geramos 150 variáveis para as imagens de satélite, e 256 variáveis para as imagens do street view oriundas da penúltima camada das redes.

Foi usado PCA nessas variáveis, com o objetivo de reduzir dimensionalidade, mantendo a maior variância possível dessas features.

Essas variáveis foram unidas a uma base contendo informações cadastrais e então passadas por um XGBoost, onde a variável resposta era a mesma das redes neurais.

Esquematizando:

Aqui chegamos a um resultado interessante, onde o modelo com as variáveis das imagens teve um ganho de 4% em relação ao score do modelo usando apenas os dados cadastrais, o que já é um resultado muito bom.

Conclusão

Ainda serão feitos mais testes com bases maiores, de modo a consolidar o que foi feito nesse projeto. Porém, já temos bons indícios de que podemos criar um produto que extraia informação útil das fotos das casas das pessoas para melhorar ou até mesmo compor por si mesmo, um score de mercado útil.

Além disso, uma lição muito importante desse projeto é o quanto a criatividade é uma skill importante no universo de ciência de dados. Existem diversas formas de resolver um problema, e pensar em soluções novas para determinadas barreiras é bem útil em qualquer situação.

Por enquanto, é isso. Esperamos que tenha ficado claro a intuição por trás do desenvolvimento do projeto, e talvez tenha dado alguns insights de como é possível chegar a um objetivo ou resolver uma tarefa no contexto de ciência de dados.

Agradecemos a atenção e até a próxima!