print(generos.columns) print(modelo.cluster_centers_)
- grupos = pd.DataFrame(modelo.cluster_centers_, columns=generos.columns)
--> ValueError: Shape of passed values is (3, 2), indices imply (3, 20)
CÓDIGO COMPLETO:
# CONHECENDO OS DADOS
import pandas as pd
uri_filmes = 'https://raw.githubusercontent.com/oyurimatheus/clusterirng/master/movies/movies.csv'
filmes = pd.read_csv(uri_filmes)
filmes.columns = ['filme_id', 'titulo', 'generos']
filmes.head()
generos = filmes.generos.str.get_dummies()
dados_dos_filmes = pd.concat([filmes, generos], axis=1)
dados_dos_filmes.head()
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
generos_escalados = scaler.fit_transform(generos)
generos_escalados
# CLUSTERIZANDO(AGRUPANDO) OS RESULTADOS COM K-Mean
from sklearn.cluster import KMeans
modelo = KMeans(n_clusters=3)
modelo.fit(generos_escalados)
print(f'Grupos {modelo.labels_}')
# VISUALIZANDO CENTROIDES
from sklearn.datasets import make_blobs
dados, _ = make_blobs(n_samples=1000, n_features=2, random_state=7)
dados = pd.DataFrame(dados, columns=['coluna1', 'coluna2'])
dados.head()
# Exibição do Resultado ---->>>
import matplotlib.pyplot as plt
plt.scatter(x=dados.coluna1, y=dados.coluna2)
# Exibição do Resultado ---->>>
modelo = KMeans(n_clusters=3)
grupos = modelo.fit_predict(dados)
plt.scatter(x=dados.coluna1, y=dados.coluna2, c=grupos, cmap='viridis')
# Exibição do Resultado ---->>>
centroides = modelo.cluster_centers_
plt.scatter(dados.coluna1, dados.coluna2, c=grupos, cmap='viridis')
plt.scatter(centroides[:, 0], centroides[:, 1], marker='X', s=169, linewidths=5, color='g', zorder=8)
# Exibição do Resultado ---->>>
# VISUALIZANDO GRAFICO DE DISPERSÃO E REDUÇÃO DE DIMENSÃO
# Vamos começar visualizando os centróides de cada grupo. Para isso, podemos falar para o Python imprimir os centróides e os nomes dos gêneros - que são as colunas do data frame generos:
print(generos.columns)
print(modelo.cluster_centers_)
# Para facilitar o trabalho e a manipulação desses dados,
# vamos criar um data frame chamado grupos a partir dos centroides.
# Portanto, falamos para o pandas (pd) criar um DataFrame a partir dos centroides e
# nomear as colunas (columns) com o nome dos gêneros:
grupos = pd.DataFrame(modelo.cluster_centers_, columns=generos.columns)
# Podemos ver o data frame colocando a variável grupos como a última instrução da célula.
# Vamos visualizar os centroides transpondo(transpose) o data frame de grupos e pedindo para o pandas plotar(plot)
# um gráfico de barras (bar).
# Como queremos que cada cluster tenha seu próprio gráfico, vamos falar que teremos subplots e para facilitar a visualização,
# vamos definir um tamanho para a figura (figsize) e dizer que não queremos compartilhar os labels do eixo x:
grupos.transpose().plot.bar(subplots=True,
figsize=(25, 25),
sharex=False)
# Podemos visualizar os filmes pertencentes a algum grupo, por exemplo o grupo 0.
# Basta realizar um filtro pelos labels_ do modelo e pedir alguns dados da amostra:
grupo = 0
filtro = modelo.labels_ == grupo
dados_dos_filmes[filtro].sample(10)
# Vamos plotar um gráfico de pontos. Porém, temos 20 gêneros, ou seja, 20 dimensões.
# Logo, antes de plotar o gráfico, temos que reduzir as dimensões.
# Para isso, vamos utilizar o algoritmo TNSE do módulo manifold da sklearn.
from sklearn.manifold import TSNE
# A partir desse algoritmo podemos criar um objeto TSNE e utilizar o método fit_transform.
# Este método nos retorna um array do numpy com as features reduzidas.
tsne = TSNE()
visualizacao = tsne.fit_transform(generos_escalados)
# Agora basta importamos o seaborn e plotarmos um gráfico de dispersão (scatterplot).
# Mas antes, vamos atribuir um valor para o tamanho da figura (figure.figsize), apenas para facilitar a visualização:
import seaborn as sns
sns.set(rc={'figure.figsize': (13, 13)})
sns.scatterplot(x=visualizacao[:, 0],
y=visualizacao[:, 1],
hue=modelo.labels_,
palette=sns.color_palette('Set1', 3))