fbpx

Categoria: Big Data

Usando Machine Learning para Descobrir Anúncios Ilegais Em Russo, Sem Saber Falar Russo

O site Avito.Ru, fundado em 2007, é um dos 5 maiores sites russos de classificados. Ele é utilizado tanto por pessoas físicas quanto empresas para negociar produtos novos e usados. Um dos maiores desafios é manter a qualidade do conteúdo diante do crescimento e do volume de novos anúncios. Para resolver isso, o site decidiu buscar uma solução baseada nos dados disponíveis.

Esta foi uma competição disponibilizada na plataforma Kaggle.

Para os leitores com conhecimento técnico, o código da solução final está disponível neste link (github).

Dados disponíveis

No banco de dados disponibilizado havia o conteúdo dos anúncios, atributos sobre os produtos anunciados, categoria e subcategoria, título e descrição. A variável que precisava ser prevista era binária, se o anúncio seria bloqueado ou não pela moderação. Cerca de 4 milhões de anúncios com as previsões dadas pela moderação humana foram disponibilizados para treino, e 1,5 milhão para teste.

Além disso havia uma variável indicando se aquele anúncio havia sido bloqueado por um moderador experiente, que poderia fazer a diferença no fator de erro humano.

Métrica de Avaliação

A métrica utilizada para avaliar a melhor solução era AvgPrecision@K (Top at K). Após atribuir uma pontuação que indicava a probabilidade de um determinado anúncio estar em desacordo com as regras, eles deveriam ser ordenados, de maneira que os mais prováveis estivessem mais acima no ranking. Feito isso, o sistema considerava os K primeiros anúncios e comparava com os valores reais para decidir qual a porcentagem de acerto do modelo.

Transformação dos dados

Minha solução envolveu apenas o título e a descrição dos anúncios. Primeiro o básico, colocar todas as palavras em caixa baixa, remover as stopwords, e fazer o stemming. Um detalhe é que os anúncios estavam em russo, então eu não sei exatamente se existem diferenças de caixa alta e baixa no idioma, ou quais stopwords são relevantes para outras palavras (no caso do inglês, “can” é uma stopword, mas pode ser relevante por também ser usada como “lata”).

De qualquer maneira, esses procedimentos melhoravam a performance do modelo.

Além disso, transformei os documentos numa matriz em que cada linha era um anúncio, e cada coluna, uma palavra. Nos valores testei três variações:

– Binária: na qual a presença da palavra no anúncio era indicada com o número 1;
– Contagem: cada valor era o número de vezes que a palavra aparecia no anúncio;
– Tf-Idf: cada valor era baseado em uma fórmula que leva em conta a frequência da palavra no anúncio, e também em relação aos outros anúncios. Ela atribui um valor maior a palavras raras no contexto geral, mas que tenham uma alta frequência dentro do anúncio específico.

Dentre estas alternativas, a que demonstrou melhor performance foi a Tf-Idf. Esta é uma técnica bastante usada em classificação de texto, e normalmente apresenta uma melhora na precisão da classificação.

Apesar de fazer algumas tentativas de limpeza dos dados, tirando as palavras mais raras, a performance era afetada negativamente. O que ajudou um pouco foi remover números.

Solução

Meu foco era criar uma solução simples, então meu primeiro teste foi com a Logistic Regression em todos os dados. Um dos fatores a se levar em conta era a distribuição de exemplos positivos e negativos, que não era 50%. Com esta solução a precisão era de 91,8%.

Após testar algumas opções disponíveis no scikit-learn (biblioteca de Machine Learning em Python que utilizei), descobri que usando a função loss “modified_huber” apresentava uma maior precisão. Esta é uma função mais robusta do que a log loss, pois aplica uma penalidade quadrática para pequenos erros, e linear para grandes.

Outra ideia que ajudou muito foi separar os anúncios por categoria. Cada categoria possuía uma proporção diferente de exemplos positivos e negativos (Algumas com menos de 1% e outras com mais de 30%). Aplicando o algoritmo acima nos dados transformados desta maneira obtive 97,3% de precisão. Uma melhora de 10,6%.

Para a solução final, treinei também uma modelo Naive Bayes que, apesar de assumir que as variáveis são independentes, possui uma boa performance para classificação de texto. Ao fazer a média da solução dos dois algoritmos, consegui a precisão final de 97,9%.

Diferenças para a solução vencedora

Comparando a minha solução com a solução da dupla vencedora, há uma pequena diferença de 0,8% de precisão. Mas quando olhamos a complexidade, a história é outra. A solução vencedora utilizou mais de 30 modelos, entre transformações e classificação, para cada exemplo do training set. Na prática, assim como acontece normalmente nestas competições, não valeria a pena implementar a solução vencedora. Mas isso não tira o crédito dos vencedores, e também a oportunidade de aprendizado.

Como Identificar Clientes no Twitter Usando Data Mining

Marketing digital é uma área que tem crescido bastante, principalmente com a chegada das redes sociais. Uma das grandes questões da área é: como tornar os usuários destas redes em clientes? Uma das estratégias de maior sucesso é interagir com usuários interessados em comprar seus produtos ou usar seus serviços.

Neste artigo vou mostrar como utilizei técnicas de mineração de dados, num projeto pessoal, para identificar clientes em potencial para uma loja americana de sapatos femininos.

Procurar tweets com uma hashtag específica e relevante

Existe uma forma simples de filtrar tweets, que é buscando por uma hashtag específica. Neste caso, a primeira hashtag testada foi #shoes. O raciocínio foi o seguinte: pessoas interessadas em sapatos postam tweets com esta tag, portanto interagir com elas pode ser uma forma de apresentar a loja. Neste mesmo raciocínio, testei a hashtag #fashion.

O único problema é que, apesar de realmente ser utilizada por consumidoras de sapatos, estas hashtags são utilizadas mais ainda por lojas que postam sobre seus produtos. O número de novos seguidores por dia obtidos usando estas hashtags foi satisfatório, mas a qualidade deles não era a desejada, pois eles estavam mais interessados em vender sapatos do que comprar.

Outra hashtag testada foi a #highheels, com o raciocínio que mulheres interessadas em sapatos de salto alto postam tweets com a mesma. E esta foi surpreendente, pois eu descobri que ela é utilizada por homens que possuem fetiches sobre sapatos femininos, e uma minoria de mulheres que trabalham nesta área para divulgar suas fotos. Ou seja, também não atingia de forma satisfatória o público desejado.

Usando ferramentas mais avançadas do que “especulação”

Com os resultados acima, decidi então que era hora de usar técnicas mais avançadas para descobrir se havia uma maneira de “filtrar” os tweets e encontrar os clientes.

Mineração de dados (Data Mining)

Existem várias definições sobre mineração de dados, até por ser uma área relativamente nova. Mas, em geral, é um conjunto de técnicas e procedimentos para se explorar bancos de dados em busca de padrões e informações. Isso pode envolver desde técnicas simples como fazer a média diária de faturamento de uma empresa, para ver quais são os dias em que vale mais a pena fazer promoções, até técnicas mais avançadas de reconhecimento de padrões, agrupamento de clientes, e previsão de resultados.

Agrupando tweets

O próximo passo na busca por uma forma melhor de encontrar o público alvo no Twitter foi coletar milhões de tweets que continham a hashtag #shoes. Minha intenção era descobrir se existia algum grupo especial de palavras que diferenciava tweets de consumidores e de lojas, para melhorar o filtro dos favoritos.

Aquisição e Processamento dos Tweets

O primeiro passo foi utilizar a API do Twitter usando Python. O único dado utilizado foi o conteúdo do tweet. O segundo passo foi remover palavras que apareciam em poucos tweets, as stopwords (palavras frequentes, mas sem valor preditivo como “the”, “and”), e fazer o stemming (remover a conjugação de algumas palavras, como por exemplo, “loving” to “lov”). Feito isso, os dados foram transformados numa matriz na qual cada linha era um tweet, e cada coluna uma palavra. Se a palavra estava presente, ela tinha o valor 1, caso não, 0.

Clustering

Após coletar e processar os tweets, fiz o agrupamento (clustering) utilizando K-Means. Esta foi a técnica que demonstrou melhores resultados tanto em relação à performance, quanto em relação à divisão dos clusters.

K-Means é um algoritmo simples para encontrar clusters nos dados. Ele é iniciado com clusters aleatórios.  A partir daí começa um processo iterativo:

1. Determina a qual cluster um exemplo específico (no caso, tweet) deve pertencer calculando a distância entre os exemplos e os clusters.

2. Faz a média dos exemplos atribuídos a um determinado cluster para determinar sua nova posição.

É importante fazer um bom pré processamento antes de usar este algoritmo, pois ele não funciona muito bem quando os dados incluem muitas dimensões. Outra recomendação é rodá-lo mais de uma vez, pois a natureza aleatória dos clusters iniciais pode mudar o resultado.

As descobertas

Dentre os grupos de tweets, encontrei alguns que citavam marcas, outros que usavam outras hashtags, mas um deles possuía tweets com as palavras “new” e “shoes”. Resolvi explorar mais profundamente este grupo, e descobri que existem usuários que postam tweets dizendo que precisam de sapatos novos, ou acabaram de comprar os sapatos.

Ainda assim muitas lojas usavam estas palavras para anunciar seus produtos, então decidi filtrar mais ainda. Desta vez encontrei uma terceira palavra: “love”.

Quando resolvi investigar os tweets que possuíam as palavras “love”, “new”, e “shoes” (sem #), notei que a maioria era de usuários que estavam postando fotos, ou simplesmente avisando os amigos, que estavam “adorando seus sapatos novos”.

Isso significa que encontramos uma forma de identificar consumidores de sapatos através dos tweets postados por eles. Ainda assim havia uma minoria de tweets enviados por lojas, mas a maioria era fácil de identificar, pois era spam de várias contas similares.

Se você entrar no Twitter agora e digitar essas três palavras (“love new shoes”) na busca, verá que a maioria dos tweets pertence a usuários consumidores de sapatos, que fazem parte do público desejado pela loja.

Melhorias futuras

O número de seguidores do perfil da loja cresceu, e com ele os retweets e cliques em produtos anunciados, mas ainda há mais a ser feito, como uma segmentação mais profunda, baseada na localização. Mesmo assim, relativa à situação inicial, agora temos uma filtragem muito melhor de tweets, e a loja está alcançando um público com um potencial de compra maior do que simplesmente usando hashtags gerais.

Teste