Avito Demand Prediction Challenge

Lu Brito
12 min readOct 1, 2018

INTRODUÇÃO

O AVITO é o maior site de classificados de toda a Rússia. Apresenta em seus anúncios um subconjunto das seguintes características, observadas em seu site: Identificação do produto pelo nome, preço, cidade de origem do produto, data de carregamento do anúncio, horário de carregamento do anúncio, nome da empresa.

Figura 1: Conteúdo típico de um anúncio Avito. Fonte: https://www.avito.ru/rossiya/gruzoviki_i_spetstehnika?s_trg=10. Disponível em 01/10/2018.

A empresa disponibilizou pela 4ª vez o seu dataset para um desafio da Kaggle, desta vez chamado “Avito Demand Prediction Challenge — Predict demand for an online classified ad”. E eu, participei pela primeira vez de um desafio de data science com premiação! Bem, mesmo sendo iniciante, afirmo que a minha maturidade no lidar com os dados aumentou muito com essa experiência. Conto na sequência quais foram os passos que segui para alcançar o meu resultado — não tão expressivo para o desafio — mas bastante significativo para uma iniciante:)

As descrições das colunas podem ser encontradas no Anexo 1 a este relatório. O desafio consistiu em prever a demanda por um anúncio on-line com base em sua descrição completa (título, descrição, imagens etc.), seu contexto (geograficamente onde foi postado, anúncios similares já publicados) e demanda histórica para anúncios semelhantes em contextos semelhantes.

Para isso pretendeu-se trabalhar com foco na otimização de resultados na utilização dos algoritmos, ou seja, queríamos produzir um modelo de machine learning com o melhor desempenho possível, que nos fornecesse, então, a melhor predição da saída desejada.

Neste estudo, a saída desejada era formada pela matriz (user_id, deal_probability) em que as submissões são pontuadas através do cálculo do desvio médio quadrático, definido como na equação a seguir, onde y chapéu é o valor predito e y é o valor original.

REFERENCIAL TEÓRICO

O aprendizado de máquina se refere ao uso de modelos que são aprendidos a partir dos dados [também] pode ser chamado de modelo preditivo ou mineração de dados. Os modelos preditivos se dividem em sua grande parte em supervisionados, não supervisionados, semi supervisionados e online [1].

Para a condução do trabalho foi feito um levantamento de informações sobre práticas de Data Science que têm sido utilizadas por outros competidores. Nesta pesquisa, destacaram-se os trabalhos de Stevens, C [2][3], Moreira, G [4] e Lathwal.

Stevens, C destacou-se pela publicação do seu procedimento experimental para o desafio Avito Demand Prediction na revista eletrônica Medium, onde ensina que “ter uma boa compreensão de como os usuários estão criando os dados que […] usará é imprescindível para o design do seu algoritmo [sendo também] importante baixar o dataset para o seu PC a fim de garantir maior interatividade com os dados [E mais:] iniciar a pesquisa com um análise de dados exploratória pode trazer importantes insights na hora de escolher qual modelo implementar”.

Lathwal, em seu notebook desafio destaca também a importância das análises estatísticas nas etapas iniciais da da Extração de Conhecimento em Datasets (KDD) com a finalidade de entender o comportamento das features, utilizando bibliotecas de visualização de dados para mostrar o resultado de suas análises.

Stevens, C ainda comenta em [2], acerca da importância de fazer uma engenharia de feature para que a partir dos dataset, se possa perceber quais são as features que melhor se encaixariam no problema que estava sendo proposto.

Moreira, G, em [4] aborda as etapas do KDD, destacando as etapas de pré-processamento, engenharia de features, aplicação do modelo, apresentação dos resultados e tuning de parametrização como etapas que devem ser observadas por qualquer cientista de dados.

PERGUNTA DE PESQUISA

Para uma melhor condução da pesquisa, criamos uma pergunta, tendo como meta respondê-la ao chegarmos aos resultados:

Considerando os dados de um anúncio do site Avito, qual a probabilidade dele ser efetivo e ter sua negociação concretizada?

MÉTODO

A) O dataset

O dataset era composto por atributos numéricos, atributos categóricos, atributos temporais e de atributos de texto-livre. O número de linhas nas tabelas disponibilizadas eram 1.503.523 para a tabela de treinamento (train.csv) e 508.547 para a tabela de teste (test.csv) contra 18 colunas de dados estruturados, que incluíam as características (features) que poderiam ser utilizadas para a resolução do desafio.

Havia também tabelas de treinamento e teste para os dados de imagem dos produtos. Outras informações sobre o dataset encontram-se no ANEXO 1. Os dados de imagem não foram utilizados nesta primeira abordagem do problema. Os dados disponibilizados são referentes a anúncios da AVITO para o intervalo entre os dias 15/03/2017 e 28/03/2017.

B) Knowledge discovery in databases (KDD)

B.1) Ferramentas utilizadas

Foram utilizados o notebook Jupyter no kernel da competição e a linguagem Python, com auxílio das bibliotecas Math, Pandas, Numpy, Matplotlib e Sklearn.

B.2) Etapas do KDD

B.2.1) Pré processamento/Data munging

ANÁLISE EXPLORATÓRIA DO DATASET

O primeiro passo para exploração do dataset foi baixar o arquivo e visualizá-lo fazendo uso de um leitor de arquivos no formato csv. Com isso, informações importantes sobre as colunas do dataset puderam ser levantadas:

i. A coluna item_id parecia conter valores únicos e deveria se tratar de um identificador único de cada uma das linhas. Isso indicaria que esta coluna provavelmente não poderia ser usada nos modelos preditivos.

ii. A coluna user_id possuia um comportamento similar ao item_id, porém ao analisá-la juntamente com a coluna item_seq_number, supôs-se que poderia haver valores iguais de user_id, uma vez que um usuário poderia ter mais de um anúncio publicado no site. Ao que tudo indicou, essa coluna também não seria útil para o modelo.

iii. item_seq_number parecia representar o número ordinal do anúncio publicado por um usuário. Esta coluna poderia ser útil para sinalizar comportamentos do tipo “o primeiro anúncio que um usuário publica tem maior chance de ser vendido que os seus anúncios posteriores”.

iv. price dizia o preço de venda dos anúncios. Poderia ser uma coluna chave para a construção do modelo.

v. category_name era a categoria específica do anúncio. Por ser discreta, ela poderia ser de grande ajuda na performance do modelo.

vi. parent_category_name era uma categoria mais genérica do anúncio. Seus valores parecem variar menos que a category_name.

vii. A coluna city descrevia a cidade de cada um dos anúncios. Como o número de cidade de um país é finito e pode ser enumerado, esta também poderia ser uma coluna importante para a construção de um modelo eficiente.

viii. A coluna region informava a região da Rússia onde o anúncio foi publicado. Parecia ter um número bem pequeno de opções.

ix. user_type indicava a natureza do usuário que estava publicando o anúncio. A coluna tinha três valores possíveis: Private, Shop e Company.

x. title definia o título do anúncio, que era a fonte primária de informação textual do anúncio.

xi. Description continha informações detalhadas a respeito do anúncio.

xii. A data em que o anúncio foi criado era armazenada na coluna activation_date, no formato americano yyyy-mm-dd. Por não se tratar de um dado essencialmente numérico, seria necessário tratar essa coluna antes de utilizá-la.

xiii. A coluna deal_probability representava a chance de um anúncio se transformar em uma negociação concretizada. Contudo, não ficou tão claro o critério usado pela Avito para definir o valor desta coluna.

xiv. A coluna image armazenava o código da imagem do anúncio. Nem todos os anúncios possuíam imagens, o que poderia ser um bom indicador de probabilidade de venda.

xv. image_top_1 armazenava um código de classificação da imagem atribuído pela própria AVITO.

ENGENHARIA DE FEATURE

i. Separou-se os campos de ano, mês e dia para obter-se números. Foi feita a transformação da data para dados numéricos e criação de novas colunas no dataframe.

ii. Preenchimento dos valores vazios nas colunas com zero para evitar erros do tipo NAN.

iii. Converteu-se as colunas de classes discretas para valores inteiros, para que pudessem ser utilizados em quaisquer algoritmos.

iv. Transformou-se os valores da coluna image, atribuindo-se zero para linhas sem código de imagem e 1 para colunas que possuem código de imagem.

v. Separou-se os grupos de treinamento e de teste, na proporção 70%/30% para utilização na etapa de treinamento do algoritmo.

B.2.2) Escolha do modelo de aprendizagem

Utilizou-se um modelo de Regressão Linear com o objetivo de predizer qual a probabilidade de, considerando os dados de um anúncio no site Avito, esse anúncio ser efetivo e ter sua negociação concretizada.

O problema pareceu se encaixar no modelo de regressão à medida que apresenta variáveis de entrada (colunas do dataset) selecionadas com o objetivo de fornecer como variável de saída um um valor que representasse o melhor ajuste percentual de uma reta para determinados pontos dados. Nesta competição, o melhor ajuste era representado pelo resultado que minimizava o erro quadrático.

O valor que representava o melhor ajuste percentual é o deal_probability. Então, quanto melhor fosse a performance do algoritmo utilizado, mais próximos os valores de saída estariam do deal_probability. Os valores de saída, neste estudo foram calculados através do script que se encontram no meu Github.

Figura 2: Etapas do modelo de aprendizagem com cálculo do deal_probability e do desvio médio quadrático.

A Figura 2 mostra as etapas do modelo que foi implementado neste estudo. As variáveis X e Y do dataset de treinamento representam, respectivamente, as features escolhidas e os valores de deal probability do conjunto de treinamento. Aplica-se à X e Y o método FIT e obtendo-se como saída os valores de a e b, intercept e slope, respectivamente. Esta é a etapa de aprendizagem do algoritmo de regressão. A partir da equação da curva que melhor descreve o conjunto de pontos dados na etapa de treinamento, o modelo, a partir da entrada da variável X do dataset de teste, é capaz de predizer os valores de Y de teste associados (deal probability do conjunto de teste). Os valores preditos são, então, submetidos na plataforma do desafio, que retorna o valor do desvio quadrático médio entre eles e os valores de deal probability observados pelo cliente (AVITO). A plataforma retorna também a posição do participante no desafio, com relação aos outros concorrentes.

B.2.3) Implementação do modelo de Regressão Linear

  • Escolheu-se as features que seriam utilizadas na análise, a partir das features originárias do dataset e as obtidas na etapa de pré-processamento. As features escolhidas foram: price, item_seq_number, image_top_1, category_name, parent_category_name, city, region, image, length_description, length_title, words_description, words_title, percent_capital_description e percent_capital_title. As colunas que não foram utilizadas foram as: item_id, user_id, param_1, param_2, param_3, activation_date e user_type.
  • Atribuiu-se asfeatures que foram escolhidas à variáveis de treinamento e teste.
  • Atribuiu-se os targets (deal_probability) para o treinamento do modelo.
  • Instanciou-se o modelo de regressão linear.
  • Treinou-se o modelo.
  • Fez-se predições a partir do modelo para os dados contidos no arquivo test.csv.
  • Predições com valores abaixo de zero (raríssimas exceções) foram transformadas em zero.

B.2.4) Submissão dos resultados

A submissão dos resultados se deu através da transformação do dataframe em arquivo csv e submissão do resultado da regressão. Também gravamos um vídeo de apresentação no youtube com a intenção de facilitar o entendimento do passo a passo.

Vídeo 1: Resumo do processo de data mining. feito por mim, para a disciplina de Data Science do mestrado.

B.2.5) Observação do resultado no ranking do Kaggle e tunning de parametrização.

Esta etapa se iniciou com a observação dos resultados e comparação destes com os resultados obtidos em possíveis submissões anteriores. Objetivou aprimorar a técnica utilizada através da revisão de todas as etapas do KDD à busca de novos insights para a resolução do problema proposto no desafio.

CONSIDERAÇÕES FINAIS

Ao final desta pesquisa percebeu-se a importância de valorizar a análise exploratória dos dados no KDD para municiar a pesquisadora de informações para uma engenharia de features eficiente para a escolha do modelo de machine learning a utilizar.

Diante do resultado obtido, ficou muito claro que as informações relevantes para os tomadores de decisão estão contidas nas features que foram escolhidas para a aplicação do modelo, que foram as mesmas que fizeram o desvio médio quadrático se aproximar cada vez mais do seu valor ideal, que seria zero.

As colunas param_1, param_2 e param_3 parecem ser dados opcionais dos anúncios. Pela natureza dos valores destas colunas, os dados nelas contidos devem variar completamente de anúncio para anúncio, o que dificulta a utilização destas informações no modelo.

O resultado final obtido, desvio médio quadrático = 0.2595, e o consequente lugar no ranking que indicava a posição da submissão dos resultados (1481º lugar de 1612º lugar até 01:35 de 09/06/2018 no horário GMT-3), deu pistas de que há muito ainda que se fazer para melhorar o valor do deal_probability, talvez utilizando técnicas de ensemble aliadas ao processamento de dados em linguagem natural que não puderam ser explorados devido à dificuldade de utilizar esses dados dentro do modelo de regressão implementado.

O processamento das colunas de imagem não foi feito, mas também contribuiria para a melhorias do modelo. Para próximos trabalhos a possibilidade de utilização de processamento de imagens e textos poderia contribuir para a criação de um ensemble, que seria constituído pela integração de diversos modelos a fim de criar um modelo preditivo de maior performance.

REFERÊNCIAS

[1] GRUS, Joel. Data Science do Zero: PRIMEIRAS REGRAS COM PYTHON. Rio de Janeiro: Alta Books Editora, 2016. 315 p. (9788576089988). Tradução de: Data Science from Scratch: First Preinciples with Python.

[2] STEVENS, Chris. Approaching a competition on Kaggle: Avito Demand Prediction Challenge (Part 1). 2018. Disponível em: <https://medium.com/@chrisstevens1/approaching-a-competition-on-kaggle-avito-demand-prediction-challenge-part-1-9bc4e6299ba4>. Acesso em: 09 jun. 2018.

[3] STEVENS, Chris. Approaching a competition on Kaggle: Avito Demand Prediction Challenge (Part 2). 2018. Disponível em: <https://medium.com/@chrisstevens1/approaching-a-competition-on-kaggle-avito-demand-prediction-challenge-part-2-a1afbe063bb8>. Acesso em: 09 jun. 2018.

[4] MOREIRA, Gabriel. Feature Engineering: Getting the most of data for predictive models. 2017. QCon São Paulo, Palestra. Disponível em: <https://www.infoq.com/br/presentations/extraindo-o-potencial-maximo-dos-dados-para-modelos-preditivos>. Acesso em: 09 jun. 2018.

ANEXO 1

Descrição das colunas do dataset:

  • train.csv — Train data.
  • item_id — Ad id.
  • user_id — User id.
  • region — Ad region.
  • city — Ad city.
  • parent_category_name — Top level ad category as classified by Avito’s ad model.
  • category_name — Fine grain ad category as classified by Avito’s ad model.
  • param_1 — Optional parameter from Avito’s ad model.
  • param_2 — Optional parameter from Avito’s ad model.
  • param_3 — Optional parameter from Avito’s ad model.
  • title — Ad title.
  • description — Ad description.
  • price — Ad price.
  • item_seq_number — Ad sequential number for user.
  • activation_date- Date ad was placed.
  • user_type — User type.
  • image — Id code of image. Ties to a jpg file in train_jpg. Not every ad has an image.
  • image_top_1 — Avito’s classification code for the image.
  • deal_probability — The target variable. This is the likelihood that an ad actually sold something. It’s not possible to verify every transaction with certainty, so this column’s value can be any float from zero to one.
  • test.csv — Test data. Same schema as the train data, minus deal_probability.
  • train_active.csv — Supplemental data from ads that were displayed during the same period as train.csv. Same schema as the train data minus deal_probability, image, and image_top_1.
  • test_active.csv — Supplemental data from ads that were displayed during the same period as test.csv. Same schema as the train data minus deal_probability, image, and image_top_1.
  • periods_train.csv — Supplemental data showing the dates when the ads from train_active.csv were activated and when they where displayed.
  • item_id — Ad id. Maps to an id in train_active.csv. IDs may show up multiple times in this file if the ad was renewed.
  • activation_date — Date the ad was placed.
  • date_from — First day the ad was displayed.
  • date_to — Last day the ad was displayed.
  • periods_test.csv — Supplemental data showing the dates when the ads from test_active.csv were activated and when they where displayed. Same schema as periods_train.csv, except that the item ids map to an ad in test_active.csv.
  • train_jpg.zip — Images from the ads in train.csv.
  • test_jpg.zip — Images from the ads in test.csv.
  • sample_submission.csv — A sample submission in the correct format.
  • train_jpg_{0, 1, 2, 3, 4}.zip — These are the exact same images as you’ll find in train_jpg.zip but split into smaller zip archives so the data are easier to download. If you already have train_jpg.zip you do NOT need to download these. We have not made these zips available in kernels as they would only increase the kernel creation time.

Link para o código no github

--

--

Lu Brito

#computerscience #dataliteracy, PhD student in computer science, #instructionaldesigner, #mountaineer, #rockclimber