Skip to content

Projeto de machine learning, desenvolvendo um modelo básico de clusterização com um dataset de vinhos

Notifications You must be signed in to change notification settings

rfprates/clustering_wines_dataset

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Clusterização com KMeans em dataset de vinhos

Objetivo do projeto

O presente projeto tem como objetivo aplicar em um dataset de vinhos algoritmos de Clusterização, mais especificamente o modelo de machine learning KMeans. Desta forma, pretende-se classificar os vinhos em grupos heterogêneos entre si de acordo com algumas características das composições químicas de cada amostra.

Bibliotecas utilizadas

Segue uma lista com as bibliotecas em Python utilizadas no desenvolvimento e resolução do case.

  • pandas
  • numpy
  • matplotlib
  • sklearn
  • yellowbrick

Deployment

Este projeto foi todo desenvolvido utilizando o VS CODE. Portanto, se torna necessário a instalação deste ou de algum outro interpretador de código para o seu correto funcionamento. Em seguida, foram instaladas as extensões do Python e Jupyter Notebook dentro do VS CODE.

OBS: Versão do Python utilizada no projeto = 3.11.5

Instalação das bibliotecas utilizadas

Feita as instalações dos requisitos base acima, agora é necessário instalar as bibliotecas, listadas no arquivo 'requirements.txt', que foram utilizadas no desenvolvimento do projeto. Para isso, executa-se no terminal do VS CODE, o comando abaixo.

pip install -r requirements.txt

Instaladas tais bibliotecas dentro do ambiente, agora pode-se rodar as linhas de código presentes no arquivos notebooks 'cluster_wines.ipynb'. Neste notebook estão todos os códigos desenvolvidos para a resolução deste projeto, desde as análises descritivas e estatísticas até a modelagem.

Análise dos dados

Para avaliar a distribuição dos dados de cada uma das colunas presentes no dataset, plotou-se um gráfico do tipo Boxplot. Com este gráfico, é possível observar a mediana, quartis e principalmente a possível presença de outliers. Isto último tópico é muito importante para o modelo de KMeans a ser utilizado posteriormente, visto que este tipo de modelo é sensível a outliers.

  • Gráfico Boxplot das colunas com os dados originais:

output_box2

Percebe-se que os dados estão, na sua maior parte, "comprimidos" ou "achatados" no gráfico. Isto acontece pois existem colunas com escalas numéricas muito diferentes entre si. Este também é um problema ao rodar o modelo de KMeans, visto que, para o seu correto funcionamento, os dados numéricos precisam estar na mesma escala. Assim, para corrigir isso aplicou-se a função scale() da biblioteca scikit-learn importada anteriormente. Esta função irá transformar os dados de todas as colunas de tal modo a convertê-los para valores onde distribuição dos dados por coluna terá média igual a zero e desvio padrão igual a 1. Este processo é demonstrado a seguir,

  • Gráfico Boxplot das colunas com os dados escalonados:

output_box3

Avaliando-se o resultado acima, agora fica evidente a presença de outliers neste dataset, representados pelos círculos no gráfico. Afim de identificá-los de forma mais exata, utilizou-se do padrão Z-score, onde |Z-score| > 3.

Feitos os devidos cálculos, identificou-se um total de 10 linhas no dataset com presença de outliers. Como são poucas linhas, optou-se por excluí-los da análise.

Modelling

Feito o tratamento dos dados numéricos e excluídos os outliers, agora é possível partir para a parte de desenvolvimento do modelo.

Determinando o valor de K

Como não se sabe ao certo a quantidade de clusters em que se deseja dividir o dataset, é possível utilizar o chamado "Método do Cotovelo", no qual, utilizando a função kelbow_visualizer, da biblioteca yellowbrick importada anteriormente, temos um gráfico da variância em função do número de clusters. Com isto, é possível definir o ponto ótimo para o valor de k.

  • Gráfico da variância em função da quantidade de clusters:

output_kelbow_visualizer

Analisando o gráfico acima, temos que o ponto ótimo se da com um valor de K = 4. É possível concluir isto pois, para valores maiores que 4, o score de variância dos dados diminui de forma não abrupta, se comparado a valores de K menores que 4, onde a redução da variância se da de forma mais drástica com o aumento gradual de clusters.

Outro fator importante é a interpretabilidade dos clusters. Quanto maior o valor de K, mais clusters, ou seja, em mais grupos serão divididos os dados. Avaliando do ponto de vista de negócio, isto pode ser ruim pois muitos grupos dificultam a própria interpretação das diferenças entre eles, ficando mais difícil também classificá-los e analisa-los.

Interpretando os clusters

Definido o número de clusters, treinou-se o modelo definitivo de KMeans. Após isto, analisou-se os resultados de cada cluster obtido.

  • Gráfico de barras de cada uma das características dos vinhos para cada cluster calculado pelo modelo KMeans:

output_cluster_graph_results

Avaliando-se os resultados dos gráficos acima, percebe-se que o "Cluster 1" é o grupo que apresenta os vinhos com maiores índices em "malic_acid" e "color_intensity", mas com índices baixíssimos em "flavanoids" por exemplo. Já o "Cluster 2" tem índices altos em "alcohol" e "proline". O "Cluster 3" se caracteriza como o grupo com menor teor de "alcohol" e "proline", enquanto que o "Cluster 4" tem os valores mais elevados em "alcalinity_of_ash" e "proanthocyanins". Esta é uma das formas de avaliar as diferenças nas características detectadas pelo modelo para cada cluster definido.

Outra forma de interpretar os resultados da clusterização seria agrupar os dados originais (desconsiderando os outliers) por cluster. Assim, pode-se utilizar funções de agregação em cada uma das características (média, mediana, mínimo, máximo, etc.).

  • Tabela com valores médios de cada característica para cada cluster:
cluster 0 1 2 3
alcohol 12.212000 13.778214 13.119592 12.364211
malic_acid 1.896000 1.983929 3.380204 1.831316
ash 2.418800 2.451250 2.420000 2.150263
alcalinity_of_ash 21.656000 16.914286 21.255102 19.015789
magnesium 92.760000 106.232143 98.653061 91.921053
total_phenols 1.902800 2.855357 1.654286 2.460526
flavanoids 1.663600 3.000179 0.796735 2.344474
nonflavanoid_phenols 0.460800 0.286429 0.448776 0.299474
proanthocyanins 1.308000 1.912679 1.124898 1.736842
color_intensity 2.940000 5.616607 7.147347 3.193684
hue 1.049040 1.063036 0.688571 1.060789
od280/od315_of_diluted_wines 2.502400 3.168214 1.693469 2.980789
proline 524.040000 1130.303571 621.673469 516.394737

Na tabela acima, quanto mais escura a cor, mais elevado o valor. Pornto, avaliando tais resultados com a média das características em cada cluster calculado pelo algoritmo KMeans, percebe-se que o cluster 1 é o cluster que apresenta, o maior índice em "proline" e "alcohol". Enquanto que o cluster 2 tem em média o índice de "color_intesity" mais elevado se comparado aos demais clusters. Outro ponto interessante é que todos os clusters apresentam o índice "hue" em torno de 1, exceto o cluster 2, com 0.68. Isto também é uma característica que pode diferenciar este grupo dos demais.

Por último, exibiu-se o gráfico da métrica de Silhoueta "silhouette_score".

  • Gráfico de "silhouette_score":

output_score_visualizer

Avaliando o todo, tem-se um "silhouette_score" médio de mais ou menos 0.25. A métrica está positiva, o que é um bom sinal, pois isto nos diz que os pontos de um mesmo cluster definido pelo modelo estão mais próximos entre si do que dos pontos de outro cluster. Contudo não estão tão próximos assim, visto que o valor do silhouette está consideravelmente distante de 1 (lembrando que o valor máximo de silhouette_score é 1). Quanto mais próximo 1, quer dizer que mais próximos estão os pontos de um mesmo cluster e mais distantes eles estão dos outros clusters, o que demonstra uma homogeneidade marcante dentre as características do cluster e uma heterogeneidade clara se comparada aos demais grupos definidos.

Por fim, os grupos que apresentam melhor métrica de "silhouette" foram os clusters 0 e 3, com valores próximos a 0.45. Portanto são este grupos os mais homogêneos entre os pontos dentro deles e mais heterogêneos se comparados aos demais. Enquanto que o grupo com silhouette mais baixo foi o cluster 1, com valores mais próximos de 0.2.

About

Projeto de machine learning, desenvolvendo um modelo básico de clusterização com um dataset de vinhos

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published