Desenvolvimento

17 nov, 2016

Qual algoritmo de clustering eu uso?

Publicidade

A pergunta do título deste artigo é uma das que mais ouço quando estou ensinando machine learning para quem está começando na área. Hoje vou tentar responder e ajudar quem possui dúvidas sobre o que utilizar para agrupar dados.

Como muitas perguntas de área da computação, a resposta começa com um sonoro “depende…”. O motivo pelo qual as coisas são assim é que existem diversos fatores por trás desta simples pergunta que precisam ser conhecidos antes da elaboração de uma resposta adequada.

Os algoritmos de agrupamento, também conhecidos como clustering, fazem parte do que é conhecido como aprendizado de máquina não supervisionado. Isto quer dizer que, a partir de dados “gerais” e sem nenhuma “anotação”, é possível descobrir alguns padrões e criar um modelo que, na prática, vai ser utilizado para classificar um novo conjunto de dados quando ele surgir. Tudo isso é bem explicado com teoria e prática no meu curso de introdução ao machine learning com Python.

Uma coisa que poucas pessoas sabem é que os algoritmos de aprendizado não supervisionado empregados no machine learning são, na minha opinião, estranhos. Esta estranheza se deve ao fato que é preciso uma boa dose de interpretação do que é gerado pelos algoritmos, especialmente quando falamos sobre clustering. E esta interpretação requer conhecimento dos dados, do negócio e também de detalhes técnicos dos algoritmos.

Por exemplo, vamos supor que desejamos classificar clientes em grupos. Os algoritmos de clustering vão analisar os dados e gerar regras internas para dizer se um cliente X pertence a um grupo A, B ou qualquer que seja.

Entretanto, nem sempre podemos apresentar uma descrição significativa e representativa do grupo A ou B, pois mesmo tendo acesso a definição das regras que colocam ou não um dado no grupo, fica complicado caracterizá-lo. Às vezes, fica fácil dizer algo como “este é o grupo do clientes AAA” ou “esta imagem é mais parecida com as imagens que possuem gatos”. Não obstante, quando falamos em conjuntos de dados com muitos atributos, fica complicado atribuir significado aos grupos, que também são chamados de clusters. Esta é uma característica dos algoritmos não supervisionados de clustering: como os padrões são detectados automaticamente nem sempre podemos facilmente explicar o que foi gerado.

Contudo, esta dificuldade de explicar os grupos gerados nem é a maior dúvida de quem está querendo decidir por um ou outro algoritmo de clustering. Em geral, a dúvida tem como objetivo escolher o algoritmo que gere o menor erro de classificação, ou seja, a melhor acurácia. Porém, nem sempre isso faz muito sentido.

Por exemplo: é comum aprender logo de cara o algoritmo clássico k-means para classificação. Este algoritmo requer, por definição, o número de clusters que se deseja utilizar para classificar a amostra. Durante minhas aulas, noto que os alunos têm dificuldade para compreender qual é o número de clusters e também outros parâmetros como, por exemplo, detalhes internos do algoritmo.

Isso fica um pouco claro mais quando observamos a imagem abaixo: ela mostra as formas de classificar três conjunto de dados (representados por pontos) utilizando diferentes algoritmos de clustering. A referência é a biblioteca scikit-learn do Python.

figura2_clustering

Ok, mas #comofaz para escolher o algoritmo de clustering?

Bem, o que posso sugerir em primeiro lugar é conhecer muito bem as opções. Saber quais são os parâmetros necessários para o algoritmo, onde ele é tipicamente utilizado e o que é possível se obter com ele ajuda muito. Por exemplo: saber que o algoritmo DBSCAN requer um número que representa de distância entre os centroides do cluster ajuda a saber se ele deve ser empregado ou não. Na prática este algoritmo é muito utilizado em cenários de visão computacional, pois a distância dos centroides neste contexto é muito importante.

Certo, então, além de conhecer como funcionam os algoritmos de clustering, seus parâmetros e alguns exemplos de uso, estou pronto para fazer a minha escolha? Infelizmente ainda não, pequeno gafanhoto!

Para complementar o conhecimento necessário para escolher o algoritmo, eu sugiro ainda explorar um pouco os dados com gráficos para se obter mais detalhes sobre eles visualmente. Além disso, também é importante levar em consideração como os algoritmos vão gastar os recursos computacionais (CPU, disco e memória) com base no tamanho dos dados que vão ser analisados. Também vale a pena se informar sobre opções de paralelismo e suporte dos algoritmos, ou seja, como eles são implementados em diversas ferramentas de machine learning.

Por fim, sempre que existe o uso de algoritmos de classificação não supervisionada para clustering é preciso gastar um bom tempo para analisar o impacto na quantidade de clusters versus a variação da amostra. Obviamente, isso é impactado por algum tipo de tratamento nas features, especialmente quando se utiliza técnicas de redução como PCA e remoção de outliers (também chamados de valores aberrantes).

Sendo assim, não é fácil responder a pergunta título deste artigo. Contudo, com uma boa exploração dos pontos citados já é possível não só ter uma base para iniciar uma fase de testes de diversos algoritmos, mas também conhecer um pouco mais sobre o que é possível obter como resultado utilizando algoritmos não supervisionados de clustering.