Escrito por Rafael Kehl,

6 minutos de leitura

Obtendo insights com Machine Learning

Vamos implementar o k-means, um algoritmo de aprendizado não-supervisionado que pode te ajudar a organizar seus dados para obter insights!

Compartilhe este post:

Nós, humanos, possuímos a habilidade única de separar, organizar e obter significado de informações que são dadas para nós. Hoje em dia, porém, o volume de informação com o qual temos de lidar aumentou muito, fazendo com que as tarefas de separar e organizar as informações se tornem trabalhos hercúleos, quase impossíveis! É aí que entram os algoritmos de aprendizado não-supervisionado, que recebem um conjunto de dados e procuram agrupar, ou clusterizar, as entradas através de alguma medida de similaridade.

 

Preparando o ambiente

Se você está me acompanhando por aqui, você já sabe o que é Machine Learning e, quem sabe, já até implementou seu primeiro modelo de Machine Learning, mas se você chegou agora não tem problema! Tudo que você precisa pra me acompanhar é vontade de aprender e, é claro, o Octave. Você pode baixar o Octave por aqui, e tem até um tutorial em inglês de como fazer a instalação para quem é usuário Windows.

Eu falei um pouco mais sobre o Octave e o porquê de eu ter escolhido ele para implementar meus primeiros modelos de machine learning no meu outro post. Em resumo, o Octave é um software matemático que já possui nele todas as ferramentas necessárias para realizarmos a implementação, sem a necessidade de instalar nada a mais. Python é, provavelmente, a linguagem mais utilizada para machine learning no mercado, por isso eu encorajo você a pesquisar um pouco mais sobre ela!

 

O que é o k-means?

O k-means, ou k-médias, é um algoritmo de aprendizado não-supervisionado que agrupa os dados de um conjunto por proximidade. Ele recebe como input os dados e a posição inicial de k pontos, que serão nossas médias. Cada dado do nosso conjunto é, então, agrupado com o ponto mais próximo. Por fim, a posição média, ou central, desse cluster recém formado é calculada e o ponto que define esse conjunto é movido para essa posição. Os clusteres são recalculados e o processo se repete até que não haja mais mudança, quando dizemos que o método convergiu.

Um algoritmo k-means sendo treinado, onde k=5. Os pontos sólidos são os pontos de input.

 

Esse é um dos algoritmos mais simples de aprendizado não-supervisionado, que é altamente dependente da escala dos dados que estão sendo comparados e, também, da forma como vamos calcular a distância entre os pontos. Por isso, vamos ver passo a passo como precisamos tratar os dados para que tenhamos bons resultados!

 

Escolhendo o problema

Um conjunto de dados, ou dataset, muito conhecido e muito versátil é o California Housing Prices, do usuário Cam Nugent, do Kaggle, que contém informações do censo de 1990 da Califórnina sobre as casas da região. Dentre essas informações, temos a latitude, longitude e renda mediana das casas naquele bloco.

O dataset escolhido para aplicarmos nosso algortimo!

 

Olhando para as mais de 20 mil entradas do dataset fica difícil tentar obter algum insight sobre localização das casas e a renda mediana dos seus residentes, informação que possa ser importante para campanhas publicitárias do governo, para ações de saúde pública, ou de empresas que quer atingir de maneira mais efetiva as diferentes camadas socioeconômicas de uma região, por exemplo. É aí que entra o k-means, que pode organizar os dados não só por proximidade geográfica como, também, pela renda mediana da região!

Mapa das fronteiras da Califórnia em 1990, ao lado do output gerado pelo dataset.

 

Implementando o modelo

Como sempre, o primeiro passo é a preparação dos dados. Para isso, vamos importar o dataset, remover o cabeçalho e normalizar os dados, pois esse algoritmo é extremamente sensível a diferenças de escala entre as variáveis. Para tal, usamos os seguintes comandos:

dataset = csvread('./data/housing.csv');
dataset(1,:) = [];
data = [dataset(:,1) dataset(:,2) dataset(:,8)];
maxLon = max(data(:,1));
data(:,1) = data(:,1)/maxLon;
maxLat = max(data(:,2));
data(:,2) = data(:,2)/maxLat;
maxIncome = max(data(:,3));
data(:,3) = data(:,3)/maxIncome

 

Se usarmos a função scatter para visualizar as duas primeiras colunas dos dados nós obteríamos o mapa da seção anterior. Note que nosso dataset possui 3 colunas e, portanto, podemos fazer um scatter3, que vai distribuir os pontos em um gráfico tridimensional, para que possamos visualizar a latitude, longitude e renda mediana em um único lugar!

Visualização tridimensional do nosso dataset. Ainda uma bagunça, não acha?

 

Para implementar o k-means, vamos precisar de algumas funções primeiro. A primeira delas é para pegar k entradas aleatórias do nosso conjunto como ponto de partida do nosso algoritmo. Essa função não é necessária, mas facilita se o valor de k é muito grande.

 

A próxima função é a nossa métrica, que vamos usar para calcular a distância entre cada entrada do conjunto e cada um dos k pontos, que vamos chamar de índice. Por fim, essa função vai salvar o índice mais próximo de cada entrada do nosso dataset.

 

A última função que vamos usar no nosso k-means é aquela que vai, a cada passo, atualizar o valor de cada índice, nossos k pontos, para colocá-lo no centro do conjunto de entradas mais próximas a ele. Esse conjunto de entradas próximas é o que obtemos usando a função anterior. Podemos dizer que a função anterior e essa, em conjunto, são o coração do método, toda a mágica acontece nelas!

 

Finalmente, vamos à função principal, que vai executar o método até sua convergência e retornar para nós cada uma das entradas e o seu grupo. Note que temos uma variável eps com um valor bem pequeno, ela é a tolerância do erro na diferença entre duas iterações para considerar que os pontos são iguais. Isso é necessário por causa da forma como o computador representa números reais, os números de ponto flutuante.

 

Essa função vai retornar o histórico dos índices que foram atribuídos para cada entrada a cada passo e, também, a evolução de cada um dos k pontos. Além disso, por conveniência, a função retorna a atribuição final dos índices, que vamos usar para exibir nosso resultado!

Resultado do algoritmo para k=3, em diferentes ângulos.

 

Ao executar o algoritmo com k igual a três nós obtemos o resultado acima. Vemos que o k-means, nessa execução, agrupou as casas principalmente pela renda mediana. Um insight que podemos obter em primeira vista é de que a renda mediana na região próxima ao oceano é, em geral, maior do que nas demais regiões. Uma explicação para esse fenômeno é que as grandes metrópoles da Califórnia são cidades costeiras!

O poder do agrupamento está em usá-lo juntamente com outros métodos de machine learning. Poderíamos usar os grupos gerados pelo k-means nesse exemplo para criar um modelo de regressão linear para o preço das casas em cada um dos grupos socioeconômicos e avaliar o impacto do financiamento dessa residência na renda mediana dessa população. Poderíamos também fazer agrupamentos somente na latitude e longitude para, na sequência, avaliarmos a renda em cada região. O céu é o limite!

 


 

Espero que tenham gostado dessa implementação o tanto quanto eu gostei de fazê-la! Vocês podem ir lá no meu GitHub conferir o código completo para que possam gerar esses resultados vocês mesmos e, até mesmo, brincar um pouco com o algoritmo. Se vocês fizerem algo legal com algum insight produzido por esse algoritmo, me contem!

Também não posso deixar de exaltar o curso de machine learning de Andrew Ng, que ensina tudo que você precisa para criar e analisar seus próprios modelos. Até mais, pessoal!

Compartilhe este post: