Seu primeiro projeto de Machine Learning! (usando Python)
Agrupamento de Dados com Python. Seu primeiro projeto de Machine Learning!
Autor: Gabriel Murilo
Um dos projetos mais conhecidos para quem está começando a estudar Machine Learning é o Agrupamento de Dados (K-means ou clusterização)
Clustering é uma técnica de Machine Learning que envolve o agrupamento de pontos de dados. Em teoria, os pontos de dados que estão no mesmo grupo devem ter propriedades e/ou recursos semelhantes, enquanto os pontos de dados em grupos diferentes devem ter propriedades e/ou recursos altamente diferentes. (https://towardsdatascience.com/the5-clustering-algorithms-data-scientists-need-to-knowa36d136ef68)
Algoritmo K-means
O algoritmo K-means é uma técnica popular de aprendizado de máquina não supervisionado que permite agrupar dados sem a necessidade de rótulos prévios. Ele busca identificar padrões e estruturas nos dados, dividindo-os em clusters.
Passo 1: Inicialização dos Centróides:
No início do algoritmo, são escolhidos aleatoriamente "k" centróides, onde "k" é o número de clusters definido pelo usuário. Esses centróides são pontos representativos dos clusters.
Passo 2: Atribuição dos Pontos aos Clusters:
Em seguida, cada ponto de dados é atribuído ao centróide mais próximo com base na distância euclidiana entre eles. Isso é feito iterativamente para todos os pontos do conjunto de dados.
Passo 3: Atualização dos Centróides:
Após a atribuição inicial, os centróides são atualizados recalculando-se suas posições. Os novos centróides são determinados como a média dos pontos atribuídos a cada cluster.
Passo 4: Iteração até a Convergência:
O processo de atribuição e atualização é repetido iterativamente até que ocorra a convergência, ou seja, quando não há mais alterações significativas nos centróides ou quando um número máximo de iterações é alcançado.
E agora... mão na massa!
Importanto as libs necessárias:
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns
Estamos importando as bibliotecas necessárias para executar o código, incluindo o numpy para manipulação de dados, make_blobs para criar um conjunto de dados sintéticos, KMeans para o algoritmo de K-means, e matplotlib e seaborn para visualização.
Criação do conjunto de dados:
X, y = make_blobs(
n_samples=200,
n_features=2,
centers=3,
cluster_std=0.5,
random_state=0
)
Nessa parte, estamos criando um conjunto de dados sintéticos usando a função make_blobs. Estamos especificando o número de amostras, número de características, número de centros (clusters), desvio padrão dos clusters e uma semente aleatória.
Podemos visualizar os dados da seguinte forma:
plt.scatter(
X[:, 0], X[:, 1],
c='white',
edgecolor='black'
)
Inicialização e treinamento do modelo Kmeans:
kmeans = KMeans(
n_clusters=3, init='random',
n_init=1, max_iter=4,
tol=1e-04, random_state=2
)
Aqui estamos inicializando o modelo K-means. Estamos especificando o número de clusters, o método de inicialização dos centróides, o número de tentativas, o número máximo de iterações, a tolerância para a convergência e a semente aleatória.
y_km = kmeans.fit_predict(X)
y_km
E aqui estamos treinando o modelo K-means usando o conjunto de dados e, em seguida, obtendo as previsões dos clusters para cada amostra.
Podemos ver:
array([1, 2, 2, 1, 2, 1, 0, 0, 2, 1, 2, 1, 2, 2, 2, 1, 0, 0, 2, 1, 1, 0,
2, 2, 1, 2, 0, 1, 1, 1, 2, 2, 1, 2, 0, 0, 2, 0, 0, 1, 0, 1, 1, 1,
2, 2, 2, 1, 2, 2, 2, 0, 1, 1, 1, 1, 0, 0, 2, 2, 1, 1, 2, 0, 0, 1,
0, 0, 1, 0, 0, 2, 2, 1, 2, 1, 0, 0, 0, 1, 1, 2, 2, 0, 0, 2, 2, 1,
2, 0, 1, 1, 0, 2, 0, 2, 2, 1, 1, 0, 0, 2, 1, 2, 1, 2, 0, 2, 2, 0,
2, 1, 0, 1, 2, 2, 2, 0, 1, 1, 0, 0, 1, 2, 0, 2, 1, 0, 1, 2, 1, 0,
0, 0, 2, 0, 0, 2, 0, 1, 1, 1, 2, 0, 0, 2, 1, 1, 0, 2, 0, 1, 1, 1,
2, 0, 0, 0, 2, 2, 1, 1, 1, 1, 2, 2, 0, 1, 0, 0, 2, 0, 2, 0, 1, 1,
2, 1, 2, 0, 2, 1, 0, 0, 0, 2, 1, 0, 2, 2, 1, 1, 0, 0, 0, 0, 1, 0,
2, 0], dtype=int32)
Plotando o resultado:
plt.scatter(
X[y_km == 0, 0], X[y_km == 0, 1],
s=50, c='lightgreen',
marker='s', edgecolor='black',
label='cluster 1'
)
plt.scatter(
X[y_km == 1, 0], X[y_km == 1, 1],
s=50, c='orange',
marker='o', edgecolor='black',
label='cluster 2'
)
plt.scatter(
X[y_km == 2, 0], X[y_km == 2, 1],
s=50, c='lightblue',
marker='v', edgecolor='black',
label='cluster 3'
)
# plotando os centroides
plt.scatter(
kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
s=250, marker='*',
c='red', edgecolor='black',
label='centroids'
)
plt.legend(scatterpoints=1)
Nesta parte, estamos plotando os clusters finais, cada um com uma cor e marcador específico. Também estamos plotando os centróides dos clusters como estrelas vermelhas. Por fim, exibimos o gráfico completo.
Bom...
Você fez seu primeiro projeto de Machine Learning usando Python! . . . Agora só falta fazer o próximo ChatGPT... hahahahah
Achei muito legal essa sua abordagem do problema! Muitos aqui viram isso na faculdade (no meu caso cursando Física) de uma forma bem corrida e muitas vezes desorganizada. Lembro que o que eu aprendi sobre foi bem por fora da faculdade haha. Vou estar recomendando seu post para alguns calouros que possuem interesse em ML!
Fala aí Ga0512
,
Muito bom que você esteja trazendo posts de Ciência de Dados.
Sugeriria somente que comentasse as premissas (Rodar algumas vezes,etc.), limitações (dados circulares, etc.) e avaliações desse modelo (Silhouete, Elbow).
Acho que ajudaria pro pessoal entender melhor qual modelo escolher.