Padrão de comportamento com Regras de Associação

Roberto Savio "Pitako" Jr
6 min readOct 13, 2020

--

Reimplementando meu mestrado

Terminei o mestrado em 2009 e o trabalho resultou em uma metodologia para descrever padrão de comportamento usando regras de associação. (https://bit.ly/36tMA9r)

Depois de tanto tempo, resolvi estudar Machine Learning novamente. Alguns cursos e vídeos depois, vi que seria legal publicar meus estudos. A primeira ideia foi reimplementar o meu algoritmo do mestrado usando as bibliotecas mais novas.

Na versão original eu usei WEKA para analisar os dados e gerar as Regras de Associação, e o PHP para implementar a metodologia em si.

Dessa vez usei Python com Pandas, NumPy, Matplotlib, Seaborn, Scikit-Learn e MLXtend. Essa última biblioteca é quem tem a implementação do algoritmo Apriori, responsável pela geração de Regras de Associação.

Para o estudo de caso, usei os dados do desafio do Titanic do Kaggle (https://www.kaggle.com/c/titanic/). Problema clássico e um dos datasets mais explorados da plataforma.

Esse desafio consiste em prever sobreviventes do desastre do Titanic usando Machine Learning.

Descrevendo padrões com Regras de Associação

As regras de associação mostram eventos que acontecem ao mesmo tempo. O problema clássico resolvido com essa técnica é o da cesta de compras, onde o objetivo é saber quais produtos são comprados ao mesmo tempo.

As regras são do tipo “Se alguma coisa então outra coisa”. Com isso é possível
descrever a dependência entre a ocorrência do antecessor com a ocorrência do sucessor. Suas medidas de avaliação mais difundidas são o suporte e a confiança. Suporte é o valor que determina a frequência de ocorrência do antecessor no montante de dados. Confiança é o valor que mede a frequência do sucessor acontecer junto com o antecessor.

Sendo assim, essa dependência entre os valores foi usada para descrever o padrão de comportamento. Além da relação, que pode ser medida, outro fator importante é saber a relevância de um atributo na descrição do comportamento. Ou seja, qual sua correlação com o perfil em questão? Para ser possível tratar essa necessidade, a metodologia prevê o uso de pesos nas variáveis e um limite de variação. Com isso, um registro é identificado como fora do padrão se a soma dos pesos dos atributos que estão com valores diferentes é maior que o limite estabelecido.

Maiores detalhes da metodologia em (Dissertação de Mestrado)

Passo a passo do meu estudo

Análise e preparação dos dados

Antes de rodar os dados no algoritmo, precisei fazer alguns pré-processamentos.

Preenchi os dados nulos de idade e local de embarque com a média de idade e local mais frequente nos dados de treino disponibilizado. Também defini valor 1 para crianças que estavam com idade em decimal por não terem completado seu primeiro ano.

Como o Apriori é um algoritmo que trabalha com dados categóricos, usei o Pandas para discretizar o campo idade.

Distribuição da quantidade de passageiros por idade

Para definir se manteria todas as colunas, analisei a relação entre elas.

Matriz de correlação dos atributos de dados dos passageiros

O quadro evidenciou uma relação esperada entre classe e valor da passagem.

Distribuição do valor das passagens por classe

Apesar da variação do preço, principalmente na terceira classe, onde chegou-se a pagar valores maiores que da primeira classe, a forte relação de preço da tarifa com a classe me fez decidir por não usar o atributo de preço pois considerei como uma informação duplicada.

Após essas análises, os atributos que foram mantidos na análise são Pclass, Sex, SibSp, Parch, Embarked, Age (depois de discretizado).

Gerando as regras de associação

Para gerar as regras que descrevem o padrão de sobrevivente e não sobreviventes, separei as cerca de 900 linhas dos dados de treino com train_test_split do sklearn na proporção padrão de 70/30 para treinar e validar o algoritmo.

A geração das regras pela biblioteca mlxtend acontece em 2 etapas. A primeira analisa a frequência dos itens e calcula seu suporte. Para calcular os itens frequentes o algoritmo espera os dados em uma matriz esparsa. Utilizei o get_dummies do Pandas para fazer essa transformação.

Itens frequentes e suporte calculado

A segunda etapa associa os itens calculando a confiança e gerando as regras de fato.

Regras geradas com métricas suporte e confiança calculadas

O campo length não foi gerado pela biblioteca. Esse campo foi adicionado para eu saber quantos atributos tinha em cada regra. Quanto mais atributos na regra, mais detalhes tem sobre o perfil. Esse valor será usado na calibragem do algoritmo.

Comparação dos dados com as regras

Além das dificuldades da parte técnica (qual biblioteca usar, como usar, qual tipo de dados usar…), também tive alguns desafios na definição da solução.

Uma delas foi: como comparar de forma fácil as regras com os registros que estão sendo analisados?

A solução que adotei foi transformar a regra numa string e procurar nessa string os valores dos atributos dos registros analisados. Se o valor não for encontrado, significa que o valor do atributo do registro é diferente do que tem na regra e o contador de diferença é somado com o peso desse atributo.

Isso acontece para todas as regras. A menor diferença é comparada com o limite. Se for maior, entendo que o registro não seguiu o padrão conhecido. Se for menor, entendo que seguiu.

Métricas de resultado

Sendo um algoritmo próprio, tive que implementar também a função de cálculo de métrica de assertividade do algoritmo.

E aqui entra uma diferença da pesquisa no mestrado. No mestrado, o algoritmo devia dizer se o registro era considerado no padrão ou não. O objetivo era criar uma metodologia para encontrar os outliers. Então na época não foi criada uma métrica de acerto.

Como o desafio aqui é de conseguir prever se uma pessoa sobreviveu ou não com base nas suas características, é possível medir esse acerto.

Ou seja:

  • Dos registros classificados como dentro do padrão de sobreviventes, quantos realmente sobreviveram?
  • Dos registros classificados como fora do padrão de sobrevivente, quantos realmente não sobreviveram?
  • Dos registros classificados como dentro do padrão de não sobreviventes, quantos realmente não sobreviveram?
  • Dos registros classificados como fora do padrão de não sobrevivente, quantos realmente sobreviveram?

Depois de aplicada a análise de cada um dos registros de teste usando as regras que descreviam o padrão dos sobreviventes e dos não sobreviventes, foi possível aferir essas métricas.

Executando o algoritmo

Essa metodologia que desenvolvi no mestrado é muito sensível às configurações do algoritmo: suporte e confiança das regras, quantidade de atributos pra considerar uma regra como útil, limite de diferença pra considerar o registro como fora do padrão e os pesos das variáveis.

Isso já era sabido mesmo durante o mestrado. Trabalhos futuros foram propostos nesse sentido para melhorar a configuração.

Para tentar encontrar uma boa configuração, é interessante conseguir variar todos esses atributos para encontrar a melhor métrica, que tem os melhores resultados na classificação.

Para isso, usei o conceito dos pipelines da biblioteca scikit learn. Mas como meu código ainda não tem as funções fit/transform/predict esperadas, tive que desenvolver meu próprio pipeline com uma sequência de for aninhados.

Pseudo-Pipeline

Assim foi possível executar o algoritmo algumas milhares de vezes variando seus parâmetros em busca da configuração para o melhor resultado.

Resultado

Mesmo após 4320 variações dos parâmetros, a assertividade do algoritmo não foi boa. Somente 45% dos sobreviventes e 75% dos não sobreviventes foram classificados corretamente.

Alguns motivos que podem justificar:

  • Pouca quantidade de registros para formar as regras
  • Necessidade de evolução do algoritmo para o problema de classificação, por exemplo, alterando a resposta de SIM/NÃO para uma comparação das distância do registro com relação aos conjuntos de regras.

Conclusão

O algoritmo desenvolvido no mestrado para identificação de outlier não se encaixou facilmente no problema de classificação. A métrica de assertividade precisou ser criada e é preciso evoluir para aumentar seu nível de acerto.

Mas o objetivo principal de registrar o primeiro resultado da minha volta aos estudos de Ciência de Dados foi cumprido. Tive muitos aprendizados reimplementando meu algoritmo do mestrado com as novas tecnologias.

Próximos passos nesse algoritmo serão evoluir a comparação e analisar os parâmetros usados.

--

--