Uso do Streamlit para ajustes em algoritmos de clusterização

Carlos Lima Dias
10 min readOct 12, 2020

--

Este texto faz parte de uma série de artigos desenvolvidos para o projeto final do curso de Data Science & Machine Learning da Tera por Carlos Dias, Guilherme Espindola, Paulo Franco e Rafael Nagao,

Objetivo do nosso projeto era identificar os perfis de atuação parlamentar dos deputados federais por meio dos associados a atividade parlamentar, TSE, Twitter etc..

O desenvolvimento completo do projeto está descrito neste artigo.

Este artigo aborda o uso da biblioteca Streamlit no processo interativo de seleção de variáveis e ajuste de hiperparâmetros utilizados pelos algoritmos de clusterização para a identificação dos perfis de atuação parlamentar.

Dimensões e Algoritmos de clusterização

Um algoritmo de clusterização busca identificar similaridades entre objetos ou observações, de acordo com suas características ou atributos. Nesse caso específico, os algoritmos irão tentar “agrupar” (em “clusters”) parlamentares de acordo com atributos passados para o algoritmo.

Cada algoritmo utiliza uma estratégia diferente para identificar esta similaridade, que basicamente, é definida por uma relativa “proximidade” entre os objetos. Mais a frente explicaremos melhor estas estratégias. Para uma introdução sobre algoritmos de clusterização sugerimos o seguinte artigo: Análises com algoritmos de Clustering.

No exemplo abaixo, considerando apenas dois atributos, até podemos identificar visualmente esta “proximidade” entre os objetos, de acordo com a relação entre as duas variáveis que os descrevem, em um plano cartesiano com duas dimensões.

Introduction to Machine Learning with Python — Cap 3 Unsupervised Learning and Preprocessing.
Introduction to Machine Learning with Python — Cap 3 Unsupervised Learning and Preprocessing.

No entanto, a realidade é que, mesmo usando apenas dois atributos (o que se reflete em duas dimensões), muitas vezes não é possível ter essa percepção de agrupamento. Considerando que ao adicionarmos cada atributo estamos adicionado também uma nova dimensão, acima de 3 atributos/dimensões fica impossível ter uma percepção visual dos possíveis agrupamentos.

Uma forma possível de visualização de como os objetos estão arranjados quando representados por mais de 3 atributos (dimensões) é aplicar uma transformação nos dados que permita uma redução de dimensionalidade.

Redução de Dimensionalidade

Quando aplicamos um algoritmo de redução de dimensionalidade, o que buscamos é criar uma nova representação do conjunto de variáveis de modo a facilitar a percepção das características fundamentais do conjunto de informações original. O conjunto de informações original, com muitas dimensões/variáveis, é transformado de modo que as relações sejam “sumarizadas” em uma nova representação com menos variáveis/dimensões.

Nesse caso particular utilizamo o método PCA (Principal Component Analysis), que permite visualizar uma representação em duas ou 3 dimensões de um plano n-dimensional, onde os Componentes Principais absorvem e refletem o arranjo dos objetos no plano n-dimensional.

Considerando o nosso problema de clusterização, abaixo segue uma visão em 3 dimensões do conjunto de dados contendo 11 variáveis/reduzidas a 3 dimensões utilizando o PCA:

Plot 3D transformação PCA

No gráfico a seguir, temos uma ideia da importância das variáveis originais para cada um dos componentes principais.

Mapa de calor da relevância das variáveis originais para cada componente principal

Visualmente não conseguimos identificar muitos clusters…. vejamos o que conseguimos com os algoritmos.

As estratégias de clusterização e seus algoritmos

O interessante nos processos de clusterização é que não sabemos previamente em quantos grupos os elementos estão agrupados e quais os respectivos componentes. Os algoritmos de clusterização são classificados como algoritmos de aprendizado de máquina não-supervisionados, isto é, eles não tem uma resposta inicial em que se basear para apreender por meios de exemplos.

Existem 4 estratégias básicas utilizadas pelos algoritmos de clusterização. Utilizaremos pelo menos um algoritmo de cada estratégia.

1 — Clusterização baseada em centroides

Se baseiam na identificação de um ponto que seja central ao cluster de modo que minimize a distância dos seus participantes a esse ponto. Normalmente identificam clusters em formato esférico (no caso de 3 dimensões) onde a distância a um ponto central é o que determina os clusters.

K-Means

Este é um dos algoritmos mais simples e mais utilizados em tarefas de clusterização. Para cada cluster a ser encontrado ele determina inicialmente um ponto (por exemplo, aleatoriamente) e identifica os pontos mais próximos para participarem de seu cluster.

Identificados os pontos de cada cluster, o centro dos clusters passa a ser o ponto onde a distância média para os seus membros seja a menor.

Redefinidos os novos centros dos clusters, é feita uma nova busca por pontos próximos ao novo centro do cluster.

Esse processo se repete até que a busca pelo ponto central de cada cluster se estabilize ao não conseguir mais alterar a composição dos clusters.

Introduction to Machine Learning with Python — Cap 3 Unsupervised Learning and Preprocessing.

Nesse algoritmo é necessário informar o número de clusters que devem ser identificados. Como não sabemos previamente a quantidade de clusters que desejamos achar, existe uma estratégia que avalia a “inércia” dos objetos de acordo com o número de clusters informado.

Essa inércia é um indicativo da estabilidade dos componentes dos clusters. Ao analisarmos a variação da inércia com o número (k) de clusters temos uma ideia do aumento da estabilidade do sistema a partir de certo ponto.

Utilizando essa técnica sobre as onze variáveis iniciais selecionadas para o processo, obtivemos o seguinte gráfico para uma busca de até 50 clusters:

Gráfico de inércia (ou cotovelo) para identificação do número de clusters — K-Means

Informamos ao algoritmo o número de 15 clusters, que seria o número onde a redução da inércia do conjunto começa a reduzir de forma menos intensa. No entanto, esse alto número de clusters já era indicativo de que estávamos utilizando variáveis demais para a identificação de grupos que fizessem sentido.

Abaixo a representação visual dos clusters identificados em um gráfico com a dimensionalidade reduzida por PCA.

K-Means, 11 variáveis, n_clusters=15 -> 15 clusters -visualização PCA 3D

Mean-Shift Clustering

Também baseado na premissa de identificação de um ponto central do cluster, funciona buscando pontos onde a densidade do cluster aumenta.

Neste algoritmo, não existem parâmetros significativos que possam influir na quantidade de clusters identificados, salvo a quantidade e qualidade das variáveis utilizadas para a execução do algorítimo.

Com o contexto inicial de 11 variáveis esse algoritmo identificou 9 clusters.

Abaixo a representação visual dos clusters identificados em um gráfico com a dimensionalidade reduzida por PCA.

Mean-Shift, 11 variáveis -> 9 clusters, -visualização PCA 3D

2 — Clusterização baseada em densidade

A estratégia aqui se baseia na densidade de pontos em determinada região, não havendo a necessidade de existência de um ponto central. São interessantes para identificar clusters que não se agrupam de forma uniforme no espaço.

DBSCAN — Density-Based Spatial Clustering of Applications with Noise

Neste algoritmo, todos os pontos são visitados e são avaliados duas métricas: a) distância entre pontos (eps) e b)quantidade mínima de objetos por cluster (min_part). De acordo com estas métricas o algoritmo determina se aquele ponto faz parte de um cluster ou se o classifica como ruído, isto é, não é parte de nenhum dos clusters identificados.

Usando valores iniciais de eps=0.5 e min_part=3, obtivemos apenas 1 cluster ( # 0) e ruído (#-1).

DBSCAN, 11 variáveis, eps=0.5, min_part=3 -> 1 cluster, -visualização PCA 3D

3 — Clusterização baseada em distribuição

Nesta caso, parte-se da premissa que a distância dos pontos a um centro do cluster não seria uniforme e sim teria uma distribuição gaussiana, fazendo com que os clusters pudessem ter um formato elipsoide.

Expectation–Maximization (EM) Clustering using Gaussian Mixture Models (GMM)

Seu parâmetro principal é também o número K de clusters e utilizamos inicialmente o mesmo número de clusters indicado para o K-means.

Abaixo a representação visual dos clusters identificados em um gráfico com a dimensionalidade reduzida por PCA.

GMM, 11 variáveis, n_components=15 -> 15 clusters, -visualização PCA 3D

4 — Clusterização por conectividade ou hierárquico

Esta estratégia pode se dividir em aglomerativa ou divisiva. No caso da divisiva parte-se de um cluster único, composto por todos os objetos e iterativamente vão sendo divididos em clusters menores até que todos os pontos sejam um cluster com apenas um elemento.

Os aglomerativos fazem o caminho inverso e está descrito a seguir.

Agglomerative Hierarchical Clustering

Neste algoritmo, cada elemento começa como um cluster individual e, a cada iteração, vão se “aglomerando” em clusters maiores até chegar a um único cluster.

Os critérios de decisão de como os clusters se aglomeram podem ser associados aos pontos mais próximos ou mais distantes entre os clusters.

Considerando que o critério de aglomeração foi “ward” , que busca reduzir a variância entre os seus componentes, e o número de clusters o mesmo utilizado no K-means (15) obtivemos os seguintes clusters:

AHC, 11 variáveis, n_clusters=15, -> 15 clusters, -visualização PCA 3D

Comparando os clusters gerados

Como já foi dito, não sabemos previamente qual a quantidade correta de clusters e nem seus componentes. Para entendermos melhor o que cada algoritmo gerou, inicialmente fazemos uma comparação entre os clusters gerados e seus componentes por meio do Adjusted Rand Score Index que compara os componentes de um cluster com outro.

Nessa primeira iteração conseguimos identificar que os algoritmos K-Means, Gaussian Mixture Models (GMM) e Agglomerative Hierarchical Clustering (HC) classificaram como componentes dos mesmos clusters entre 35% a 46% dos parlamentares.

Mapa de calor — Adjusted Rand Score Index — comparando todos os algoritmos

A priori, isto não significa que estejam corretos. A exata composição dos clusters deve ser investigada por um processo de análise exploratória.

O processo iterativo com notebook

A identificação da quantidade de grupos e se os mesmos fazem sentido é parte de um processo interativo no qual avaliamos os clusters gerados em função dos atributos e parâmetros dos algoritmos.

Adicionalmente, após uma configuração de clusters identificada como “ideal”, é necessário realizar uma análise exploratória dos mesmos para avaliar se realmente fazem sentido em relação aos objetivos desejados.

Ao começarmos a ajustar o notebook para retirar e colocar variáveis, ajustes dos hiperparâmetros e visualização dos clusters gerados, percebemos que a manipulação do notebook começa a ficar lenta e desorganizada visto que começamos a comentar linhas e criar novas para colocar e retirar variáveis e guardar os ajustes feitos a cada iteração.

O Streamlit para seleção de variáveis e hiperparâmetros

Passamos então a utilizar o Streamlit, que nasceu da necessidade facilitar processos de análise/ajustes interativos em scripts de ciência de dados. Mais detalhes no artigo Turn Python Scripts into Beautiful ML Tools.

Um script utilizando Streamlit é executado sempre do início ao fim e é apresentado como uma aplicação web. Em um notebook já existente, é necessário ajustar para que as variáveis utilizadas estejam inicializadas com valores iniciais e possam ser alteradas por meio de combos de multi-seleção e seletores de valores contínuos, viabilizando o processo iterativo de ajustes e visualização dos resultados.

Definição das variáveis iniciais para análise em combo multi-seleção
Definição de seletores para dois hiperparâmetros do DBSCAN com valores iniciais
Resultado final do script de análise configurado com o Streamlit

Processo de identificação dos clusters

Com o processo iterativo facilitado pelo uso do Streamlit, passamos a iterar retirando as variáveis que pareciam não ter muita relação com o que desejávamos que fossem agrupados e as que não indicavam muita expressividade com o indicado na influência das variáveis nas dimensões do PCA. A variável VALOR_DESPESA_CONTRATADA é o quanto foi gasto na campanha do parlamentar e exercia forte influência em PC-1 e PC-2.

Relevância das variáveis originais nas dimensões PCA. Marcadas as variáveis que foram excluídas

Percebemos também que a variável ORGAO_TOTAL, somatório de ORGAO_PARTICIPANTE e ORGAO_GESTOR, mascarava a diferença entre apenas participar de um órgão ou comissão e gerir os órgãos ou comissões. Retiramos tambem o PERC_VOTOS_PARL_EST, que era o percentual de votos recebido pelo parlamentar, que tinha forte poder de alterar o PC-3 e não tinha uma relação direta com a atividade parlamentar.

Relevância das variáveis originais nas dimensões PCA. Marcadas as variáveis que foram excluídas

Ficamos então com um conjunto de variáveis que trazia grande expressividade nas dimensões PCA e eram diretamente associadas à atividade parlamentar.

Relevância das variáveis originais nas dimensões PCA. Variáveis escolhidas

Com este conjunto de variáveis, a análise de inércia do algoritmo K-Means indicou de 5 a 6 clusters como os valores indicativos de estabilidade de cluster.

Ao testarmos com 5 clusters, verificamos a existência de um cluster pequeno que se destacava dos demais na dimensão PC-1 como positivo, contrariando o peso negativo de todas as variáveis do componente PC-1.

Cluster com positividade na dimensão PC-1

Identificamos também um outro cluster que tinha grande positividade no componente PC-2, alinhado positivamente com as variáveis ORGAO_PARTICIPANTE e ORGAO_GESTOR.

Cluser com positividade na dimensão PC-2

Esses dois clusters, de certa forma extremos, pareciam se repetir no GMM e no AHC de forma consistente.

Ajustamos os hiperparâmetros do DBSCAN para que ele achasse 5 clusters mas um dos clusters extremos ele identificou como ruído.

Comparando os resultados dos diversos algoritmos por meio do Adjusted Rand Score Index, obtivemos uma forte similaridade entre os clusters gerados pelo K-Means, GMM, AHC e DBSCAN. No caso do DBSCAN, os classificados como ruído foram considerados como um cluster na comparação.

Mapa de calor comparando ARI de todos os algoritmos

Decidimos então utilizar esta configuração de variáveis e avaliar o resultado por meio de uma análise exploratória.

Na análise exploratória identificamos que os dois clusters que nos chamaram atenção eram os mais extremos em termos de atividade parlamentar: a) Primeiro cluster formado em boa parte por parlamentares que foram eleitos mas faleceram ou não exercem mais o mandato; b) Segundo cluster formado pelos parlamentares que mais se destacam nas métricas que utilizamos para definir os perfis de atuação parlamentar.

As conclusões da análise destes e dos demais clusters identificados encontra-se no artigo Qual é o perfil do seu candidato?.

Conclusões

A identificação de grupos por meio de algoritmos de clusterização é um processo eminentemente iterativo, onde além das variáveis a serem utilizadas pelos algoritmos, o ajuste dos diversos hiperparâmetros deve ser feito de forma sistemática e ordenada.

O uso do Streamlit, que não requer grande curva de aprendizado, permite que o processo iterativo seja feito de forma rápida, simples e facilmente reproduzível, tornando todo o processo de análise mais consistente.

--

--