fbpx

Onde Encontrar Datasets para Praticar Data Science e Machine Learning

Onde Encontrar Datasets para Praticar Data Science e Machine Learning

Para se tornar um bom Data Scientist e começar a realmente entender Machine Learning duas coisas são muito importantes: estudar os algoritmos, e aplicar o que foi aprendido a dados reais.

Na indústria, a maior parte do tempo de um projeto de Machine Learning é normalmente gasta com a preparação e compreensão dos dados. Aplicar um algoritmo super avançado de Machine Learning a dados ruins seria como usar um carro esportivo muito veloz numa estrada esburacada. Não adianta ele ter uma ótima performance, você não vai conseguir passar de uma certa velocidade.

Na prática muitas vezes o que faz a diferença entre um modelo muito bom e um mediano é justamente entender os dados, e saber prepara-los bem para aplicar um algoritmo. E esta é uma habilidade que pode ser aprendida como qualquer outra.

Por isso, quero listar aqui alguns sites onde você poderá encontrar datasets abertos para praticar as suas habilidades, ou usar na prática, dependendo de seu projeto:

UCI Machine Learning Repository


Um dos sites mais conhecidos que disponibilizam datasets públicos, o repositório da UC Irvine contém centenas de datasets em áreas variadas. Você é livre para explorar os datasets da forma como quiser, mas eles dão a opção de filtrar por:

  • Área de interesse
  • Tipo de tarefa mais apropriada (classificação, regressão, clustering)
  • Formato das variáveis (categóricas, numéricas)
  • Tipo dos dados (uma ou mais variáveis, séries temporais)
  • Quantidade de variáveis independentes
  • Quantidade de exemplos

Além disso, ao acessar a página de um dataset em particular, é possível ver detalhes como a fonte, informações sobre o problema, variáveis, e o mais interessante, trabalhos acadêmicos que usam este dataset, que podem ser uma ótima fonte de ideias e aprendizado para tentar reproduzir.

Quandl


Este site é especializado em dados financeiros e econômicos. Ele possui uma vasta quantidade de dados macroeconômicos, geopolíticos, demográficos, bem como dados sobre ações, commodities, futuros, empresas de capital aberto, até mesmo sobre bitcoin. Dizem ter mais de 10 milhões de datasets.

Além de uma plataforma que permite uma busca fácil, ele possui uma API que facilita a integração com linguagens bastante utilizadas para análise de dados como Python e R. A maioria dos dados está voltado para o mercado financeiro americano, mas é possível encontrar dados de outros países também.

Existem os datasets abertos, grátis, e uma parte premium, que é paga.

Kaggle


Uma das melhores formas de trabalhar em casos próximos da realidade é através das competições no Kaggle. Empresas e instituições acadêmicas disponibilizam dados e um objetivo (como, por exemplo, descobrir automaticamente se um anúncio está de acordo com as regras do site).

O objetivo aqui não é falar sobre como ganhar uma competição destas, mas tratar o site como uma fonte de dados, e também como um referencial sobre suas habilidades, já que é possível comparar suas soluções com outras de centenas de pessoas.

Mais do que isso, ao fim das competições, normalmente as soluções são compartilhadas, então é possível preencher as lacunas do conhecimento, ver até onde você conseguiu chegar, e quais foram os métodos que fizeram a diferença entre você e outros competidores com uma posição melhor.

É de graça para competir, e se você tiver habilidade, paciência, dedicação, e um pouco de sorte, pode até ganhar um prêmio.

Amazon AWS Datasets

Se você estiver se sentindo corajoso, este é um repositório de datasets disponibilizados pela Amazon para usar com o serviço de cloud computing (AWS) da empresa.

São datasets gigantescos em áreas como processamento de linguagem natural para entender pesquisas em mecanismos de buscas, pesquisas genéticas e dados climáticos. As áreas são variadas, mas o que há em comum é o tamanho dos dados, que claramente não cabem na memória e devem ser analisados utilizando ferramentas específicas para big data.

Neste caso os datasets são grátis, mas o uso da plataforma de cloud computing não. De qualquer maneira é uma ótima forma de conhecer ferramentas, e ganhar prática na análise de grandes datasets, que é uma área com um potencial enorme de crescimento.

Estes são apenas alguns dos sites, mas eles já fornecem bastante material para ser explorado, e são de fácil acesso para iniciantes ou usuários mais avançados.

Edição:

A leitora Dania Meira, que também é Data Scientist, indicou mais alguns sites nos comentários, vale a pena dar uma olhada.

Como Criar um Modelo Simples para Prever Séries Temporais Usando Machine Learning em Python

Quando tratamos da previsão de séries temporais um modelo amplamente utilizado é a regressão linear. Apesar de simples, ele tem se mostrado bastante útil em aplicações reais.

Uma forma muito simples de criar um modelo para este caso é usar os dados anteriores da própria variável de interesse para prever o atual. É possível criar modelos que buscam prever estas séries utilizando outros atributos, o que em alguns casos vai melhorar a precisão dos mesmos.

Neste artigo quero demonstrar a maneira mais simples, usando uma regressão linear nos dados históricos da própria variável de interesse. O código disponibilizado está num formato adequado para que o leitor entenda o que está acontecendo, por isso ele pode ter partes que poderiam ser otimizadas num ambiente de produção, mas foi uma escolha, de acordo com o objetivo educacional do artigo, deixa-las assim.

O código completo, e os dados, estão disponíveis aqui.

Descrição dos dados

Os dados utilizados correspondem à “prime rate” no Brasil. A “prime rate” é a taxa de juros bancários para clientes preferenciais, ou seja, aplicada a clientes com baixo risco de inadimplência em operações de alto valor. Vamos usar os valores desta taxa nos últimos 6 meses para prever o próximo.

Prime Rate

Temos dados mensais de janeiro de 2005 até novembro de 2014. Eles são originalmente divulgados pelo Banco Central do Brasil, mas foram obtidos na plataforma Quandl.

Observação importante: não use as informações deste artigo como base para tomar quaisquer decisões, inclusive financeiras, ou de investimentos. Este é um artigo educacional e serve apenas para demonstrar o uso de uma ferramenta de machine learning para a previsão de séries temporais.

Modelos utilizados para comparação

Para comparar o desempenho da regressão linear neste problema, vou utilizar outros dois métodos válidos para previsão de séries temporais:

Valor do último mês: a previsão para o próximo mês é simplesmente o mesmo valor da variável no último mês.

Média Móvel: a previsão para o próximo mês é a média dos valores dos últimos 6 meses.

Métrica de avaliação

Vamos utilizar o Erro Percentual Absoluto Médio (em inglês, MAPE). É uma métrica bastante utilizada na área de previsões de séries temporais, e se refere à média do percentual de erros cometidos nas previsões, desconsiderando a direção (acima ou abaixo do real).

Além deste erro, também avaliaremos o Erro Médio Absoluto (MAE, em inglês), que é a média dos erros absolutos (ignorando o sinal positivo ou negativo). Assim sabemos melhor quanto estamos desviando dos valores reais nas unidades originais.

Do ponto de vista prático, para que possamos justificar o uso da regressão linear em vez dos métodos mais simples, ela deve apresentar um erro médio menor do que o erro das outras opções.

Para quem quiser ser um pouco mais rigoroso, vou usar um teste estatístico pareado (Wilcoxon Signed-Rank) para avaliar as duas alternativas que oferecerem os menores erros. Levando em consideração algumas suposições sobre os dados, ele basicamente nos diz a probabilidade da diferença entre os erros dos dois métodos ser puramente por sorte, e não por alguma característica especial que torne um modelo melhor do que o outro.

Na prática, na maioria das vezes a decisão de usar um modelo ou outro é feita diante da comparação entre a melhora no desempenho e o esforço necessário para coloca-lo em funcionamento. Alguns modelos que passam pelo teste estatístico, mas são muito complicados, nunca serão implementados, enquanto outros, mais simples, que não passam pelo rigor do teste, serão utilizados.

Módulos Python utilizados

Para rodar o script deste artigo são necessários os seguintes módulos Python: Numpy, Pandas e Scikit-learn. Caso queira efetuar o teste pareado também é necessário ter Scipy. Para reproduzir o gráfico, é necessário Matplotlib.

Definindo as funções das métricas de avaliação

Para o MAE vamos utilizar a implementação disponível no scikit-learn. Como ele não possui uma função para computar o MAPE, nós precisamos cria-la.

Carregando e formatando os dados

Os dados estão num CSV em formato de tabela. Após carregarmos o CSV na memória usando Pandas precisamos organizar os dados para fazer a previsão. O scikit-learn não se dá muito bem com Pandas, então além de preparar os dados no formato correto para alimentar o modelo, vamos coloca-los em arrays do numpy.

A matriz de atributos terá 6 colunas, uma para cada mês anterior ao que queremos prever, e o vetor com a variável dependente terá o valor a ser previsto (próximo mês). Para isso vamos começar pelo sétimo mês disponível, que é o número seis no loop porque, em Python, o primeiro elemento é indexado como zero.

Treinando o modelo e fazendo as previsões

Dados financeiros normalmente mudam de regime com frequência, então vamos treinar um novo modelo a cada mês. O primeiro mês a ser previsto será o 31º disponível após a transformação dos dados. Assim temos pelo menos 30 exemplos para treinar o primeiro modelo. Em tese quanto mais dados para treinar, melhor.

Para cada mês vamos armazenar o valor previsto pelos três métodos e o valor verdadeiro.

Avaliação dos resultados

Após a conclusão das previsões, transformamos as listas em arrays do numpy novamente e computamos as métricas.

Vemos que o melhor modelo é a regressão linear, seguido por usar o valor do último mês, e um resultado bastante ruim com o método da média móvel.

Prime Rate Linear Regression

Teste Wilcoxon Signed-Rank – Opcional

Vamos usar um teste pareado nos erros absolutos da regressão linear e do método que utiliza o valor do último mês para ver se a diferença entre eles é significativa do ponto de vista estatístico. Ou seja, qual é a probabilidade da diferença entre o erro dos dois modelos ser apenas por sorte.

O p-value reportado por esta função é relativo a um teste de duas caudas, ou seja, testa se as médias são diferentes. No nosso caso, estamos mais interessados em saber se uma média é menor do que a outra, ou seja, um teste de uma cauda. A forma mais fácil de converter este número para o que nós desejamos é dividi-lo por 2.

O p-value mínimo mais aceito pela comunidade científica para determinar que há uma diferença entre as médias é de 0,05. Neste caso estamos bem abaixo, nosso p-value é menor do que 0,001, então conseguimos determinar que a probabilidade da diferença de performance entre os modelos ser apenas por sorte é mínima. Podemos rejeitar a hipótese que eles oferecem o mesmo desempenho, e favorecer o uso da regressão linear.

Vale a pena ressaltar que, ao usar estes testes, é importante continuar a coletar dados mesmo após atingir significado estatístico, para confirmar o resultado. Parar de coletar assim que se atinge o nível desejado do p-value pode levar a resultados falsos.

Sugestões para melhorar o modelo

Nós criamos o modelo mais simples possível, baseado apenas nos valores históricos da série. Abaixo deixo algumas sugestões que podem ser implementadas para possivelmente reduzir o erro.

Boosting

Boosting é uma técnica que treina vários modelos nos mesmos dados, a diferença é que cada modelo é treinado nos erros residuais dos anteriores. Apesar de haver o risco de overfitting caso não seja feita uma boa validação, esta é uma técnica que apresenta bastante sucesso na prática.

Criação de mais atributos

Utilizamos apenas os valores dos últimos seis meses como variáveis independentes. Se adicionarmos mais variáveis que sejam correlacionadas com a variável dependente, podemos melhorar o modelo. Além disso, podemos adicionar atributos baseados em transformações, como elevar os valores ao quadrado, para capturar relações não lineares.

Usar outros modelos

Regressão linear não é a única opção nestes casos. Existem modelos baseados em alterações da regressão linear, redes neurais, SVMs, e decision trees que podem apresentar um desempenho melhor.

Calculando a Probabilidade de Cliques em 4 Milhões de Anúncios Usando Métodos para Big Data

A Avazu é uma plataforma de publicidade que oferece anúncios em sites e aplicativos móveis. Um dos maiores desafios do ramo é determinar qual o anúncio com a maior relevância para o usuário. Se o anúncio estiver de acordo com os interesses do usuário, a chance dele clicar é maior, e isso aumenta os lucros tanto da plataforma quanto do anunciante, que terá um cliente em potencial visitando seu site.

Machine Learning têm sido usado por várias empresas que oferecem anúncios no formato pay-per-click. Ou seja, que são pagas pelo anunciante a cada clique no anúncio oferecido. Dentre as aplicações, a criação de modelos inteligente para calcular a probabilidade de um usuário clicar no anúncio, baseando-se em:

Informações de perfil: localização, dispositivo utilizado;
Informações do anunciante: categoria, tamanho e cor do anúncio;

E também dados sobre o site ou aplicativo no qual o anúncio é exibido.

Neste repositório disponibilizo o código original para a implementação do FTRL Proximal pelo usuário tinrtgu do Kaggle, baseado no paper desenvolvido pelo Google, e também o código modificado para obter meu melhor modelo individual.

Descrição dos dados

Nesta competição a Avazu ofereceu um dataset com 10 dias de informações, tanto sobre os usuários, quanto sobre os anunciantes e as plataformas de exibição. O objetivo era prever a probabilidade de um visitante, em um aplicativo ou site, clicar no anúncio exibido. Como teste, foi reservado um dia, 31/10/2014, para avaliar o modelo.

O training set possuía cerca de 40 milhões de linhas, e o teste cerca de 4 milhões. Além disso, é um problema de alta dimensionalidade, com mais de 1 milhão de variáveis independentes.

A métrica escolhida para avaliação foi a LogLoss, que pune previsões incorretas que são muito confiantes. Um detalhe é que existia um desequilíbrio entre a proporção de exemplos positivos e negativos, e esta métrica favorece acertos na classe com maior representação (no caso, os negativos).

Modelo base

Atribuir uma probabilidade de 50% a todos os exemplos oferecia uma log loss de 0,6932.

O primeiro modelo, mais simples, que testei foi uma regressão logística com Vowpal Wabbit, sem regularização e com apenas 1 passe sobre os dados. Ele oferecia a log loss de 0,3993.

Limpeza dos dados

Devido ao grande número de variáveis independentes, algumas delas acabam aparecendo pouco no dataset, e podem atrapalhar a classificação. Como neste caso o modelo utilizado foi a regressão logística, e ela é sensível a outliers, a remoção deles poderia melhorar a performance.

Desta maneira, fiz dois testes: remover os outliers, ou agrupá-los sob uma variável “rara”.

A escolha que melhorou significativamente a log loss foi agrupar as variáveis que apareciam menos de 5 vezes sob uma variável comum. A regressão logística, sem otimização, aplicada ao dataset “limpo” alcançou uma log loss de 0,3954.

Problemas com validação

Nesta competição um dos grandes problemas era encontrar uma maneira adequada de fazer validação. Estes são dados que mudam rapidamente, novas variáveis entram, e antigas deixam de ser utilizadas em questão de dias ou semanas, então é natural que haja esta dificuldade para chegar a um consenso sobre a performance exata do modelo.

Algumas formas foram discutidas no fórum da competição, e duas delas foram bastante utilizadas:

Holdout

Nesta modalidade, a cada N exemplos utilizados para treinar o modelo, é calculada a log loss no exemplo N+1. Após passar pelo dataset inteiro, é calculada a média. Nas minhas tentativas este se mostrou um método bastante otimista quanto à realidade.

Validação nos últimos dias

Neste caso, por se tratar de dados com dependência temporal, o modelo era treinado excluindo-se o último, ou os dois últimos dias do dataset, que eram utilizados para validação. Esta alternativa parecia ser mais precisa do que a outra, mas não era robusta à escolha de interações entre as variáveis, então era necessário ter cuidado com o overfitting nestes casos.

Criação de variáveis

Todas as variáveis desta competição eram binárias, e algumas delas eram anônimas, então eu não tinha informações sobre o que elas representavam. Desta maneira, testei duas alternativas para criar novas variáveis que pudessem colaborar na classificação.

Frequência

Uma das alternativas foi contar quantas vezes cada variável aparecia no dataset e usar este valor na classificação. Esta tentativa não deu certo, e piorou o desempenho. Uma alternativa que apresentou melhora, mas nada significativo, foi criar uma variável indicando se um determinado exemplo possuía mais ou menos de 100 ocorrências.

Modelos utilizados

Regressão Logística – Vowpal Wabbit

Aproveitei esta oportunidade para conhecer uma nova ferramenta: Vowpal Wabbit. Uma implementação rápida de algoritmos com funções convexas de Machine Learning tanto para regressão, quanto para classificação. Só para lembrarmos, a regressão logística “pura”, sem limpeza dos dados, apresentava uma log loss de 0,3993. Após a limpeza este número caiu para 0,3954.

SVM calibrado – Vowpal Wabbit

Como era necessário enviar uma lista de probabilidades para o Kaggle, tentei utilizar a distância dos dados para o hiperplano do SVM como inputs, tanto para uma regressão logística (inspirado em Platt’s scaling), quanto para uma regressão isotônica, disponível no scikit-learn. São dois modos populares de calibrar um SVM para que ele nos dê probabilidades. As duas não apresentaram uma boa melhora na pontuação.

Follow the Regularized Leader Proximal (FTRL Proximal)

Paper Google – Ad Click Prediction (em inglês)

Este foi o algoritmo que me ajudou a melhorar bastante a log loss. Ele foi implementado por um dos competidores e disponibilizado no fórum da competição. Desenvolvido pelo Google para a mesma tarefa de calcular a probabilidade de clique num anúncio, baseado em informações do usuário, ele cria uma representação mais esparsa dos dados, e acaba sendo mais robusto contra outliers. Neste paper o autor descreve a implementação e as características dele comparado a outros algoritmos utilizados para a mesma tarefa.

Pode-se dizer que ele é basicamente uma regressão logística com ajustes para não precisar utilizar tanta memória para armazenar os pesos, e também uma forma de otimização que força os pesos menos significativos a tomarem o valor de zero absoluto. Ou seja, num problema com milhões de variáveis como este, desconsidera aquelas que não são realmente importantes. Faz a seleção de atributos automaticamente.

Com os dados limpos, uma leve otimização, e 3 passes sobre os dados, este modelo atingiu log loss de 0,3925.

Redes Neurais

Fiz uma tentativa de classificação com redes neurais tanto no Vowpal Wabbit quanto com uma implementação própria. No Vowpal Wabbit a rede neural possui apenas um hidden layer com ativação sigmóide. Não houve melhora.

Criei, em Python, uma rede neural com unidades de ativação ReLu. Este tipo de ativação tem sido bastante utilizado na área de Deep Learning, devido a não ter o problema de gradientes explodindo ou desaparecendo, além de favorecerem uma representação de dados esparsa. Em alguns casos o resultado é equivalente, ou melhor, do que redes previamente ativadas com treinos não supervisionados.

Utilizei apenas um hidden layer, e neste caso, houve uma melhora na validação dos dados, mas ela não se traduziu em melhora na pontuação oficial da competição. Talvez utilizar mais de um hidden layer, e começar a entrar na área de Deep Learning tivesse ajudado, mas eu não tive tempo para testar.

O fato de só termos variáveis binárias também dificulta o trabalho da rede neural em encontrar uma representação adequada, e aprender interações que possam ser relevantes para a classificação. Usar variáveis numéricas, derivadas das originais, poderia facilitar o trabalho

A melhor rede neural, nos dados originais limpos, com 30 neurônios no hidden layer, e ativação ReLu, atingiu a log loss de 0,3937.

Interação entre variáveis

Outra alternativa era criar interações entre duas ou mais variáveis. Isso era feito simplesmente criando uma variável que indicasse a presença de combinações entre variáveis. Num primeiro momento tentei a interação entre todas as duplas de variáveis, o que piorou o desempenho.

Fiz uma nova tentativa, desta vez criando manualmente combinações que me pareciam relevantes (representando o acesso de um determinado usuário a um aplicativo, por exemplo). E elas acabaram por melhorar o modelo, reduzindo a log loss para 0,3897.

Estas tentativas foram feitas utilizando o código FTRL Proximal.

Hashing trick

Num problema com muitas variáveis independentes como este surge a dificuldade de armazenar pesos para todas elas na memória. Apesar deste ser um dataset pequeno quando falamos de big data, já requer o uso do hashing trick. Esta técnica consiste em fazer o hashing das variáveis e atribuir pesos aos buckets, em vez de diretamente a cada variável. Neste caso, por termos apenas variáveis binárias, é bastante fácil utilizar.

Após feito o hash, utiliza-se uma lista com os índices dos buckets que devem ter seus pesos atualizados naquela iteração. Existe o risco de colisão, e quanto maior o número de buckets, menor este risco. Mesmo assim, na prática não há uma perda significativa de performance por esta razão, por isso esta se tornou uma técnica amplamente utilizada em problemas que envolvem alta dimensionalidade dos dados.

Tanto o Vowpal Wabbit, quanto o FTRL Proximal utilizam esta técnica.

Ensemble

É quase impossível pontuar bem numa competição do Kaggle sem juntar modelos num ensemble. Eu não conheço uma competição que os participantes nas melhores posições não tenham usado esta técnica. Basicamente, se você tiver modelos que tenham uma precisão parecida, mas erros diferentes, há uma boa probabilidade que, se juntar as previsões deles, você terá uma previsão melhor.

Visite este artigo para saber mais sobre maneiras de usar ensemble learning para melhorar seus modelos de machine learning.

Modelos em subdivisões dos dados baseados nas variáveis independentes

A primeira tentativa de ensemble foi criar modelos individuais para determinadas subdivisões do dataset. Por exemplo, criar 24 datasets, cada um contendo apenas os exemplos gerados numa determinada hora, ou criar um dataset para cada ID de aplicativo, e treinar modelos individuais neles. Depois, subdividir da mesma maneira o test set e obter previsões destes modelos individuais.

Em alguns casos, se as subdivisões forem feitas em grupos que realmente apresentem diferença entre eles, a performance pode melhorar bastante. No nosso caso, por exemplo, utilizando apenas os modelos divididos por hora, a log loss da regressão logística, antes da limpeza dos dados, caiu para 0,3976.

Após criar vários modelos baseados em subgrupos que pareciam ser diferentes entre eles, o ensemble final, fazendo a média simples de 8 modelos, atingiu uma log loss de 0,3935.

Modelos baseados em interações aleatórias das variáveis

Outra alternativa para criar ensembles é utilizar variáveis diferentes para cada modelo. Após verificar que algumas interações melhoravam a pontuação utilizando o FTRL Proximal, decidi criar um script que testava o efeito que uma interação teria na pontuação do ensemble. Apesar de interessante, deve-se tomar bastante cuidado com o overfitting.

Cada modelo selecionava uma interação e testava se o desempenho de um ensemble entre ele, e alguns com outras interações, melhorava. Esta tentativa gerou 5 modelos lineares com diferentes combinações de variáveis, que juntos, fazendo a média simples, atingiram uma log loss de 0,3888.

Juntando os melhores os modelos

No fim, juntei vários modelos que apresentavam uma boa pontuação, e cheguei à log loss de 0,3878 que garantiu a 42ª posição, entre as 3% melhores soluções. A diferença entre a log loss desta solução e da vencedora foi de 0,0087.

Outras ideias e solução vencedora

Após o término da competição é comum que os participantes com as melhores colocações divulguem seus modelos e ideias que contribuíram para alcançar uma boa performance.

Neste caso, além dos métodos descritos aqui, duas aproximações se destacaram: atributos que levavam em conta fatores temporais, como o número de visitas de um usuário a um site ou aplicativo na última hora; quantidade de visitas no mesmo dia; e utilizar atributos relacionados à contagem de vezes que a variável, ou interações entre variáveis, apareciam.

Saber utilizar as características temporais dos dados parece ter favorecido bastante os melhores colocados.

Três Maneiras de Usar Ensembles para Melhorar a Performance de seus Modelos de Machine Learning

Ensemble Learning é uma área de Machine Learning que estuda maneiras de agrupar os resultados de diversos modelos com o objetivo de obter uma melhor generalização. Esta área ganhou bastante destaque quando o prêmio do Netflix foi dado a times que uniram centenas de modelos para alcançar os 10% de melhora no sistema de recomendação e receber o prêmio milionário.

O princípio é simples e depende principalmente de dois fatores: a precisão e a diversidade dos modelos que integram o ensemble. A precisão dos modelos deve ser bastante similar, mas o modo como eles chegam a essa precisão deve ser diferente.

No nosso exemplo, vamos usar dados de um problema de classificação binária com cerca de 20 variáveis independentes. A métrica de avaliação da performance será log loss. Os modelos devem prever a probabilidade de um exemplo pertencer à classe positiva. Esta métrica pune rigorosamente modelos muito confiantes em previsões erradas, como por exemplo, prever que uma instância negativa tenha 80% de chance de ser positiva. Quanto menor a log loss, melhor.

Os números relatados são obtidos a partir de um validation set separado, com 10% dos dados. Ou seja, temos 90% dos dados para treino, e 10% para validação.

No nosso ensemble vamos utilizar 4 modelos, cada um treinado apenas em variáveis similares escolhidas manualmente. Existem três maneiras muito utilizadas de fazer o ensemble: média simples, média ponderada, ou treinar um outro modelo de Machine Learning usando como variáveis as previsões dos modelos originais (conhecido como blending).

Neste artigo vamos analisar apenas a média simples e o blending. Os princípios utilizados no blending podem ser facilmente utilizados com a média ponderada. Todos os modelos utilizados aqui são regressões logísticas.

Média simples

Log Loss: 0.4273

Normalmente a média simples dos modelos envolvidos no ensemble nos dá um ótimo resultado. Neste caso, talvez pelo fato dos modelos buscarem padrões bem diferentes, ela acabou sendo a hipótese com o pior desempenho.

É recomendável que a primeira tentativa seja essa, pois é fácil de fazer e, se apresentar um bom resultado, pode tornar desnecessário tentar outras.

Blending

Para o blending utilizaremos as previsões dos modelos originais para alimentar uma outra regressão logística que nos dará a previsão final. As variáveis independentes deste modelo final serão o scores dos modelos anteriores, individuais, antes da transformação pela função sigmoide. Ou seja, o valor das variáveis multiplicados pelos pesos dos modelos.

Dentro do blending vamos tratar de duas possibilidades: treinar os modelos originais em todo o training set, e depois usar as previsões deles neste mesmo conjunto de dados para obter os coeficientes da regressão logística final; ou treinar os modelos originais em 90% do training set, e deixar 10% separados como “ensemble set”, para treinar apenas o modelo final. Estes conjuntos de dados são criados aleatoriamente a partir do training set original.

Usando o mesmo training set para todos os modelos
Log Loss: 0.4101

Apesar de corrermos o risco de overfitting ao usar o mesmo conjunto de dados para os modelos originais e o ensemble, houve uma melhora significativa ao testarmos nos dados que deixamos separados no início. Isso possivelmente deve-se ao fato de alguns modelos possuírem uma precisão significativamente maior do que os outros, o que atribui a eles uma maior importância.

Usando 90% do training set para os modelos originais e 10% para o ensemble set
Log Loss: 0.4068

Neste caso vemos que havia um pouco de overfitting no modelo anterior. Ao separarmos o training set original e deixarmos uma parte dele exclusiva para descobrir o peso de cada modelo no ensemble estamos ajudando na generalização, apesar da diferença não ser tão grande quanto do primeiro para o segundo.

Observações finais

Ao escolhermos o terceiro cenário demonstrado, temos mais um parâmetro para ajustar, que é a divisão de dados que usaremos para treinar os modelos originais, e o ensemble. Neste caso testamos apenas 90/10, mas outras quantidades podem oferecer uma melhora ainda maior dependendo do caso.

No caso da média ponderada, em vez de utilizarmos uma regressão logística para o ensemble, usaríamos uma otimização simples de pesos para cada modelo original também baseada no “ensemble set”.

Neste caso tratamos de um exemplo específico com quatro modelos baseados em variáveis diferentes, mas se você possui vários modelos baseados em algoritmos com propriedades diferentes (uma decision tree e uma regressão logística, por exemplo) que estão oferecendo uma precisão parecida, juntá-los é um caminho fácil e quase infalível de obter uma performance melhor.

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